From c9ca844e7f6cc2075d9d55afd942528fb74e1142 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Thu, 22 Jun 2023 21:57:47 +0800 Subject: [PATCH 01/73] Update Makefile --- xtables-addons/Makefile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/xtables-addons/Makefile b/xtables-addons/Makefile index cba09357d..cb678ac9c 100755 --- a/xtables-addons/Makefile +++ b/xtables-addons/Makefile @@ -1,26 +1,26 @@ +# SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2009-2013 OpenWrt.org # -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=xtables-addons -PKG_VERSION:=3.22 -PKG_RELEASE:=$(AUTORELEASE) -PKG_HASH:=faa16a27166275afbfe8df605f55c3a81ac693bf19da674d45ceded4137ae217 +PKG_VERSION:=3.24 +PKG_RELEASE:=1 +PKG_HASH:=3e823f71720519ced31c4c7d2bfaf7120d9c01c59a0843dfcbe93c95c64d81c1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://inai.de/files/xtables-addons/ PKG_BUILD_DEPENDS:=iptables + PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 PKG_MAINTAINER:=Jo-Philipp Wich PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:=COPYING PKG_FIXUP:=autoreconf PKG_ASLR_PIE:=0 @@ -162,7 +162,7 @@ define Package/iptgeoip/install $(1)/usr/lib/xtables-addons/ $(INSTALL_DIR) $(1)/usr/bin $(CP) \ - $(PKG_INSTALL_DIR)/usr/bin/xt_geoip_fetch \ + $(PKG_INSTALL_DIR)/usr/bin/xt_geoip_query \ $(1)/usr/bin/ $(INSTALL_DIR) $(1)/usr/share/xt_geoip touch $(1)/usr/share/xt_geoip/.keep From 816f19640e279794b9d8b4595714d25e6af2c014 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Thu, 22 Jun 2023 22:35:46 +0800 Subject: [PATCH 02/73] fix xtables --- frp/files/frpc.init | 0 frp/files/frpc.uci-defaults | 0 frp/files/frps.config | 0 frp/files/frps.init | 0 frp/test.sh | 0 xtables-addons/Makefile | 0 .../001-fix-kernel-version-detection.patch | 4 +- .../patches/100-add-rtsp-conntrack.patch | 4 +- .../patches/200-add-lua-packetscript.patch | 56 ++-- .../patches/201-fix-lua-packetscript.patch | 11 + ...-packetscript-kernel-5.16-no-isystem.patch | 284 ------------------ .../patches/210-freebsd-build-fix.patch | 0 12 files changed, 48 insertions(+), 311 deletions(-) mode change 100755 => 100644 frp/files/frpc.init mode change 100755 => 100644 frp/files/frpc.uci-defaults mode change 100755 => 100644 frp/files/frps.config mode change 100755 => 100644 frp/files/frps.init mode change 100755 => 100644 frp/test.sh mode change 100755 => 100644 xtables-addons/Makefile mode change 100755 => 100644 xtables-addons/patches/001-fix-kernel-version-detection.patch mode change 100755 => 100644 xtables-addons/patches/100-add-rtsp-conntrack.patch mode change 100755 => 100644 xtables-addons/patches/200-add-lua-packetscript.patch mode change 100755 => 100644 xtables-addons/patches/201-fix-lua-packetscript.patch delete mode 100755 xtables-addons/patches/202-fix-lua-packetscript-kernel-5.16-no-isystem.patch mode change 100755 => 100644 xtables-addons/patches/210-freebsd-build-fix.patch diff --git a/frp/files/frpc.init b/frp/files/frpc.init old mode 100755 new mode 100644 diff --git a/frp/files/frpc.uci-defaults b/frp/files/frpc.uci-defaults old mode 100755 new mode 100644 diff --git a/frp/files/frps.config b/frp/files/frps.config old mode 100755 new mode 100644 diff --git a/frp/files/frps.init b/frp/files/frps.init old mode 100755 new mode 100644 diff --git a/frp/test.sh b/frp/test.sh old mode 100755 new mode 100644 diff --git a/xtables-addons/Makefile b/xtables-addons/Makefile old mode 100755 new mode 100644 diff --git a/xtables-addons/patches/001-fix-kernel-version-detection.patch b/xtables-addons/patches/001-fix-kernel-version-detection.patch old mode 100755 new mode 100644 index 775ccf657..e29b3925c --- a/xtables-addons/patches/001-fix-kernel-version-detection.patch +++ b/xtables-addons/patches/001-fix-kernel-version-detection.patch @@ -1,8 +1,8 @@ --- a/configure.ac +++ b/configure.ac -@@ -44,7 +44,7 @@ regular_CFLAGS="-Wall -Waggregate-return +@@ -41,7 +41,7 @@ regular_CFLAGS="-Wall -Waggregate-return - if test -n "$kbuilddir"; then + AS_IF([test -n "$kbuilddir"], [ AC_MSG_CHECKING([kernel version that we will build against]) - krel="$(make -sC "$kbuilddir" M=$PWD kernelrelease | $AWK -v 'FS=[[^0-9.]]' '{print $1; exit}')" + krel="$(make -sC "$kbuilddir" M=$PWD kernelversion | $AWK -v 'FS=[[^0-9.]]' '{print $1; exit}')" diff --git a/xtables-addons/patches/100-add-rtsp-conntrack.patch b/xtables-addons/patches/100-add-rtsp-conntrack.patch old mode 100755 new mode 100644 index dbdc52e94..befcd06a3 --- a/xtables-addons/patches/100-add-rtsp-conntrack.patch +++ b/xtables-addons/patches/100-add-rtsp-conntrack.patch @@ -1725,7 +1725,7 @@ +module_exit(fini); --- a/extensions/Kbuild +++ b/extensions/Kbuild -@@ -27,6 +27,7 @@ obj-${build_lscan} += xt_lscan.o +@@ -28,6 +28,7 @@ obj-${build_lscan} += xt_lscan.o obj-${build_pknock} += pknock/ obj-${build_psd} += xt_psd.o obj-${build_quota2} += xt_quota2.o @@ -1735,7 +1735,7 @@ -include ${M}/Kbuild.* --- a/mconfig +++ b/mconfig -@@ -23,3 +23,4 @@ build_lscan=m +@@ -24,3 +24,4 @@ build_lscan=m build_pknock=m build_psd=m build_quota2=m diff --git a/xtables-addons/patches/200-add-lua-packetscript.patch b/xtables-addons/patches/200-add-lua-packetscript.patch old mode 100755 new mode 100644 index 8dd926712..2a97f54d7 --- a/xtables-addons/patches/200-add-lua-packetscript.patch +++ b/xtables-addons/patches/200-add-lua-packetscript.patch @@ -1,6 +1,6 @@ --- /dev/null +++ b/extensions/LUA/byte_array.c -@@ -0,0 +1,145 @@ +@@ -0,0 +1,161 @@ +/* + * Copyright (C) 2010 University of Basel + * by Andre Graf @@ -110,12 +110,26 @@ +static int32_t byte_array_to_string(lua_State *L) +{ + lua_packet_segment * array = checkbytearray(L, 1); -+ uint8_t buf[(array->length * 3) + 255]; + uint8_t hexval[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; -+ char res[255 + (array->length * 3)]; /* make sure the buffer is big enough*/ ++ uint8_t * buf; ++ char * res; + int32_t i, n; + uint8_t *ptr = array->start + array->offset; + ++ buf = kcalloc((array->length * 3) + 255, sizeof(*buf), GFP_KERNEL); ++ ++ if (!buf) { ++ return luaL_error(L, "byte_array_to_string, failed alloc buf buffer"); ++ } ++ ++ /* make sure the buffer is big enough*/ ++ res = kcalloc((array->length * 3) + 255, sizeof(*res), GFP_KERNEL); ++ ++ if (!res) { ++ kfree(buf); ++ return luaL_error(L, "byte_array_to_string, failed alloc res buffer"); ++ } ++ + for (i = 0; i < array->length; i++) { + buf[i * 3] = hexval[(ptr[i] >> 4) & 0xF]; + buf[(i * 3) + 1] = hexval[ptr[i] & 0x0F]; @@ -126,6 +140,8 @@ + n = sprintf(res, "byte_array: length: %d value: %s", array->length, buf); + + lua_pushlstring(L, res, n); ++ kfree(res); ++ kfree(buf); + + return 1; +} @@ -1137,7 +1153,7 @@ + struct xt_lua_tginfo *info = (void *)target->data; + + info->state_id = 0; -+ strncpy(info->function, "process_packet\0", sizeof("process_packet\0")); ++ strcpy(info->function, "process_packet\0"); +} + +static int @@ -2453,15 +2469,13 @@ +#endif --- /dev/null +++ b/extensions/LUA/lua/lauxlib.c -@@ -0,0 +1,674 @@ +@@ -0,0 +1,672 @@ +/* +** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + -+#include -+ +#if !defined(__KERNEL__) +#include +#include @@ -4887,7 +4901,7 @@ +#endif --- /dev/null +++ b/extensions/LUA/lua/ldebug.c -@@ -0,0 +1,637 @@ +@@ -0,0 +1,636 @@ +/* +** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $ +** Debug Interface @@ -4895,7 +4909,6 @@ +*/ + + -+#include +#include +#include + @@ -5301,7 +5314,7 @@ + case OP_FORLOOP: + case OP_FORPREP: + checkreg(pt, a+3); -+ /* go through */ ++ fallthrough; + case OP_JMP: { + int dest = pc+1+b; + /* not full check and jump is forward and do not skip `lastpc'? */ @@ -6204,7 +6217,7 @@ + +static void DumpString(const TString* s, DumpState* D) +{ -+ if (s==NULL || getstr(s)==NULL) ++ if (s==NULL) + { + size_t size=0; + DumpVar(size,D); @@ -7716,6 +7729,7 @@ + } + else if (sep == -1) return '['; + else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); ++ fallthrough; + } + case '=': { + next(ls); @@ -7809,7 +7823,6 @@ + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); +} -+ --- /dev/null +++ b/extensions/LUA/lua/llex.h @@ -0,0 +1,81 @@ @@ -8165,15 +8178,13 @@ + --- /dev/null +++ b/extensions/LUA/lua/lobject.c -@@ -0,0 +1,215 @@ +@@ -0,0 +1,213 @@ +/* +** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + -+#include -+ +#include +#include +#include @@ -12471,7 +12482,7 @@ + lua_number2int(k, n); + if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */ + return luaH_getnum(t, k); /* use specialized version */ -+ /* else go through */ ++ fallthrough; + } + default: { + Node *n = mainposition(t, key); @@ -12766,7 +12777,7 @@ + if (!lua_isstring(L, -1)) + luaL_error(L, "invalid value (%s) at index %d in table for " + LUA_QL("concat"), luaL_typename(L, -1), i); -+ luaL_addvalue(b); ++ luaL_addvalue(b); +} + + @@ -13851,7 +13862,7 @@ + --- /dev/null +++ b/extensions/LUA/lua/lua.h -@@ -0,0 +1,387 @@ +@@ -0,0 +1,386 @@ +/* +** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $ +** Lua - An Extensible Extension Language @@ -13863,7 +13874,6 @@ +#ifndef lua_h +#define lua_h + -+#include +#include + +#include "luaconf.h" @@ -17984,7 +17994,7 @@ + int32_t ret; + struct lua_env * env = kmalloc(sizeof(struct lua_env), GFP_KERNEL); + -+ if (!script_size > 0) { ++ if (!script_size) { + pr_debug("LUA [%d]: script_size %lu < 0\n", state_id, script_size); + return false; + } @@ -18134,7 +18144,7 @@ + --- a/extensions/Kbuild +++ b/extensions/Kbuild -@@ -28,6 +28,7 @@ obj-${build_pknock} += pknock/ +@@ -29,6 +29,7 @@ obj-${build_pknock} += pknock/ obj-${build_psd} += xt_psd.o obj-${build_quota2} += xt_quota2.o obj-${build_rtsp} += rtsp/ @@ -18144,14 +18154,14 @@ -include ${M}/Kbuild.* --- a/extensions/Mbuild +++ b/extensions/Mbuild -@@ -23,3 +23,4 @@ obj-${build_pknock} += pknock/ +@@ -24,3 +24,4 @@ obj-${build_pknock} += pknock/ obj-${build_psd} += libxt_psd.so obj-${build_quota2} += libxt_quota2.so obj-${build_gradm} += libxt_gradm.so +obj-${build_LUA} += LUA/ --- a/mconfig +++ b/mconfig -@@ -24,3 +24,4 @@ build_pknock=m +@@ -25,3 +25,4 @@ build_pknock=m build_psd=m build_quota2=m build_rtsp=m diff --git a/xtables-addons/patches/201-fix-lua-packetscript.patch b/xtables-addons/patches/201-fix-lua-packetscript.patch old mode 100755 new mode 100644 index 5a016e2ae..64130121c --- a/xtables-addons/patches/201-fix-lua-packetscript.patch +++ b/xtables-addons/patches/201-fix-lua-packetscript.patch @@ -1,3 +1,14 @@ +--- a/extensions/LUA/Kbuild ++++ b/extensions/LUA/Kbuild +@@ -22,6 +22,8 @@ xt_LUA-y += nf_lua.o \ + prot_buf_dynamic.o \ + + ++# Enable ++EXTRA_CFLAGS += -isystem $(shell $(CC) -print-file-name=include) + # Adding Lua Support + EXTRA_CFLAGS += -I$(src)/lua -I$(src)/lua/include + xt_LUA-y += lua/lapi.o \ --- a/extensions/LUA/xt_LUA_target.c +++ b/extensions/LUA/xt_LUA_target.c @@ -19,7 +19,7 @@ diff --git a/xtables-addons/patches/202-fix-lua-packetscript-kernel-5.16-no-isystem.patch b/xtables-addons/patches/202-fix-lua-packetscript-kernel-5.16-no-isystem.patch deleted file mode 100755 index 5279619da..000000000 --- a/xtables-addons/patches/202-fix-lua-packetscript-kernel-5.16-no-isystem.patch +++ /dev/null @@ -1,284 +0,0 @@ -Linux 5.16 includes 04e85bbf71c9 ("isystem: delete global -isystem compile option") - -compile error on >=5.16 -xtables-addons-3.21/extensions/LUA/lua/lua.h:12:10: fatal error: stdarg.h: No such file or directory - 12 | #include - | ^~~~~~~~~~ - -Generated with coccinelle: - -cat <cocci-xtables-lua-linux-5.16.spatch -@include_arg@ -@@ - #include - -@include_def@ -@@ - #include - -@include_both depends on include_arg && include_def@ -@@ - #include - -@add_include_linux_stdheaders_both depends on include_both@ -@@ -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) -?#include -?#include -+#else -+#include -+#include -+#endif - -@add_include_linux_stdheaders depends on !include_both@ -@@ -( -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif -| -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif -) -EOF -spatch --in-place --include-headers --no-includes --sp-file cocci-xtables-lua-linux-5.16.spatch --dir extensions/LUA/lua/ - ---- - ---- a/extensions/LUA/lua/lauxlib.c -+++ b/extensions/LUA/lua/lauxlib.c -@@ -4,7 +4,12 @@ - ** See Copyright Notice in lua.h - */ - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #if !defined(__KERNEL__) - #include ---- a/extensions/LUA/lua/lauxlib.h -+++ b/extensions/LUA/lua/lauxlib.h -@@ -9,7 +9,12 @@ - #define lauxlib_h - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - #include /* for kmalloc and kfree when allocating luaL_Buffer */ - - #if !defined(__KERNEL__) ---- a/extensions/LUA/lua/ldebug.c -+++ b/extensions/LUA/lua/ldebug.c -@@ -5,8 +5,14 @@ - */ - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include - #include -+#else -+#include -+#include -+#endif - #include - - #define ldebug_c ---- a/extensions/LUA/lua/ldump.c -+++ b/extensions/LUA/lua/ldump.c -@@ -4,7 +4,12 @@ - ** See Copyright Notice in lua.h - */ - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #define ldump_c - #define LUA_CORE ---- a/extensions/LUA/lua/lfunc.c -+++ b/extensions/LUA/lua/lfunc.c -@@ -5,7 +5,12 @@ - */ - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #define lfunc_c - #define LUA_CORE ---- a/extensions/LUA/lua/llimits.h -+++ b/extensions/LUA/lua/llimits.h -@@ -7,7 +7,12 @@ - #ifndef llimits_h - #define llimits_h - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #include "lua.h" - ---- a/extensions/LUA/lua/lmem.c -+++ b/extensions/LUA/lua/lmem.c -@@ -5,7 +5,12 @@ - */ - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #define lmem_c - #define LUA_CORE ---- a/extensions/LUA/lua/lmem.h -+++ b/extensions/LUA/lua/lmem.h -@@ -8,7 +8,12 @@ - #define lmem_h - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #include "llimits.h" - #include "lua.h" ---- a/extensions/LUA/lua/lobject.c -+++ b/extensions/LUA/lua/lobject.c -@@ -4,7 +4,12 @@ - ** See Copyright Notice in lua.h - */ - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #include - #include ---- a/extensions/LUA/lua/lobject.h -+++ b/extensions/LUA/lua/lobject.h -@@ -9,7 +9,12 @@ - #define lobject_h - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - - #include "llimits.h" ---- a/extensions/LUA/lua/lstate.c -+++ b/extensions/LUA/lua/lstate.c -@@ -5,7 +5,12 @@ - */ - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #define lstate_c - #define LUA_CORE ---- a/extensions/LUA/lua/lstrlib.c -+++ b/extensions/LUA/lua/lstrlib.c -@@ -6,7 +6,12 @@ - - - #include -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - #include - #include - #include ---- a/extensions/LUA/lua/ltablib.c -+++ b/extensions/LUA/lua/ltablib.c -@@ -5,7 +5,12 @@ - */ - - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #define ltablib_c - #define LUA_LIB ---- a/extensions/LUA/lua/lua.h -+++ b/extensions/LUA/lua/lua.h -@@ -9,8 +9,14 @@ - #ifndef lua_h - #define lua_h - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include - #include -+#else -+#include -+#include -+#endif - - #include "luaconf.h" - ---- a/extensions/LUA/lua/luaconf.h -+++ b/extensions/LUA/lua/luaconf.h -@@ -8,7 +8,12 @@ - #ifndef lconfig_h - #define lconfig_h - -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) - #include -+#else -+#include -+#endif - - #if !defined(__KERNEL__) - #include diff --git a/xtables-addons/patches/210-freebsd-build-fix.patch b/xtables-addons/patches/210-freebsd-build-fix.patch old mode 100755 new mode 100644 From 5bc59fe2164bfad855f3cd432ab919baf1f3aec5 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Thu, 22 Jun 2023 22:58:54 +0800 Subject: [PATCH 03/73] update modemmanager --- modemmanager/Config.in | 0 modemmanager/Makefile | 10 ++-- modemmanager/README.md | 0 modemmanager/files/25-modemmanager-net | 0 modemmanager/files/25-modemmanager-tty | 0 modemmanager/files/25-modemmanager-usb | 0 modemmanager/files/25-modemmanager-wwan | 0 modemmanager/files/modemmanager.common | 51 +++++++++++-------- modemmanager/files/modemmanager.init | 4 ++ modemmanager/files/modemmanager.proto | 5 -- .../files/usr/sbin/ModemManager-wrapper | 0 11 files changed, 39 insertions(+), 31 deletions(-) mode change 100755 => 100644 modemmanager/Config.in mode change 100755 => 100644 modemmanager/Makefile mode change 100755 => 100644 modemmanager/README.md mode change 100755 => 100644 modemmanager/files/25-modemmanager-net mode change 100755 => 100644 modemmanager/files/25-modemmanager-tty mode change 100755 => 100644 modemmanager/files/25-modemmanager-usb mode change 100755 => 100644 modemmanager/files/25-modemmanager-wwan mode change 100755 => 100644 modemmanager/files/modemmanager.common mode change 100755 => 100644 modemmanager/files/usr/sbin/ModemManager-wrapper diff --git a/modemmanager/Config.in b/modemmanager/Config.in old mode 100755 new mode 100644 diff --git a/modemmanager/Makefile b/modemmanager/Makefile old mode 100755 new mode 100644 index 30e17b657..3c021b44d --- a/modemmanager/Makefile +++ b/modemmanager/Makefile @@ -8,25 +8,25 @@ include $(TOPDIR)/rules.mk PKG_NAME:=modemmanager -PKG_SOURCE_VERSION:=1.20.4 -PKG_RELEASE:=1 +PKG_SOURCE_VERSION:=1.20.6 +PKG_RELEASE:=3 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://gitlab.freedesktop.org/mobile-broadband/ModemManager.git -#PKG_MIRROR_HASH:=f138effc693456c5040ec22e17c0a8b41143c3b17b62437462995c297a9150dc +PKG_MIRROR_HASH:=e90103e2e42bb826bbbac83937a9a69f50348cd6ce0d8da655a12b65494ce7c9 PKG_MAINTAINER:=Nicholas Smith PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=COPYING PKG_BUILD_DEPENDS:=glib2/host libxslt/host +PKG_BUILD_FLAGS:=gc-sections include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk include $(INCLUDE_DIR)/meson.mk -TARGET_CFLAGS += -ffunction-sections -fdata-sections -fno-merge-all-constants -fmerge-constants -TARGET_LDFLAGS += -Wl,--gc-sections +TARGET_CFLAGS += -fno-merge-all-constants -fmerge-constants define Package/modemmanager/config source "$(SOURCE)/Config.in" diff --git a/modemmanager/README.md b/modemmanager/README.md old mode 100755 new mode 100644 diff --git a/modemmanager/files/25-modemmanager-net b/modemmanager/files/25-modemmanager-net old mode 100755 new mode 100644 diff --git a/modemmanager/files/25-modemmanager-tty b/modemmanager/files/25-modemmanager-tty old mode 100755 new mode 100644 diff --git a/modemmanager/files/25-modemmanager-usb b/modemmanager/files/25-modemmanager-usb old mode 100755 new mode 100644 diff --git a/modemmanager/files/25-modemmanager-wwan b/modemmanager/files/25-modemmanager-wwan old mode 100755 new mode 100644 diff --git a/modemmanager/files/modemmanager.common b/modemmanager/files/modemmanager.common old mode 100755 new mode 100644 index a439179de..a931717fd --- a/modemmanager/files/modemmanager.common +++ b/modemmanager/files/modemmanager.common @@ -20,7 +20,8 @@ MODEMMANAGER_EVENTS_CACHE="${MODEMMANAGER_RUNDIR}/events.cache" # Common logging mm_log() { - [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && logger -t "ModemManager" "hotplug: $*" + local level="$1"; shift + logger -p "daemon.${level}" -t "ModemManager[$$]" "hotplug: $*" } ################################################################################ @@ -39,14 +40,14 @@ mm_find_physdev_sysfs_path() { # avoid infinite loops iterating [ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return - # for USB devices, the physical device will be that with a idVendor - # and idProduct pair of files + # For USB devices, the physical device will be that with a idVendor + # and idProduct pair of files [ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && { tmp_path=$(readlink -f "$tmp_path") echo "${tmp_path}" return } - + # For PCI devices, the physical device will be that with a vendor # and device pair of files [ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && { @@ -169,7 +170,7 @@ mm_wait_for_modem() { while [ $n -ge 0 ]; do [ -d "${sysfspath}" ] || { - mm_log "error: ignoring modem detection request: no device at ${sysfspath}" + mm_log "error" "ignoring modem detection request: no device at ${sysfspath}" proto_set_available "${cfg}" 0 return 1 } @@ -177,10 +178,10 @@ mm_wait_for_modem() { # Check if the modem exists at the given sysfs path if ! mmcli -m "${sysfspath}" > /dev/null 2>&1 then - mm_log "error: modem not detected at sysfs path" + mm_log "error" "modem not detected at sysfs path" else - mm_log "modem exported successfully at ${sysfspath}" - mm_log "setting interface '${cfg}' as available" + mm_log "info" "modem exported successfully at ${sysfspath}" + mm_log "info" "setting interface '${cfg}' as available" proto_set_available "${cfg}" 1 return 0 fi @@ -189,7 +190,7 @@ mm_wait_for_modem() { n=$((n-step)) done - mm_log "error: timed out waiting for the modem to get exported at ${sysfspath}" + mm_log "error" "timed out waiting for the modem to get exported at ${sysfspath}" proto_set_available "${cfg}" 0 return 2 } @@ -201,7 +202,7 @@ mm_report_modem_wait() { parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath") [ -n "${parent_sysfspath}" ] || { - mm_log "error: parent device sysfspath not found" + mm_log "error" "parent device sysfspath not found" return } @@ -212,23 +213,23 @@ mm_report_modem_wait() { cfg=$(mm_get_modem_config "${parent_sysfspath}") if [ -n "${cfg}" ]; then - mm_log "interface '${cfg}' is set to configure device '${parent_sysfspath}'" - mm_log "now waiting for modem at sysfs path ${parent_sysfspath}" + mm_log "info" "interface '${cfg}' is set to configure device '${parent_sysfspath}'" + mm_log "info" "now waiting for modem at sysfs path ${parent_sysfspath}" mm_set_modem_wait_status "${parent_sysfspath}" "processed" # Launch subshell for the explicit wait ( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 & else - mm_log "no need to wait for modem at sysfs path ${parent_sysfspath}" + mm_log "info" "no need to wait for modem at sysfs path ${parent_sysfspath}" mm_set_modem_wait_status "${parent_sysfspath}" "ignored" fi ;; "processed") - mm_log "already waiting for modem at sysfs path ${parent_sysfspath}" + mm_log "info" "already waiting for modem at sysfs path ${parent_sysfspath}" ;; "ignored") ;; *) - mm_log "error: unknown status read for device at sysfs path ${parent_sysfspath}" + mm_log "error" "unknown status read for device at sysfs path ${parent_sysfspath}" ;; esac } @@ -258,7 +259,7 @@ mm_cleanup_interface_by_sysfspath() { cfg=$(mm_get_modem_config "$dev") [ -n "${cfg}" ] || return - mm_log "setting interface '$cfg' as unavailable" + mm_log "info" "setting interface '$cfg' as unavailable" proto_set_available "${cfg}" 0 } @@ -272,6 +273,14 @@ mm_report_event() { local subsystem="$3" local sysfspath="$4" + # Do not save virtual devices + local virtual + virtual="$(echo "$sysfspath" | cut -d'/' -f4)" + [ "$virtual" = "virtual" ] && { + mm_log "debug" "sysfspath is a virtual device ($sysfspath)" + return + } + # Track/untrack events in cache case "${action}" in "add") @@ -286,7 +295,7 @@ mm_report_event() { esac # Report the event - mm_log "event reported: action=${action}, name=${name}, subsystem=${subsystem}" + mm_log "debug" "event reported: action=${action}, name=${name}, subsystem=${subsystem}" mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 & # Wait for added modem if a sysfspath is given @@ -302,7 +311,7 @@ mm_report_event_from_cache_line() { subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }') sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }') - mm_log "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}" + mm_log "debug" "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}" mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}" } @@ -317,11 +326,11 @@ mm_report_events_from_cache() { # Wait for ModemManager to be available in the bus while [ $n -ge 0 ]; do sleep $step - mm_log "checking if ModemManager is available..." + mm_log "info" "checking if ModemManager is available..." if ! mmcli -L >/dev/null 2>&1 then - mm_log "ModemManager not yet available" + mm_log "info" "ModemManager not yet available" else mmrunning=1 break @@ -330,7 +339,7 @@ mm_report_events_from_cache() { done [ ${mmrunning} -eq 1 ] || { - mm_log "error: couldn't report initial kernel events: ModemManager not running" + mm_log "error" "couldn't report initial kernel events: ModemManager not running" return } diff --git a/modemmanager/files/modemmanager.init b/modemmanager/files/modemmanager.init index a3f6c1b12..7f014dc56 100755 --- a/modemmanager/files/modemmanager.init +++ b/modemmanager/files/modemmanager.init @@ -4,6 +4,8 @@ USE_PROCD=1 START=70 +LOG_LEVEL="INFO" + stop_service() { # Load common utils . /usr/share/ModemManager/modemmanager.common @@ -28,6 +30,8 @@ start_service() { . /usr/share/ModemManager/modemmanager.common procd_open_instance procd_set_param command /usr/sbin/ModemManager-wrapper + procd_append_param command --log-level="$LOG_LEVEL" + [ "$LOG_LEVEL" = "DEBUG" ] && procd_append_param command --debug procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" procd_set_param pidfile "${MODEMMANAGER_PID_FILE}" procd_close_instance diff --git a/modemmanager/files/modemmanager.proto b/modemmanager/files/modemmanager.proto index e6ec9e203..2a61f5178 100755 --- a/modemmanager/files/modemmanager.proto +++ b/modemmanager/files/modemmanager.proto @@ -368,11 +368,6 @@ proto_modemmanager_setup() { proto_set_available "${interface}" 0 return 1 } - [ -e "${device}" ] || { - echo "Device not found in sysfs" - proto_set_available "${interface}" 0 - return 1 - } # validate that ModemManager is handling the modem at the sysfs path modemstatus=$(mmcli --modem="${device}" --output-keyvalue) diff --git a/modemmanager/files/usr/sbin/ModemManager-wrapper b/modemmanager/files/usr/sbin/ModemManager-wrapper old mode 100755 new mode 100644 From a6f5eb6c08fa429b2fbf615d93b5000697d86eba Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Thu, 22 Jun 2023 23:05:23 +0800 Subject: [PATCH 04/73] fix frp --- frp/files/frpc.init | 0 frp/files/frpc.uci-defaults | 0 frp/files/frps.config | 0 frp/files/frps.init | 0 frp/test.sh | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 frp/files/frpc.init mode change 100644 => 100755 frp/files/frpc.uci-defaults mode change 100644 => 100755 frp/files/frps.config mode change 100644 => 100755 frp/files/frps.init mode change 100644 => 100755 frp/test.sh diff --git a/frp/files/frpc.init b/frp/files/frpc.init old mode 100644 new mode 100755 diff --git a/frp/files/frpc.uci-defaults b/frp/files/frpc.uci-defaults old mode 100644 new mode 100755 diff --git a/frp/files/frps.config b/frp/files/frps.config old mode 100644 new mode 100755 diff --git a/frp/files/frps.init b/frp/files/frps.init old mode 100644 new mode 100755 diff --git a/frp/test.sh b/frp/test.sh old mode 100644 new mode 100755 From b8ec680e1154e2f9da0a4fd1b82ba16e20fd0a18 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 01:44:39 +0800 Subject: [PATCH 05/73] update iproute2 6.3.0 --- iproute2/Makefile | 9 +++++---- iproute2/patches/100-configure.patch | 2 +- iproute2/patches/110-darwin_fixes.patch | 8 ++++---- iproute2/patches/115-add-config-xtlibdir.patch | 2 +- iproute2/patches/120-no_arpd_ifstat_rtacct_lnstat.patch | 0 iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch | 0 iproute2/patches/140-allow_pfifo_fast.patch | 2 +- iproute2/patches/140-keep_libmnl_optional.patch | 2 +- iproute2/patches/145-keep_libelf_optional.patch | 2 +- iproute2/patches/150-keep_libcap_optional.patch | 2 +- iproute2/patches/155-keep_tirpc_optional.patch | 0 iproute2/patches/160-libnetlink-pic.patch | 0 iproute2/patches/170-ip_tiny.patch | 0 iproute2/patches/175-reduce-dynamic-syms.patch | 8 ++++---- iproute2/patches/180-drop_FAILED_POLICY.patch | 6 +++--- iproute2/patches/190-fix-nls-rpath-link.patch | 4 ++-- iproute2/patches/195-build_variant_ip_tc.patch | 0 iproute2/patches/200-drop_libbsd_dependency.patch | 2 +- iproute2/patches/300-selinux-configurable.patch | 2 +- 19 files changed, 26 insertions(+), 25 deletions(-) mode change 100755 => 100644 iproute2/Makefile mode change 100755 => 100644 iproute2/patches/100-configure.patch mode change 100755 => 100644 iproute2/patches/110-darwin_fixes.patch mode change 100755 => 100644 iproute2/patches/115-add-config-xtlibdir.patch mode change 100755 => 100644 iproute2/patches/120-no_arpd_ifstat_rtacct_lnstat.patch mode change 100755 => 100644 iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch mode change 100755 => 100644 iproute2/patches/140-allow_pfifo_fast.patch mode change 100755 => 100644 iproute2/patches/140-keep_libmnl_optional.patch mode change 100755 => 100644 iproute2/patches/145-keep_libelf_optional.patch mode change 100755 => 100644 iproute2/patches/150-keep_libcap_optional.patch mode change 100755 => 100644 iproute2/patches/155-keep_tirpc_optional.patch mode change 100755 => 100644 iproute2/patches/160-libnetlink-pic.patch mode change 100755 => 100644 iproute2/patches/170-ip_tiny.patch mode change 100755 => 100644 iproute2/patches/175-reduce-dynamic-syms.patch mode change 100755 => 100644 iproute2/patches/180-drop_FAILED_POLICY.patch mode change 100755 => 100644 iproute2/patches/190-fix-nls-rpath-link.patch mode change 100755 => 100644 iproute2/patches/195-build_variant_ip_tc.patch mode change 100755 => 100644 iproute2/patches/200-drop_libbsd_dependency.patch mode change 100755 => 100644 iproute2/patches/300-selinux-configurable.patch diff --git a/iproute2/Makefile b/iproute2/Makefile old mode 100755 new mode 100644 index 302d57bf8..101ca6732 --- a/iproute2/Makefile +++ b/iproute2/Makefile @@ -8,17 +8,19 @@ include $(TOPDIR)/rules.mk PKG_NAME:=iproute2 -PKG_VERSION:=6.2.0 +PKG_VERSION:=6.3.0 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2 -PKG_HASH:=4d72730200ec5b2aabaa1a2f20553c6748292f065d9a154c7d5e22559df9fd62 +PKG_HASH:=dfb2a98db96e7a653cffc6693335a1a466e29a34b6ac528be48f35e1d2766732 PKG_BUILD_PARALLEL:=1 PKG_BUILD_DEPENDS:=iptables PKG_LICENSE:=GPL-2.0 PKG_CPE_ID:=cpe:/a:iproute2_project:iproute2 +PKG_BUILD_FLAGS:=gc-sections lto + include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/nls.mk @@ -171,8 +173,7 @@ define Build/Configure > $(PKG_BUILD_DIR)/include/SNAPSHOT.h endef -TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto -TARGET_LDFLAGS += -Wl,--gc-sections -Wl,--as-needed +TARGET_LDFLAGS += -Wl,--as-needed TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny MAKE_FLAGS += \ diff --git a/iproute2/patches/100-configure.patch b/iproute2/patches/100-configure.patch old mode 100755 new mode 100644 index 0c19b2086..2d4fb7b9b --- a/iproute2/patches/100-configure.patch +++ b/iproute2/patches/100-configure.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -34,7 +34,8 @@ int main(int argc, char **argv) { +@@ -36,7 +36,8 @@ int main(int argc, char **argv) { } EOF diff --git a/iproute2/patches/110-darwin_fixes.patch b/iproute2/patches/110-darwin_fixes.patch old mode 100755 new mode 100644 index 1f3eb101e..06ae59f8b --- a/iproute2/patches/110-darwin_fixes.patch +++ b/iproute2/patches/110-darwin_fixes.patch @@ -1,6 +1,6 @@ --- a/netem/maketable.c +++ b/netem/maketable.c -@@ -10,7 +10,9 @@ +@@ -11,7 +11,9 @@ #include #include #include @@ -12,7 +12,7 @@ #include --- a/netem/normal.c +++ b/netem/normal.c -@@ -8,8 +8,12 @@ +@@ -9,8 +9,12 @@ #include #include @@ -27,7 +27,7 @@ #define TABLEFACTOR NETEM_DIST_SCALE --- a/netem/pareto.c +++ b/netem/pareto.c -@@ -7,8 +7,12 @@ +@@ -8,8 +8,12 @@ #include #include @@ -42,7 +42,7 @@ #define TABLESIZE 16384 --- a/netem/paretonormal.c +++ b/netem/paretonormal.c -@@ -14,10 +14,13 @@ +@@ -15,10 +15,13 @@ #include #include #include diff --git a/iproute2/patches/115-add-config-xtlibdir.patch b/iproute2/patches/115-add-config-xtlibdir.patch old mode 100755 new mode 100644 index 8702d5fd2..03df7809f --- a/iproute2/patches/115-add-config-xtlibdir.patch +++ b/iproute2/patches/115-add-config-xtlibdir.patch @@ -1,6 +1,6 @@ --- a/tc/Makefile +++ b/tc/Makefile -@@ -128,6 +128,9 @@ CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PR +@@ -127,6 +127,9 @@ CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PR ifneq ($(IPT_LIB_DIR),) CFLAGS += -DIPT_LIB_DIR=\"$(IPT_LIB_DIR)\" endif diff --git a/iproute2/patches/120-no_arpd_ifstat_rtacct_lnstat.patch b/iproute2/patches/120-no_arpd_ifstat_rtacct_lnstat.patch old mode 100755 new mode 100644 diff --git a/iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch b/iproute2/patches/130-no_netem_tipc_dcb_man_vdpa.patch old mode 100755 new mode 100644 diff --git a/iproute2/patches/140-allow_pfifo_fast.patch b/iproute2/patches/140-allow_pfifo_fast.patch old mode 100755 new mode 100644 index 13de48f41..8f5a7d352 --- a/iproute2/patches/140-allow_pfifo_fast.patch +++ b/iproute2/patches/140-allow_pfifo_fast.patch @@ -1,6 +1,6 @@ --- a/tc/q_fifo.c +++ b/tc/q_fifo.c -@@ -95,5 +95,6 @@ struct qdisc_util pfifo_head_drop_qdisc_ +@@ -90,5 +90,6 @@ struct qdisc_util pfifo_head_drop_qdisc_ struct qdisc_util pfifo_fast_qdisc_util = { .id = "pfifo_fast", diff --git a/iproute2/patches/140-keep_libmnl_optional.patch b/iproute2/patches/140-keep_libmnl_optional.patch old mode 100755 new mode 100644 index ff7e9ca4e..a8cdd103b --- a/iproute2/patches/140-keep_libmnl_optional.patch +++ b/iproute2/patches/140-keep_libmnl_optional.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -387,7 +387,7 @@ check_selinux() +@@ -411,7 +411,7 @@ check_tirpc() check_mnl() { diff --git a/iproute2/patches/145-keep_libelf_optional.patch b/iproute2/patches/145-keep_libelf_optional.patch old mode 100755 new mode 100644 index 079ca0512..0c5c3f59e --- a/iproute2/patches/145-keep_libelf_optional.patch +++ b/iproute2/patches/145-keep_libelf_optional.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -255,7 +255,7 @@ EOF +@@ -266,7 +266,7 @@ EOF check_elf() { diff --git a/iproute2/patches/150-keep_libcap_optional.patch b/iproute2/patches/150-keep_libcap_optional.patch old mode 100755 new mode 100644 index 68e162416..4cce2c3ca --- a/iproute2/patches/150-keep_libcap_optional.patch +++ b/iproute2/patches/150-keep_libcap_optional.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -445,7 +445,7 @@ EOF +@@ -469,7 +469,7 @@ EOF check_cap() { diff --git a/iproute2/patches/155-keep_tirpc_optional.patch b/iproute2/patches/155-keep_tirpc_optional.patch old mode 100755 new mode 100644 diff --git a/iproute2/patches/160-libnetlink-pic.patch b/iproute2/patches/160-libnetlink-pic.patch old mode 100755 new mode 100644 diff --git a/iproute2/patches/170-ip_tiny.patch b/iproute2/patches/170-ip_tiny.patch old mode 100755 new mode 100644 diff --git a/iproute2/patches/175-reduce-dynamic-syms.patch b/iproute2/patches/175-reduce-dynamic-syms.patch old mode 100755 new mode 100644 index c3892e5a0..d0914848d --- a/iproute2/patches/175-reduce-dynamic-syms.patch +++ b/iproute2/patches/175-reduce-dynamic-syms.patch @@ -1,6 +1,6 @@ --- a/tc/Makefile +++ b/tc/Makefile -@@ -114,7 +114,7 @@ LDLIBS += -L. -lm +@@ -113,7 +113,7 @@ LDLIBS += -L. -lm ifeq ($(SHARED_LIBS),y) LDLIBS += -ldl @@ -9,7 +9,7 @@ endif TCLIB := tc_core.o -@@ -144,7 +144,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc +@@ -143,7 +143,7 @@ MODDESTDIR := $(DESTDIR)$(LIBDIR)/tc all: tc $(TCSO) tc: $(TCOBJ) $(LIBNETLINK) libtc.a @@ -18,7 +18,7 @@ libtc.a: $(TCLIB) $(QUIET_AR)$(AR) rcs $@ $^ -@@ -166,6 +166,7 @@ install: all +@@ -165,6 +165,7 @@ install: all clean: rm -f $(TCOBJ) $(TCLIB) libtc.a tc *.so emp_ematch.tab.h; \ rm -f emp_ematch.tab.* @@ -26,7 +26,7 @@ q_atm.so: q_atm.c $(QUIET_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fpic -o q_atm.so q_atm.c -latm -@@ -205,4 +206,16 @@ static-syms.h: $(wildcard *.c) +@@ -204,4 +205,16 @@ static-syms.h: $(wildcard *.c) sed -n '/'$$s'[^ ]* =/{s:.* \([^ ]*'$$s'[^ ]*\) .*:extern char \1[] __attribute__((weak)); if (!strcmp(sym, "\1")) return \1;:;p}' $$files ; \ done > $@ diff --git a/iproute2/patches/180-drop_FAILED_POLICY.patch b/iproute2/patches/180-drop_FAILED_POLICY.patch old mode 100755 new mode 100644 index 07d5230a6..9ce7dd9a1 --- a/iproute2/patches/180-drop_FAILED_POLICY.patch +++ b/iproute2/patches/180-drop_FAILED_POLICY.patch @@ -11,7 +11,7 @@ Subject: [PATCH] add support for dropping with FAILED_POLICY --- a/ip/rtm_map.c +++ b/ip/rtm_map.c -@@ -54,6 +54,8 @@ char *rtnl_rtntype_n2a(int id, char *buf +@@ -49,6 +49,8 @@ char *rtnl_rtntype_n2a(int id, char *buf return "nat"; case RTN_XRESOLVE: return "xresolve"; @@ -20,7 +20,7 @@ Subject: [PATCH] add support for dropping with FAILED_POLICY default: snprintf(buf, len, "%d", id); return buf; -@@ -89,6 +91,8 @@ int rtnl_rtntype_a2n(int *id, char *arg) +@@ -84,6 +86,8 @@ int rtnl_rtntype_a2n(int *id, char *arg) res = RTN_UNICAST; else if (strcmp(arg, "throw") == 0) res = RTN_THROW; @@ -31,7 +31,7 @@ Subject: [PATCH] add support for dropping with FAILED_POLICY if (!end || end == arg || *end || res > 255) --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h -@@ -256,6 +256,7 @@ enum { +@@ -265,6 +265,7 @@ enum { RTN_THROW, /* Not in this table */ RTN_NAT, /* Translate this address */ RTN_XRESOLVE, /* Use external resolver */ diff --git a/iproute2/patches/190-fix-nls-rpath-link.patch b/iproute2/patches/190-fix-nls-rpath-link.patch old mode 100755 new mode 100644 index 92d02b9a4..c7fceb2e2 --- a/iproute2/patches/190-fix-nls-rpath-link.patch +++ b/iproute2/patches/190-fix-nls-rpath-link.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -279,7 +279,7 @@ int main(int argc, char **argv) { +@@ -290,7 +290,7 @@ int main(int argc, char **argv) { } EOF @@ -9,7 +9,7 @@ local ret=$? rm -f $TMPDIR/libbpf_test.c $TMPDIR/libbpf_test -@@ -297,7 +297,7 @@ int main(int argc, char **argv) { +@@ -308,7 +308,7 @@ int main(int argc, char **argv) { } EOF diff --git a/iproute2/patches/195-build_variant_ip_tc.patch b/iproute2/patches/195-build_variant_ip_tc.patch old mode 100755 new mode 100644 diff --git a/iproute2/patches/200-drop_libbsd_dependency.patch b/iproute2/patches/200-drop_libbsd_dependency.patch old mode 100755 new mode 100644 index 12a1ccfa3..d1948860e --- a/iproute2/patches/200-drop_libbsd_dependency.patch +++ b/iproute2/patches/200-drop_libbsd_dependency.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -431,14 +431,8 @@ EOF +@@ -455,14 +455,8 @@ EOF if $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1; then echo "no" else diff --git a/iproute2/patches/300-selinux-configurable.patch b/iproute2/patches/300-selinux-configurable.patch old mode 100755 new mode 100644 index b7e61fd3b..817abf7d1 --- a/iproute2/patches/300-selinux-configurable.patch +++ b/iproute2/patches/300-selinux-configurable.patch @@ -1,6 +1,6 @@ --- a/configure +++ b/configure -@@ -374,7 +374,7 @@ check_libbpf() +@@ -385,7 +385,7 @@ check_libbpf() check_selinux() # SELinux is a compile time option in the ss utility { From 8836ce80c2bf34d67c21f29a7a5529055862276e Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 02:14:05 +0800 Subject: [PATCH 06/73] update app --- 6in4/Makefile | 5 +- 6in4/files/6in4.sh | 32 +- cryptodev-linux/Makefile | 0 https-dns-proxy/Makefile | 24 +- https-dns-proxy/files/README.md | 0 https-dns-proxy/files/https-dns-proxy.config | 9 +- .../files/https-dns-proxy.defaults | 3 + .../files/https-dns-proxy.hotplug.iface | 0 https-dns-proxy/files/https-dns-proxy.init | 419 ++-- ...tch => 010-cmakelists-remove-cflags.patch} | 8 +- .../020-src-options.c-add-version.patch | 11 + https-dns-proxy/test.sh | 2 +- luci-app-adguardhome/Makefile | 57 - .../luasrc/controller/AdGuardHome.lua | 130 -- .../luasrc/model/cbi/AdGuardHome/base.lua | 304 --- .../luasrc/model/cbi/AdGuardHome/log.lua | 16 - .../luasrc/model/cbi/AdGuardHome/manual.lua | 97 - .../view/AdGuardHome/AdGuardHome_check.htm | 78 - .../view/AdGuardHome/AdGuardHome_chpass.htm | 49 - .../view/AdGuardHome/AdGuardHome_status.htm | 27 - .../luasrc/view/AdGuardHome/log.htm | 111 - .../luasrc/view/AdGuardHome/yamleditor.htm | 39 - luci-app-adguardhome/po/zh-cn | 1 - .../po/zh_Hans/adguardhome.po | 408 ---- .../root/etc/config/AdGuardHome | 11 - .../root/etc/init.d/AdGuardHome | 642 ------ .../root/etc/uci-defaults/40_luci-AdGuardHome | 15 - .../AdGuardHome/AdGuardHome_template.yaml | 131 -- .../root/usr/share/AdGuardHome/addhost.sh | 35 - .../root/usr/share/AdGuardHome/firewall.start | 8 - .../root/usr/share/AdGuardHome/getsyslog.sh | 20 - .../root/usr/share/AdGuardHome/gfw2adg.sh | 89 - .../root/usr/share/AdGuardHome/links.txt | 3 - .../root/usr/share/AdGuardHome/tailto.sh | 5 - .../root/usr/share/AdGuardHome/update_core.sh | 236 -- .../root/usr/share/AdGuardHome/waitnet.sh | 35 - .../root/usr/share/AdGuardHome/watchconfig.sh | 13 - .../rpcd/acl.d/luci-app-adguardhome.json | 11 - .../codemirror/addon/fold/foldcode.js | 1 - .../codemirror/addon/fold/foldgutter.css | 1 - .../codemirror/addon/fold/foldgutter.js | 1 - .../codemirror/addon/fold/indent-fold.js | 1 - .../resources/codemirror/lib/codemirror.css | 1 - .../resources/codemirror/lib/codemirror.js | 1 - .../resources/codemirror/mode/yaml/yaml.js | 1 - .../resources/codemirror/theme/dracula.css | 1 - .../luci-static/resources/twin-bcrypt.min.js | 7 - luci-app-diskman/Makefile | 51 - .../luasrc/controller/diskman.lua | 155 -- .../luasrc/model/cbi/diskman/btrfs.lua | 210 -- .../luasrc/model/cbi/diskman/disks.lua | 327 --- .../luasrc/model/cbi/diskman/partition.lua | 366 --- luci-app-diskman/luasrc/model/diskman.lua | 738 ------ .../view/diskman/cbi/disabled_button.htm | 7 - .../luasrc/view/diskman/cbi/format_button.htm | 7 - .../luasrc/view/diskman/cbi/inlinebutton.htm | 7 - .../luasrc/view/diskman/cbi/xnullsection.htm | 37 - .../luasrc/view/diskman/cbi/xsimpleform.htm | 88 - .../luasrc/view/diskman/disk_info.htm | 108 - .../luasrc/view/diskman/partition_info.htm | 129 -- .../luasrc/view/diskman/smart_detail.htm | 79 - luci-app-diskman/po/zh-cn/diskman.po | 239 -- luci-app-diskman/po/zh_Hans | 1 - luci-app-dockerman/Makefile | 21 - luci-app-dockerman/depends.lst | 1 - .../resources/dockerman/containers.svg | 7 - .../resources/dockerman/file-icon.png | Bin 1098 -> 0 bytes .../resources/dockerman/file-manager.css | 91 - .../resources/dockerman/folder-icon.png | Bin 1292 -> 0 bytes .../resources/dockerman/images.svg | 9 - .../resources/dockerman/link-icon.png | Bin 1622 -> 0 bytes .../resources/dockerman/networks.svg | 12 - .../resources/dockerman/tar.min.js | 185 -- .../resources/dockerman/volumes.svg | 6 - .../luasrc/controller/dockerman.lua | 614 ----- .../model/cbi/dockerman/configuration.lua | 152 -- .../luasrc/model/cbi/dockerman/container.lua | 810 ------- .../luasrc/model/cbi/dockerman/containers.lua | 284 --- .../luasrc/model/cbi/dockerman/images.lua | 284 --- .../luasrc/model/cbi/dockerman/networks.lua | 159 -- .../model/cbi/dockerman/newcontainer.lua | 923 -------- .../luasrc/model/cbi/dockerman/newnetwork.lua | 258 --- .../luasrc/model/cbi/dockerman/overview.lua | 151 -- .../luasrc/model/cbi/dockerman/volumes.lua | 142 -- luci-app-dockerman/luasrc/model/docker.lua | 507 ----- .../luasrc/view/dockerman/apply_widget.htm | 147 -- .../view/dockerman/cbi/inlinebutton.htm | 7 - .../luasrc/view/dockerman/cbi/inlinevalue.htm | 33 - .../view/dockerman/cbi/namedsection.htm | 9 - .../luasrc/view/dockerman/cbi/xfvalue.htm | 10 - .../luasrc/view/dockerman/container.htm | 28 - .../view/dockerman/container_console.htm | 6 - .../view/dockerman/container_file_manager.htm | 332 --- .../luasrc/view/dockerman/container_stats.htm | 81 - .../dockerman/containers_running_stats.htm | 91 - .../luasrc/view/dockerman/images_import.htm | 104 - .../luasrc/view/dockerman/images_load.htm | 40 - .../luasrc/view/dockerman/logs.htm | 13 - .../view/dockerman/newcontainer_resolve.htm | 102 - .../luasrc/view/dockerman/overview.htm | 197 -- .../luasrc/view/dockerman/volume_size.htm | 21 - luci-app-dockerman/po/templates/dockerman.pot | 1002 -------- luci-app-dockerman/po/zh-cn/dockerman.po | 1094 --------- luci-app-dockerman/po/zh_Hans | 1 - luci-app-dockerman/postinst | 14 - luci-app-dockerman/root/etc/init.d/dockerman | 131 -- .../root/etc/uci-defaults/luci-app-dockerman | 36 - .../share/rpcd/acl.d/luci-app-dockerman.json | 11 - luci-app-snmpd/Makefile | 18 +- .../luci-static/resources/view/snmpd/snmpd.js | 64 + luci-app-snmpd/luasrc/controller/snmpd.lua | 8 - luci-app-snmpd/luasrc/model/cbi/snmpd.lua | 141 -- luci-app-snmpd/luasrc/view/snmpd.htm | 132 -- luci-app-snmpd/po/de/snmpd.po | 184 -- luci-app-snmpd/po/fr/snmpd.po | 184 -- luci-app-snmpd/po/it/snmpd.po | 184 -- luci-app-snmpd/po/oc/snmpd.po | 184 -- luci-app-snmpd/po/templates/snmpd.pot | 176 +- luci-app-snmpd/po/zh_Hans/snmpd.po | 184 -- luci-app-snmpd/root/etc/config/snmpd | 91 - luci-app-snmpd/root/etc/init.d/snmpd | 349 --- .../root/etc/uci-defaults/4400-snmpd | 19 - .../usr/share/luci/menu.d/luci-app-snmpd.json | 12 +- .../usr/share/rpcd/acl.d/luci-app-snmpd.json | 18 +- luci-mod-dashboard/Makefile | 3 - .../resources/view/dashboard/css/custom.css | 31 +- .../view/dashboard/icons/devices.svg | 0 .../view/dashboard/icons/internet.svg | 0 .../view/dashboard/icons/not-internet.svg | 0 .../resources/view/dashboard/icons/router.svg | 0 .../view/dashboard/icons/wireless.svg | 0 .../view/dashboard/include/10_router.js | 222 +- .../view/dashboard/include/20_lan.js | 12 +- .../view/dashboard/include/30_wifi.js | 38 +- .../resources/view/dashboard/index.js | 0 luci-mod-dashboard/po/ar/dashboard.po | 215 ++ luci-mod-dashboard/po/bg/dashboard.po | 222 ++ luci-mod-dashboard/po/bn_BD/dashboard.po | 219 ++ luci-mod-dashboard/po/ca/dashboard.po | 219 ++ luci-mod-dashboard/po/cs/dashboard.po | 222 ++ luci-mod-dashboard/po/da/dashboard.po | 220 ++ luci-mod-dashboard/po/de/dashboard.po | 222 ++ luci-mod-dashboard/po/el/dashboard.po | 222 ++ luci-mod-dashboard/po/en/dashboard.po | 222 ++ luci-mod-dashboard/po/es/dashboard.po | 223 ++ luci-mod-dashboard/po/fi/dashboard.po | 222 ++ luci-mod-dashboard/po/fr/dashboard.po | 197 +- luci-mod-dashboard/po/he/dashboard.po | 216 ++ luci-mod-dashboard/po/hi/dashboard.po | 215 ++ luci-mod-dashboard/po/hu/dashboard.po | 223 ++ luci-mod-dashboard/po/id/dashboard.po | 220 ++ luci-mod-dashboard/po/it/dashboard.po | 222 ++ luci-mod-dashboard/po/ja/dashboard.po | 222 ++ luci-mod-dashboard/po/ko/dashboard.po | 219 ++ luci-mod-dashboard/po/mr/dashboard.po | 215 ++ luci-mod-dashboard/po/ms/dashboard.po | 215 ++ luci-mod-dashboard/po/nb_NO/dashboard.po | 230 ++ luci-mod-dashboard/po/nl/dashboard.po | 219 ++ luci-mod-dashboard/po/pl/dashboard.po | 223 ++ luci-mod-dashboard/po/pt/dashboard.po | 222 ++ luci-mod-dashboard/po/pt_BR/dashboard.po | 222 ++ luci-mod-dashboard/po/ro/dashboard.po | 223 ++ luci-mod-dashboard/po/ru/dashboard.po | 225 +- luci-mod-dashboard/po/sk/dashboard.po | 219 ++ luci-mod-dashboard/po/sv/dashboard.po | 222 ++ luci-mod-dashboard/po/templates/dashboard.pot | 156 +- luci-mod-dashboard/po/tr/dashboard.po | 222 ++ luci-mod-dashboard/po/uk/dashboard.po | 223 ++ luci-mod-dashboard/po/vi/dashboard.po | 219 ++ luci-mod-dashboard/po/zh_Hans/dashboard.po | 215 +- luci-mod-dashboard/po/zh_Hant/dashboard.po | 220 ++ .../share/luci/menu.d/luci-mod-dashboard.json | 0 .../share/rpcd/acl.d/luci-mod-dashboard.json | 0 luci-mod-network/Makefile | 4 +- .../luci-static/resources/tools/network.js | 202 +- .../resources/view/network/dhcp.js | 773 +++++-- .../resources/view/network/diagnostics.js | 64 +- .../resources/view/network/hosts.js | 50 - .../resources/view/network/interfaces.js | 128 +- .../resources/view/network/routes.js | 228 +- .../resources/view/network/switch.js | 26 +- .../resources/view/network/wireless.js | 199 +- .../share/luci/menu.d/luci-mod-network.json | 46 +- .../share/rpcd/acl.d/luci-mod-network.json | 7 +- luci-proto-mbim/Makefile | 0 .../luci-static/resources/protocol/mbim.js | 80 +- luci-theme-ezengreen/Makefile | 16 - .../luci-static/ezengreen/1omr-logo-apple.png | Bin 8175 -> 0 bytes .../htdocs/luci-static/ezengreen/cascade.css | 2027 ----------------- .../htdocs/luci-static/ezengreen/favicon.png | Bin 8175 -> 0 bytes .../htdocs/luci-static/ezengreen/html5.js | 3 - .../htdocs/luci-static/ezengreen/mobile.css | 61 - .../resources/ezengreen/images/cascade.css | 2027 ----------------- .../resources/ezengreen/images/ezenlink.png | Bin 553 -> 0 bytes .../resources/ezengreen/images/favicon.ico | Bin 4286 -> 0 bytes .../resources/ezengreen/images/footer.png | Bin 836 -> 0 bytes .../resources/ezengreen/images/mobile.css | 61 - .../resources/ezengreen/images/omr-logo.png | Bin 19149 -> 0 bytes .../ezengreen/images/outdoorrouter.png | Bin 3815 -> 0 bytes .../luci-static/resources/menu-ezengreen.js | 118 - .../luasrc/view/themes/ezengreen/footer.htm | 19 - .../luasrc/view/themes/ezengreen/header.htm | 90 - .../etc/uci-defaults/luci-theme-ezengreen | 10 - luci-theme-openwrt-2020/Makefile | 8 + .../GalanoGrotesqueW00-Regular.woff2 | Bin .../luci-static/openwrt2020/cascade.css | 200 +- .../luci-static/openwrt2020/favicon.png | Bin 535 -> 0 bytes .../htdocs/luci-static/openwrt2020/logo.png | Bin 0 -> 3896 bytes .../htdocs/luci-static/openwrt2020/logo.svg | 7 + .../luci-static/openwrt2020/omr-logo.png | Bin 50790 -> 0 bytes .../luci-static/openwrt2020/spinner.svg | 0 .../luci-static/resources/menu-openwrt2020.js | 0 .../luasrc/view/themes/openwrt2020/header.htm | 63 - .../uci-defaults/30_luci-theme-openwrt-2020 | 1 + .../template/themes/openwrt2020/footer.ut} | 7 +- .../template/themes/openwrt2020/header.ut | 72 + msmtp/Makefile | 9 +- net-tools/Makefile | 14 +- net-tools/patches/mptcp-support.patch | 338 --- netifd/Makefile | 13 +- netifd/files/etc/hotplug.d/iface/00-netstate | 0 netifd/files/etc/init.d/packet_steering | 18 + .../etc/uci-defaults/14_migrate-dhcp-release | 0 netifd/files/etc/udhcpc.user | 0 netifd/files/lib/netifd/dhcp.script | 4 +- netifd/files/lib/netifd/proto/dhcp.sh | 9 +- .../libexec/network/packet-steering.sh} | 7 +- netmaker-openwrt/LICENSE | 8 - netmaker-openwrt/README.md | 111 - netmaker-openwrt/netmaker/Makefile | 93 - .../netmaker/root/etc/init.d/netclient | 42 - netmaker-openwrt/scripts/build_ipk.sh | 177 -- nginx/Config.in | 247 -- nginx/Config_ssl.in | 239 -- nginx/Makefile | 532 ----- .../files-luci-support/60_nginx-luci-support | 28 - .../70_nginx-luci-support-ssl | 48 - nginx/files-luci-support/luci_nginx.conf | 51 - nginx/files-luci-support/luci_nginx_ssl.conf | 66 - nginx/files-luci-support/luci_uwsgi.conf | 20 - nginx/files/nginx.init | 17 - .../100-no_by_lua_block.patch | 195 -- nginx/patches/101-feature_test_fix.patch | 116 - nginx/patches/102-sizeof_test_fix.patch | 27 - nginx/patches/103-sys_nerr.patch | 12 - nginx/patches/200-config.patch | 18 - .../patches/201-ignore-invalid-options.patch | 12 - nginx/patches/300-max-processes.patch | 11 - protobuf/Makefile | 8 +- protobuf/patches/010-rpath.patch | 24 + serdisplib/Makefile | 83 +- .../patches/002-allow-1bpp-framebuffer.patch | 21 + serdisplib/patches/010-cross-compile.patch | 101 + speedtestcpp/Makefile | 72 +- upx/Makefile | 66 - 255 files changed, 9752 insertions(+), 23582 deletions(-) mode change 100755 => 100644 6in4/Makefile mode change 100755 => 100644 cryptodev-linux/Makefile mode change 100755 => 100644 https-dns-proxy/Makefile mode change 100755 => 100644 https-dns-proxy/files/README.md mode change 100755 => 100644 https-dns-proxy/files/https-dns-proxy.config create mode 100644 https-dns-proxy/files/https-dns-proxy.defaults mode change 100755 => 100644 https-dns-proxy/files/https-dns-proxy.hotplug.iface rename https-dns-proxy/patches/{010-fix-cmakelists.patch => 010-cmakelists-remove-cflags.patch} (56%) mode change 100755 => 100644 create mode 100644 https-dns-proxy/patches/020-src-options.c-add-version.patch mode change 100755 => 100644 https-dns-proxy/test.sh delete mode 100755 luci-app-adguardhome/Makefile delete mode 100755 luci-app-adguardhome/luasrc/controller/AdGuardHome.lua delete mode 100755 luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua delete mode 100755 luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua delete mode 100755 luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua delete mode 100755 luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm delete mode 100755 luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm delete mode 100755 luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm delete mode 100755 luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm delete mode 100755 luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm delete mode 100755 luci-app-adguardhome/po/zh-cn delete mode 100755 luci-app-adguardhome/po/zh_Hans/adguardhome.po delete mode 100755 luci-app-adguardhome/root/etc/config/AdGuardHome delete mode 100755 luci-app-adguardhome/root/etc/init.d/AdGuardHome delete mode 100755 luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh delete mode 100755 luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh delete mode 100755 luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.css delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.js delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/indent-fold.js delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css delete mode 100755 luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js delete mode 100755 luci-app-diskman/Makefile delete mode 100755 luci-app-diskman/luasrc/controller/diskman.lua delete mode 100755 luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua delete mode 100755 luci-app-diskman/luasrc/model/cbi/diskman/disks.lua delete mode 100755 luci-app-diskman/luasrc/model/cbi/diskman/partition.lua delete mode 100755 luci-app-diskman/luasrc/model/diskman.lua delete mode 100755 luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/cbi/format_button.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/disk_info.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/partition_info.htm delete mode 100755 luci-app-diskman/luasrc/view/diskman/smart_detail.htm delete mode 100755 luci-app-diskman/po/zh-cn/diskman.po delete mode 100755 luci-app-diskman/po/zh_Hans delete mode 100755 luci-app-dockerman/Makefile delete mode 100755 luci-app-dockerman/depends.lst delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/containers.svg delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-icon.png delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-manager.css delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/folder-icon.png delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/images.svg delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/link-icon.png delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/networks.svg delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/tar.min.js delete mode 100755 luci-app-dockerman/htdocs/luci-static/resources/dockerman/volumes.svg delete mode 100755 luci-app-dockerman/luasrc/controller/dockerman.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua delete mode 100755 luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua delete mode 100755 luci-app-dockerman/luasrc/model/docker.lua delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/cbi/inlinebutton.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/cbi/namedsection.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/cbi/xfvalue.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/container.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/container_console.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/container_stats.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/containers_running_stats.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/images_import.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/images_load.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/logs.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/overview.htm delete mode 100755 luci-app-dockerman/luasrc/view/dockerman/volume_size.htm delete mode 100755 luci-app-dockerman/po/templates/dockerman.pot delete mode 100755 luci-app-dockerman/po/zh-cn/dockerman.po delete mode 100755 luci-app-dockerman/po/zh_Hans delete mode 100755 luci-app-dockerman/postinst delete mode 100755 luci-app-dockerman/root/etc/init.d/dockerman delete mode 100755 luci-app-dockerman/root/etc/uci-defaults/luci-app-dockerman delete mode 100755 luci-app-dockerman/root/usr/share/rpcd/acl.d/luci-app-dockerman.json mode change 100755 => 100644 luci-app-snmpd/Makefile create mode 100644 luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js delete mode 100755 luci-app-snmpd/luasrc/controller/snmpd.lua delete mode 100755 luci-app-snmpd/luasrc/model/cbi/snmpd.lua delete mode 100755 luci-app-snmpd/luasrc/view/snmpd.htm delete mode 100755 luci-app-snmpd/po/de/snmpd.po delete mode 100755 luci-app-snmpd/po/fr/snmpd.po delete mode 100755 luci-app-snmpd/po/it/snmpd.po delete mode 100755 luci-app-snmpd/po/oc/snmpd.po mode change 100755 => 100644 luci-app-snmpd/po/templates/snmpd.pot delete mode 100755 luci-app-snmpd/po/zh_Hans/snmpd.po delete mode 100755 luci-app-snmpd/root/etc/config/snmpd delete mode 100755 luci-app-snmpd/root/etc/init.d/snmpd delete mode 100755 luci-app-snmpd/root/etc/uci-defaults/4400-snmpd mode change 100755 => 100644 luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json mode change 100755 => 100644 luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json mode change 100755 => 100644 luci-mod-dashboard/Makefile mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js create mode 100644 luci-mod-dashboard/po/ar/dashboard.po create mode 100644 luci-mod-dashboard/po/bg/dashboard.po create mode 100644 luci-mod-dashboard/po/bn_BD/dashboard.po create mode 100644 luci-mod-dashboard/po/ca/dashboard.po create mode 100644 luci-mod-dashboard/po/cs/dashboard.po create mode 100644 luci-mod-dashboard/po/da/dashboard.po create mode 100644 luci-mod-dashboard/po/de/dashboard.po create mode 100644 luci-mod-dashboard/po/el/dashboard.po create mode 100644 luci-mod-dashboard/po/en/dashboard.po create mode 100644 luci-mod-dashboard/po/es/dashboard.po create mode 100644 luci-mod-dashboard/po/fi/dashboard.po mode change 100755 => 100644 luci-mod-dashboard/po/fr/dashboard.po create mode 100644 luci-mod-dashboard/po/he/dashboard.po create mode 100644 luci-mod-dashboard/po/hi/dashboard.po create mode 100644 luci-mod-dashboard/po/hu/dashboard.po create mode 100644 luci-mod-dashboard/po/id/dashboard.po create mode 100644 luci-mod-dashboard/po/it/dashboard.po create mode 100644 luci-mod-dashboard/po/ja/dashboard.po create mode 100644 luci-mod-dashboard/po/ko/dashboard.po create mode 100644 luci-mod-dashboard/po/mr/dashboard.po create mode 100644 luci-mod-dashboard/po/ms/dashboard.po create mode 100644 luci-mod-dashboard/po/nb_NO/dashboard.po create mode 100644 luci-mod-dashboard/po/nl/dashboard.po create mode 100644 luci-mod-dashboard/po/pl/dashboard.po create mode 100644 luci-mod-dashboard/po/pt/dashboard.po create mode 100644 luci-mod-dashboard/po/pt_BR/dashboard.po create mode 100644 luci-mod-dashboard/po/ro/dashboard.po mode change 100755 => 100644 luci-mod-dashboard/po/ru/dashboard.po create mode 100644 luci-mod-dashboard/po/sk/dashboard.po create mode 100644 luci-mod-dashboard/po/sv/dashboard.po mode change 100755 => 100644 luci-mod-dashboard/po/templates/dashboard.pot create mode 100644 luci-mod-dashboard/po/tr/dashboard.po create mode 100644 luci-mod-dashboard/po/uk/dashboard.po create mode 100644 luci-mod-dashboard/po/vi/dashboard.po mode change 100755 => 100644 luci-mod-dashboard/po/zh_Hans/dashboard.po create mode 100644 luci-mod-dashboard/po/zh_Hant/dashboard.po mode change 100755 => 100644 luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json mode change 100755 => 100644 luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json mode change 100755 => 100644 luci-mod-network/Makefile mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/tools/network.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js delete mode 100755 luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/routes.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/switch.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js mode change 100755 => 100644 luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json mode change 100755 => 100644 luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json mode change 100755 => 100644 luci-proto-mbim/Makefile mode change 100755 => 100644 luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js delete mode 100755 luci-theme-ezengreen/Makefile delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/ezengreen/1omr-logo-apple.png delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/ezengreen/cascade.css delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/ezengreen/favicon.png delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/ezengreen/html5.js delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/ezengreen/mobile.css delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/cascade.css delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/ezenlink.png delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/favicon.ico delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/footer.png delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/mobile.css delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/omr-logo.png delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/outdoorrouter.png delete mode 100755 luci-theme-ezengreen/htdocs/luci-static/resources/menu-ezengreen.js delete mode 100755 luci-theme-ezengreen/luasrc/view/themes/ezengreen/footer.htm delete mode 100755 luci-theme-ezengreen/luasrc/view/themes/ezengreen/header.htm delete mode 100755 luci-theme-ezengreen/root/etc/uci-defaults/luci-theme-ezengreen mode change 100755 => 100644 luci-theme-openwrt-2020/Makefile mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css delete mode 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.png create mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg delete mode 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js delete mode 100755 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm rename luci-theme-openwrt-2020/{luasrc/view/themes/openwrt2020/footer.htm => ucode/template/themes/openwrt2020/footer.ut} (67%) mode change 100755 => 100644 create mode 100644 luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut mode change 100755 => 100644 msmtp/Makefile mode change 100755 => 100644 net-tools/Makefile delete mode 100755 net-tools/patches/mptcp-support.patch mode change 100755 => 100644 netifd/Makefile mode change 100755 => 100644 netifd/files/etc/hotplug.d/iface/00-netstate create mode 100755 netifd/files/etc/init.d/packet_steering mode change 100755 => 100644 netifd/files/etc/uci-defaults/14_migrate-dhcp-release mode change 100755 => 100644 netifd/files/etc/udhcpc.user rename netifd/files/{etc/hotplug.d/net/20-smp-packet-steering => usr/libexec/network/packet-steering.sh} (92%) delete mode 100755 netmaker-openwrt/LICENSE delete mode 100755 netmaker-openwrt/README.md delete mode 100755 netmaker-openwrt/netmaker/Makefile delete mode 100755 netmaker-openwrt/netmaker/root/etc/init.d/netclient delete mode 100755 netmaker-openwrt/scripts/build_ipk.sh delete mode 100755 nginx/Config.in delete mode 100755 nginx/Config_ssl.in delete mode 100755 nginx/Makefile delete mode 100755 nginx/files-luci-support/60_nginx-luci-support delete mode 100755 nginx/files-luci-support/70_nginx-luci-support-ssl delete mode 100755 nginx/files-luci-support/luci_nginx.conf delete mode 100755 nginx/files-luci-support/luci_nginx_ssl.conf delete mode 100755 nginx/files-luci-support/luci_uwsgi.conf delete mode 100755 nginx/files/nginx.init delete mode 100755 nginx/patches-lua-nginx/100-no_by_lua_block.patch delete mode 100755 nginx/patches/101-feature_test_fix.patch delete mode 100755 nginx/patches/102-sizeof_test_fix.patch delete mode 100755 nginx/patches/103-sys_nerr.patch delete mode 100755 nginx/patches/200-config.patch delete mode 100755 nginx/patches/201-ignore-invalid-options.patch delete mode 100755 nginx/patches/300-max-processes.patch mode change 100755 => 100644 protobuf/Makefile create mode 100644 protobuf/patches/010-rpath.patch mode change 100755 => 100644 serdisplib/Makefile create mode 100644 serdisplib/patches/002-allow-1bpp-framebuffer.patch create mode 100644 serdisplib/patches/010-cross-compile.patch mode change 100755 => 100644 speedtestcpp/Makefile delete mode 100755 upx/Makefile diff --git a/6in4/Makefile b/6in4/Makefile old mode 100755 new mode 100644 index d0f2ad30c..edbb7d71a --- a/6in4/Makefile +++ b/6in4/Makefile @@ -1,7 +1,5 @@ # # Copyright (C) 2010-2015 OpenWrt.org -# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) -# - Added gateway setting # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -10,8 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=6in4 -PKG_VERSION:=270 -PKG_RELEASE:=2 +PKG_RELEASE:=28 PKG_LICENSE:=GPL-2.0 include $(INCLUDE_DIR)/package.mk diff --git a/6in4/files/6in4.sh b/6in4/files/6in4.sh index cf17c86d8..5b5c7b36a 100755 --- a/6in4/files/6in4.sh +++ b/6in4/files/6in4.sh @@ -9,6 +9,20 @@ init_proto "$@" } +# Function taken from 6to4 package (6to4.sh), flipped returns +test_6in4_rfc1918() +{ + local oIFS="$IFS"; IFS="."; set -- $1; IFS="$oIFS" + [ $1 -eq 10 ] && return 1 + [ $1 -eq 192 ] && [ $2 -eq 168 ] && return 1 + [ $1 -eq 172 ] && [ $2 -ge 16 ] && [ $2 -le 31 ] && return 1 + + # RFC 6598 + [ $1 -eq 100 ] && [ $2 -ge 64 ] && [ $2 -le 127 ] && return 1 + + return 0 +} + proto_6in4_update() { sh -c ' timeout=5 @@ -31,8 +45,8 @@ proto_6in4_setup() { local iface="$2" local link="6in4-$cfg" - local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix ip6prefixes tunlink tunnelid username password updatekey gateway - json_get_vars mtu ttl tos ipaddr peeraddr ip6addr tunlink tunnelid username password updatekey gateway + local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix ip6prefixes tunlink tunnelid username password updatekey + json_get_vars mtu ttl tos ipaddr peeraddr ip6addr tunlink tunnelid username password updatekey json_for_each_item proto_6in4_add_prefix ip6prefix ip6prefixes [ -z "$peeraddr" ] && { @@ -41,7 +55,7 @@ proto_6in4_setup() { return } - [ -n "$tunlink" ] && ( proto_add_host_dependency "$cfg" "$peeraddr" "$tunlink" ) + ( proto_add_host_dependency "$cfg" "$peeraddr" "$tunlink" ) [ -z "$ipaddr" ] && { local wanif="$tunlink" @@ -61,15 +75,11 @@ proto_6in4_setup() { [ -n "$ip6addr" ] && { local local6="${ip6addr%%/*}" local mask6="${ip6addr##*/}" - [[ "$local6" = "$mask6" ]] && mask6= + [ "$local6" = "$mask6" ] && mask6= proto_add_ipv6_address "$local6" "$mask6" proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6" } - [ -n "$gateway" ] && { - proto_add_ipv6_route "::" 0 "$gateway" - } - for ip6prefix in $ip6prefixes; do proto_add_ipv6_prefix "$ip6prefix" proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix" @@ -101,6 +111,11 @@ proto_6in4_setup() { } local url="$http://ipv4.tunnelbroker.net/nic/update?hostname=$tunnelid" + + test_6in4_rfc1918 "$ipaddr" && { + local url="${url}&myip=${ipaddr}" + } + local try=0 local max=3 @@ -138,7 +153,6 @@ proto_6in4_init_config() { proto_config_add_string "username" proto_config_add_string "password" proto_config_add_string "updatekey" - proto_config_add_string "gateway" proto_config_add_int "mtu" proto_config_add_int "ttl" proto_config_add_string "tos" diff --git a/cryptodev-linux/Makefile b/cryptodev-linux/Makefile old mode 100755 new mode 100644 diff --git a/https-dns-proxy/Makefile b/https-dns-proxy/Makefile old mode 100755 new mode 100644 index abfb4be7a..ce7d70eeb --- a/https-dns-proxy/Makefile +++ b/https-dns-proxy/Makefile @@ -1,14 +1,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=https-dns-proxy -PKG_VERSION:=2021-11-22 -PKG_RELEASE:=3 +PKG_VERSION:=2023-05-25 +PKG_RELEASE:=2 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/aarond10/https_dns_proxy/ -PKG_SOURCE_DATE:=2021-11-22 -PKG_SOURCE_VERSION:=9336fd6272d67e8bb6e304fa54f3139a3d26f08f -PKG_MIRROR_HASH:=60b1ddabaf1db3a9ee19f3294a1df714364d580cef5e3c2161363c371a557456 +PKG_SOURCE_DATE:=$(PKG_VERSION) +PKG_SOURCE_VERSION:=d03e11572562f008f68df217a7378628f1bb7b79 +PKG_MIRROR_HASH:=5af3683c48bc9e493ca2761a6f7ee756431692a695d6008f61b8b92431036dca PKG_MAINTAINER:=Stan Grishin PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE @@ -16,20 +16,20 @@ PKG_LICENSE_FILES:=LICENSE include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk -CMAKE_OPTIONS += -DCLANG_TIDY_EXE= +CMAKE_OPTIONS += -DCLANG_TIDY_EXE= -DGIT_VERSION=$(PKG_VERSION)-$(PKG_RELEASE) define Package/https-dns-proxy SECTION:=net CATEGORY:=Network TITLE:=DNS Over HTTPS Proxy URL:=https://docs.openwrt.melmac.net/https-dns-proxy/ - DEPENDS:=+libcares +libcurl +libev +ca-bundle + DEPENDS:=+libcares +libcurl +libev +ca-bundle +jsonfilter CONFLICTS:=https_dns_proxy endef define Package/https-dns-proxy/description -https-dns-proxy is a light-weight DNS<-->HTTPS, non-caching translation proxy for the RFC 8484 DoH standard. -It receives regular (UDP) DNS requests and issues them via DoH. +Light-weight DNS-over-HTTPS, non-caching translation proxy for the RFC 8484 DoH standard. +It receives regular (UDP) DNS requests and resolves them via DoH resolver. Please see https://docs.openwrt.melmac.net/https-dns-proxy/ for more information. endef @@ -40,12 +40,14 @@ endef define Package/https-dns-proxy/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_DIR) ${1}/etc/config + $(INSTALL_DIR) $(1)/etc/config $(INSTALL_DIR) $(1)/etc/hotplug.d/iface + $(INSTALL_DIR) $(1)/etc/uci-defaults/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/https_dns_proxy $(1)/usr/sbin/https-dns-proxy $(INSTALL_BIN) ./files/https-dns-proxy.init $(1)/etc/init.d/https-dns-proxy - $(SED) "s|^\(PKG_VERSION\).*|\1='$(PKG_VERSION)-$(PKG_RELEASE)'|" $(1)/etc/init.d/https-dns-proxy + $(SED) "s|^\(readonly PKG_VERSION\).*|\1='$(PKG_VERSION)-$(PKG_RELEASE)'|" $(1)/etc/init.d/https-dns-proxy $(INSTALL_CONF) ./files/https-dns-proxy.config $(1)/etc/config/https-dns-proxy + $(INSTALL_BIN) ./files/https-dns-proxy.defaults $(1)/etc/uci-defaults/50-https-dns-proxy-migrate-options.sh endef $(eval $(call BuildPackage,https-dns-proxy)) diff --git a/https-dns-proxy/files/README.md b/https-dns-proxy/files/README.md old mode 100755 new mode 100644 diff --git a/https-dns-proxy/files/https-dns-proxy.config b/https-dns-proxy/files/https-dns-proxy.config old mode 100755 new mode 100644 index f08e03ca9..39b807b45 --- a/https-dns-proxy/files/https-dns-proxy.config +++ b/https-dns-proxy/files/https-dns-proxy.config @@ -1,5 +1,7 @@ config main 'config' - option update_dnsmasq_config '*' + option canary_domains_icloud '1' + option canary_domains_mozilla '1' + option dnsmasq_config_update '*' option force_dns '1' list force_dns_port '53' list force_dns_port '853' @@ -11,12 +13,13 @@ config main 'config' # list force_dns_port '4434' # list force_dns_port '5443' # list force_dns_port '8443' + option procd_trigger_wan6 '0' config https-dns-proxy option bootstrap_dns '1.1.1.1,1.0.0.1' option resolver_url 'https://cloudflare-dns.com/dns-query' option listen_addr '127.0.0.1' - option listen_port '5054' + option listen_port '5053' option user 'nobody' option group 'nogroup' @@ -24,6 +27,6 @@ config https-dns-proxy option bootstrap_dns '8.8.8.8,8.8.4.4' option resolver_url 'https://dns.google/dns-query' option listen_addr '127.0.0.1' - option listen_port '5053' + option listen_port '5054' option user 'nobody' option group 'nogroup' diff --git a/https-dns-proxy/files/https-dns-proxy.defaults b/https-dns-proxy/files/https-dns-proxy.defaults new file mode 100644 index 000000000..8321ea99b --- /dev/null +++ b/https-dns-proxy/files/https-dns-proxy.defaults @@ -0,0 +1,3 @@ +#!/bin/sh + sed -i "s|update_dnsmasq_config|dnsmasq_config_update|" "/etc/config/https-dns-proxy" + sed -i "s|wan6_trigger|procd_trigger_wan6|" "/etc/config/https-dns-proxy" diff --git a/https-dns-proxy/files/https-dns-proxy.hotplug.iface b/https-dns-proxy/files/https-dns-proxy.hotplug.iface old mode 100755 new mode 100644 diff --git a/https-dns-proxy/files/https-dns-proxy.init b/https-dns-proxy/files/https-dns-proxy.init index ef0ffc7d2..d63dad9c5 100755 --- a/https-dns-proxy/files/https-dns-proxy.init +++ b/https-dns-proxy/files/https-dns-proxy.init @@ -1,10 +1,9 @@ #!/bin/sh /etc/rc.common -# Copyright 2019-2020 Stan Grishin (stangri@melmac.net) -# shellcheck disable=SC2039,SC3043,SC3060 -PKG_VERSION='dev-test' +# Copyright 2019-2022 Stan Grishin (stangri@melmac.ca) +# shellcheck disable=SC1091,SC3043,SC3060 # shellcheck disable=SC2034 -START=80 +START=95 # shellcheck disable=SC2034 USE_PROCD=1 @@ -15,8 +14,60 @@ else EXTRA_COMMANDS='version' fi +readonly PKG_VERSION='dev-test' +readonly packageName='https-dns-proxy' +readonly serviceName="$packageName $PKG_VERSION" +readonly _OK_='\033[0;32m\xe2\x9c\x93\033[0m' +readonly _FAIL_='\033[0;31m\xe2\x9c\x97\033[0m' readonly PROG=/usr/sbin/https-dns-proxy -dnsmasqConfig=''; forceDNS=''; forceDNSPorts=''; +readonly BOOTSTRAP_CF='1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001' +readonly BOOTSTRAP_GOOGLE='8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844' +readonly DEFAULT_BOOTSTRAP="${BOOTSTRAP_CF},${BOOTSTRAP_GOOGLE}" +readonly canaryDomainsMozilla='use-application-dns.net' +readonly canaryDomainsiCloud='mask.icloud.com mask-h2.icloud.com' + +str_contains() { [ -n "$1" ] &&[ -n "$2" ] && [ "${1//$2}" != "$1" ]; } +is_mac_address() { expr "$1" : '[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]$' >/dev/null; } +is_ipv4() { expr "$1" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; } +is_ipv6() { ! is_mac_address "$1" && str_contains "$1" ":"; } +output() { + local msg memmsg logmsg + local sharedMemoryOutput="/dev/shm/$packageName-output" + [ -t 1 ] && printf "%b" "$@" + msg="${1//$serviceName /service }"; + if [ "$(printf "%b" "$msg" | wc -l)" -gt 0 ]; then + [ -s "$sharedMemoryOutput" ] && memmsg="$(cat "$sharedMemoryOutput")" + logmsg="$(printf "%b" "${memmsg}${msg}" | sed 's/\x1b\[[0-9;]*m//g')" + logger -t "$packageName" "$(printf "%b" "$logmsg")" + rm -f "$sharedMemoryOutput" + else + printf "%b" "$msg" >> "$sharedMemoryOutput" + fi +} +output_ok() { output "$_OK_"; } +output_okn() { output "${_OK_}\\n"; } +output_fail() { output "$_FAIL_"; } +output_failn() { output "${_FAIL_}\\n"; } +uci_add_list_if_new() { + local PACKAGE="$1" + local CONFIG="$2" + local OPTION="$3" + local VALUE="$4" + local i + [ -n "$PACKAGE" ] && [ -n "$CONFIG" ] && [ -n "$OPTION" ] && [ -n "$VALUE" ] || return 1 + for i in $(uci_get "$PACKAGE" "$CONFIG" "$OPTION"); do + [ "$i" = "$VALUE" ] && return 0 + done + uci_add_list "$PACKAGE" "$CONFIG" "$OPTION" "$VALUE" +} +uci_changes() { + local PACKAGE="$1" + local CONFIG="$2" + local OPTION="$3" + /sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} changes "$PACKAGE${CONFIG:+.$CONFIG}${OPTION:+.$OPTION}" +} + +dnsmasq_restart() { [ -x /etc/init.d/dnsmasq ] || return 0; /etc/init.d/dnsmasq restart >/dev/null 2>&1; } version() { echo "$PKG_VERSION"; } @@ -26,11 +77,10 @@ append_bool() { local section="$1" local option="$2" local value="$3" - local default="$4" + local default="${4:-0}" local _loctmp - [ -z "$default" ] && default="0" config_get_bool _loctmp "$section" "$option" "$default" - [ "$_loctmp" != "0" ] && xappend "$value" + [ "$_loctmp" -ne 0 ] && xappend "$value" } append_parm() { @@ -40,180 +90,280 @@ append_parm() { local default="$4" local _loctmp config_get _loctmp "$section" "$option" "$default" + [ -n "$_loctmp" ] && xappend "$switch $_loctmp" +} + +append_counter() { + local section="$1" + local option="$2" + local switch="$3" + local default="${4:-0}" + local _loctmp i + config_get _loctmp "$section" "$option" "$default" +# shellcheck disable=SC2086,SC2154 + for i in $(seq 1 $_loctmp); do + xappend '-v' + done +} + +append_bootstrap() { + local section="$1" + local option="$2" + local switch="$3" + local default="$4" + local _old_ifs="$IFS" + local _loctmp _newtmp i + config_get _loctmp "$section" "$option" "$default" [ -z "$_loctmp" ] && return 0 - xappend "$switch $_loctmp" + IFS=" ," + for i in $_loctmp; do + if { [ "$ipv6_resolvers_only" -eq 0 ] && is_ipv4 "$i"; } || \ + { [ "$ipv6_resolvers_only" -ne 0 ] && is_ipv6 "$i"; }; then + [ -z "$_newtmp" ] && _newtmp="$i" || _newtmp="${_newtmp},${i}" + fi + done + IFS="$_old_ifs" + [ -n "$_newtmp" ] && xappend "$switch $_newtmp" + [ "$ipv6_resolvers_only" -eq 0 ] && xappend '-4' +} + +boot() { + ubus -t 30 wait_for network.interface 2>/dev/null + rc_procd start_service 'on_boot' } start_instance() { - local cfg="$1" param listen_addr listen_port i + local cfg="$1" param listen_addr listen_port ipv6_resolvers_only p url iface + + config_get url "$cfg" 'resolver_url' + config_get_bool ipv6_resolvers_only "$cfg" 'use_ipv6_resolvers_only' '0' append_parm "$cfg" 'resolver_url' '-r' - append_parm "$cfg" 'polling_interval' '-i' append_parm "$cfg" 'listen_addr' '-a' '127.0.0.1' - append_parm "$cfg" 'listen_port' '-p' "$p" + append_parm "$cfg" 'listen_port' '-p' "$port" append_parm "$cfg" 'dscp_codepoint' '-c' - append_parm "$cfg" 'bootstrap_dns' '-b' + append_bootstrap "$cfg" 'bootstrap_dns' '-b' "$DEFAULT_BOOTSTRAP" append_parm "$cfg" 'user' '-u' 'nobody' append_parm "$cfg" 'group' '-g' 'nogroup' + append_parm "$cfg" 'ca_certs_file' '-C' + append_parm "$cfg" 'polling_interval' '-i' append_parm "$cfg" 'proxy_server' '-t' append_parm "$cfg" 'logfile' '-l' append_bool "$cfg" 'use_http1' '-x' - config_get_bool ipv6_resolvers_only "$cfg" 'use_ipv6_resolvers_only' '0' - config_get verbosity "$cfg" 'verbosity' '0' - -# shellcheck disable=SC2086,SC2154 - for i in $(seq 1 $verbosity); do - xappend '-v' - done -# shellcheck disable=SC2154 - if [ "$ipv6_resolvers_only" = 0 ]; then - xappend '-4' - fi + append_counter "$cfg" 'verbosity' '-v' '0' procd_open_instance # shellcheck disable=SC2086 - procd_set_param command ${PROG} ${param} + procd_set_param command $PROG $param procd_set_param stderr 1 procd_set_param stdout 1 procd_set_param respawn - procd_close_instance - - config_get listen_addr "$cfg" 'listen_addr' '127.0.0.1' - config_get listen_port "$cfg" 'listen_port' "$p" - - if [ "$dnsmasqConfig" = "*" ]; then - config_load 'dhcp' - config_foreach dnsmasq_add_doh_server 'dnsmasq' "${listen_addr}" "${listen_port}" - elif [ -n "$dnsmasqConfig" ]; then - for i in $dnsmasqConfig; do - dnsmasq_add_doh_server "@dnsmasq[${i}]" "${listen_addr}" "${listen_port}" - done - fi - p="$((p+1))" -} - -is_force_dns_active() { iptables-save 2>/dev/null | grep -q -w -- '--dport 53'; } - -start_service() { - local p=5053 c - config_load 'https-dns-proxy' - config_get dnsmasqConfig 'config' 'update_dnsmasq_config' '*' - config_get_bool forceDNS 'config' 'force_dns' '1' - config_get forceDNSPorts 'config' 'force_dns_port' '53 853' - dhcp_backup 'create' - config_load 'https-dns-proxy' - config_foreach start_instance 'https-dns-proxy' - if [ "$forceDNS" -ne 0 ]; then - procd_open_instance 'main' - procd_set_param command /bin/true - procd_set_param stdout 1 - procd_set_param stderr 1 - procd_open_data + procd_open_data + json_add_object mdns + procd_add_mdns_service "$packageName" 'udp' "$port" "DNS over HTTPS proxy" + json_close_object + json_add_string url "$url" + if [ "$force_dns" -ne 0 ]; then json_add_array firewall - for c in $forceDNSPorts; do - if netstat -tuln | grep 'LISTEN' | grep ":${c}" >/dev/null 2>&1 || [ "$c" = "53" ]; then - json_add_object "" - json_add_string type redirect - json_add_string target DNAT - json_add_string src lan - json_add_string proto "tcp udp" - json_add_string src_dport "$c" - json_add_string dest_port "$c" - json_add_boolean reflection 0 - json_close_object - else - json_add_object "" - json_add_string type rule - json_add_string src lan - json_add_string dest "*" - json_add_string proto "tcp udp" - json_add_string dest_port "$c" - json_add_string target REJECT - json_close_object - fi + for iface in $procd_fw_src_interfaces; do + for p in $force_dns_port; do + if netstat -tuln | grep 'LISTEN' | grep ":${p}" >/dev/null 2>&1 || [ "$p" = '53' ]; then + json_add_object '' + json_add_string type redirect + json_add_string target DNAT + json_add_string src "$iface" + json_add_string proto 'tcp udp' + json_add_string src_dport "$p" + json_add_string dest_port "$p" + json_add_string family any + json_add_boolean reflection 0 + json_close_object + else + json_add_object '' + json_add_string type rule + json_add_string src "$iface" + json_add_string dest '*' + json_add_string proto 'tcp udp' + json_add_string dest_port "$p" + json_add_string target REJECT + json_close_object + fi + done done json_close_array - procd_close_data - procd_close_instance fi - if [ -n "$(uci -q changes dhcp)" ]; then - uci -q commit dhcp - [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1 + procd_close_data + procd_close_instance + + if [ "$?" ]; then + config_get listen_addr "$cfg" 'listen_addr' '127.0.0.1' + config_get listen_port "$cfg" 'listen_port' "$port" + if [ "$dnsmasq_config_update" = '*' ]; then + config_load 'dhcp' + config_foreach dnsmasq_doh_server 'dnsmasq' 'add' "${listen_addr}" "${listen_port}" + elif [ -n "$dnsmasq_config_update" ]; then + for i in $dnsmasq_config_update; do + if [ -n "$(uci_get 'dhcp' "@dnsmasq[$i]")" ]; then + dnsmasq_doh_server "@dnsmasq[$i]" 'add' "${listen_addr}" "${listen_port}" + elif [ -n "$(uci_get 'dhcp' "$i")" ]; then + dnsmasq_doh_server "${i}" 'add' "${listen_addr}" "${listen_port}" + fi + done + fi + output_ok + port="$((port+1))" + force_dns=0 + else + output_fail fi } +start_service() { + local canaryDomains canary_domains_icloud canary_domains_mozilla + local dnsmasq_config_update force_dns force_dns_port + local procd_fw_src_interfaces + + local port=5053 + output "Starting $serviceName " + config_load "$packageName" + config_get_bool canary_domains_icloud 'config' 'canary_domains_icloud' '1' + config_get_bool canary_domains_mozilla 'config' 'canary_domains_mozilla' '1' + config_get_bool force_dns 'config' 'force_dns' '1' + config_get dnsmasq_config_update 'config' 'dnsmasq_config_update' '*' + config_get force_dns_port 'config' 'force_dns_port' '53 853' + config_get procd_fw_src_interfaces 'config' 'procd_fw_src_interfaces' 'lan' + if [ "$canary_domains_icloud" -ne 0 ]; then + canaryDomains="${canaryDomains:+$canaryDomains }${canaryDomainsiCloud}" + fi + if [ "$canary_domains_mozilla" -ne 0 ]; then + canaryDomains="${canaryDomains:+$canaryDomains }${canaryDomainsMozilla}" + fi + dhcp_backup 'create' + config_load "$packageName" + config_foreach start_instance "$packageName" + if [ -n "$(uci_changes dhcp)" ]; then + uci_commit 'dhcp' + dnsmasq_restart + fi + output "\\n" +} + stop_service() { - config_load 'https-dns-proxy' - config_get dnsmasqConfig 'config' 'update_dnsmasq_config' '*' - dhcp_backup 'restore' - if [ -n "$(uci -q changes dhcp)" ]; then - uci -q commit dhcp - [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1 + local canaryDomains canary_domains_icloud canary_domains_mozilla + local dnsmasq_config_update + local s=0 + output "Stopping $serviceName " + config_load "$packageName" + config_get dnsmasq_config_update 'config' 'dnsmasq_config_update' '*' + config_get_bool canary_domains_icloud 'config' 'canary_domains_icloud' '1' + config_get_bool canary_domains_mozilla 'config' 'canary_domains_mozilla' '1' + if [ "$canary_domains_icloud" -ne 0 ]; then + canaryDomains="${canaryDomains:+$canaryDomains }${canaryDomainsiCloud}" fi + if [ "$canary_domains_mozilla" -ne 0 ]; then + canaryDomains="${canaryDomains:+$canaryDomains }${canaryDomainsMozilla}" + fi + dhcp_backup 'restore' + if [ -n "$(uci_changes dhcp)" ]; then + uci_commit 'dhcp' + dnsmasq_restart || s=1 + fi +# shellcheck disable=SC2015 + [ "$s" -eq 0 ] && output_okn || output_failn } +# shellcheck disable=SC1091 service_triggers() { - procd_add_config_trigger "config.change" "https-dns-proxy" /etc/init.d/https-dns-proxy reload + local wan wan6 i + local procd_trigger_wan6 + config_load "$packageName" + config_get_bool procd_trigger_wan6 'config' 'procd_trigger_wan6' '0' + . /lib/functions/network.sh + network_flush_cache + network_find_wan wan + wan="${wan:-wan}" + if [ "$procd_trigger_wan6" -ne 0 ]; then + network_find_wan6 wan6 + wan6="${wan6:-wan6}" + fi + for i in "$wan" "$wan6"; do + [ -n "$i" ] && procd_add_interface_trigger "interface.*" "$i" "/etc/init.d/${packageName}" restart + done + procd_add_config_trigger "config.change" "$packageName" "/etc/init.d/${packageName}" reload } service_started() { procd_set_config_changed firewall; } service_stopped() { procd_set_config_changed firewall; } +restart() { procd_send_signal "$packageName"; rc_procd start_service; } -dnsmasq_add_doh_server() { - local cfg="$1" address="$2" port="$3" - case $address in - 0.0.0.0|::ffff:0.0.0.0) address='127.0.0.1';; - ::) address='::1';; +dnsmasq_doh_server() { + local cfg="$1" param="$2" address="${3:-127.0.0.1}" port="$4" i + case "$param" in + add) + if [ "$force_dns" -ne 0 ]; then + for i in $canaryDomains; do + uci_add_list_if_new 'dhcp' "$cfg" 'server' "/${i}/" + done + fi + case $address in + 0.0.0.0|::ffff:0.0.0.0) address='127.0.0.1';; + ::) address='::1';; + esac + uci_add_list_if_new 'dhcp' "$cfg" 'server' "${address}#${port}" + ;; + remove) + eval "$(ubus call service list "{ 'verbose': true, 'name': '$packageName' }" | jsonfilter -F '# ' -e 'TUPLES=@[*].instances[*].command[4,6]')" + for i in $TUPLES; do + uci_remove_list 'dhcp' "$cfg" 'server' "$i" + done + for i in $canaryDomains; do + uci_remove_list 'dhcp' "$cfg" 'server' "/${i}/" + done + ;; esac - uci -q del_list "dhcp.${cfg}.server=${address}#${port}" - uci -q add_list "dhcp.${cfg}.server=${address}#${port}" } dnsmasq_create_server_backup() { - local cfg="$1" - local i - uci -q get "dhcp.${cfg}" >/dev/null || return 1 - if ! uci -q get "dhcp.${cfg}.doh_backup_noresolv" >/dev/null; then - if [ -z "$(uci -q get "dhcp.${cfg}.noresolv")" ]; then - uci -q set "dhcp.${cfg}.noresolv=1" - uci -q set "dhcp.${cfg}.doh_backup_noresolv=-1" - elif [ "$(uci -q get "dhcp.${cfg}.noresolv")" != "1" ]; then - uci -q set "dhcp.${cfg}.noresolv=1" - uci -q set "dhcp.${cfg}.doh_backup_noresolv=0" + local cfg="$1" i + [ -n "$(uci_get 'dhcp' "$cfg")" ] || return 1 + if [ -z "$(uci_get 'dhcp' "$cfg" 'doh_backup_noresolv')" ]; then + if [ -z "$(uci_get 'dhcp' "$cfg" 'noresolv')" ]; then + uci_set 'dhcp' "$cfg" 'doh_backup_noresolv' '-1' + else + uci_set 'dhcp' "$cfg" 'doh_backup_noresolv' "$(uci_get 'dhcp' "$cfg" noresolv)" fi + uci_set 'dhcp' "$cfg" 'noresolv' 1 fi - if ! uci -q get "dhcp.${cfg}.doh_backup_server" >/dev/null; then - if [ -z "$(uci -q get "dhcp.${cfg}.server")" ]; then - uci -q add_list "dhcp.${cfg}.doh_backup_server=" + if [ -z "$(uci_get 'dhcp' "$cfg" 'doh_backup_server')" ]; then + if [ -z "$(uci_get 'dhcp' "$cfg" 'server')" ]; then + uci_add_list 'dhcp' "$cfg" 'doh_backup_server' "" fi - for i in $(uci -q get "dhcp.${cfg}.server"); do - uci -q add_list "dhcp.${cfg}.doh_backup_server=$i" + for i in $(uci_get 'dhcp' "$cfg" 'server'); do + uci_add_list 'dhcp' "$cfg" 'doh_backup_server' "$i" if [ "$i" = "$(echo "$i" | tr -d /\#)" ]; then - uci -q del_list "dhcp.${cfg}.server=$i" + uci_remove_list 'dhcp' "$cfg" 'server' "$i" fi done - uci -q del_list "dhcp.${cfg}.server=127.0.0.1#5353" fi return 0 } dnsmasq_restore_server_backup() { - local cfg="$1" - local i - uci -q get "dhcp.${cfg}" >/dev/null || return 0 - if uci -q get "dhcp.${cfg}.doh_backup_noresolv" >/dev/null; then - if [ "$(uci -q get "dhcp.${cfg}.doh_backup_noresolv")" = "0" ]; then - uci -q set "dhcp.${cfg}.noresolv=0" - else - uci -q del "dhcp.${cfg}.noresolv" + local cfg="$1" i + [ -n "$(uci_get 'dhcp' "$cfg")" ] || return 0 + if [ -n "$(uci_get 'dhcp' "$cfg" 'doh_backup_noresolv')" ]; then + if [ "$(uci_get 'dhcp' "$cfg" 'doh_backup_noresolv')" = "-1" ]; then + uci_remove 'dhcp' "$cfg" 'noresolv' + else + uci_set 'dhcp' "$cfg" 'noresolv' "$(uci_get 'dhcp' "$cfg" 'doh_backup_noresolv')" fi - uci -q del "dhcp.${cfg}.doh_backup_noresolv" + uci_remove 'dhcp' "$cfg" 'doh_backup_noresolv' fi - if uci -q get "dhcp.${cfg}.doh_backup_server" >/dev/null; then - uci -q del "dhcp.${cfg}.server" - for i in $(uci -q get "dhcp.${cfg}.doh_backup_server"); do - uci -q add_list "dhcp.${cfg}.server=$i" + if uci_get 'dhcp' "$cfg" 'doh_backup_server' >/dev/null 2>&1; then + dnsmasq_doh_server "$cfg" 'remove' + for i in $(uci_get 'dhcp' "$cfg" 'doh_backup_server'); do + uci_add_list_if_new 'dhcp' "$cfg" 'server' "$i" done - uci -q del "dhcp.${cfg}.doh_backup_server" + uci_remove 'dhcp' "$cfg" 'doh_backup_server' fi } @@ -222,12 +372,15 @@ dhcp_backup() { config_load 'dhcp' case "$1" in create) - if [ "$dnsmasqConfig" = "*" ]; then + if [ "$dnsmasq_config_update" = "*" ]; then config_foreach dnsmasq_create_server_backup 'dnsmasq' - elif [ -n "$dnsmasqConfig" ]; then - for i in $dnsmasqConfig; do - dnsmasq_create_server_backup "@dnsmasq[${i}]" || \ + elif [ -n "$dnsmasq_config_update" ]; then + for i in $dnsmasq_config_update; do + if [ -n "$(uci_get 'dhcp' "@dnsmasq[$i]")" ]; then + dnsmasq_create_server_backup "@dnsmasq[$i]" + elif [ -n "$(uci_get 'dhcp' "$i")" ]; then dnsmasq_create_server_backup "$i" + fi done fi ;; diff --git a/https-dns-proxy/patches/010-fix-cmakelists.patch b/https-dns-proxy/patches/010-cmakelists-remove-cflags.patch old mode 100755 new mode 100644 similarity index 56% rename from https-dns-proxy/patches/010-fix-cmakelists.patch rename to https-dns-proxy/patches/010-cmakelists-remove-cflags.patch index 106142579..cd60c6dc0 --- a/https-dns-proxy/patches/010-fix-cmakelists.patch +++ b/https-dns-proxy/patches/010-cmakelists-remove-cflags.patch @@ -1,13 +1,13 @@ --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -21,9 +21,9 @@ if(NOT CMAKE_BUILD_TYPE) - message(STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified.") +@@ -25,9 +25,9 @@ if (NOT CMAKE_INSTALL_BINDIR) + set(CMAKE_INSTALL_BINDIR bin) endif() --set(CMAKE_C_FLAGS "-Wall -Wextra --pedantic -Wno-strict-aliasing -Wno-variadic-macros") +-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra --pedantic -Wno-strict-aliasing -Wno-variadic-macros") -set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG") -set(CMAKE_C_FLAGS_RELEASE "-O2") -+#set(CMAKE_C_FLAGS "-Wall -Wextra --pedantic -Wno-strict-aliasing -Wno-variadic-macros") ++#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra --pedantic -Wno-strict-aliasing -Wno-variadic-macros") +#set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG") +#set(CMAKE_C_FLAGS_RELEASE "-O2") diff --git a/https-dns-proxy/patches/020-src-options.c-add-version.patch b/https-dns-proxy/patches/020-src-options.c-add-version.patch new file mode 100644 index 000000000..8bb2d9361 --- /dev/null +++ b/https-dns-proxy/patches/020-src-options.c-add-version.patch @@ -0,0 +1,11 @@ +--- a/src/options.c ++++ b/src/options.c +@@ -22,7 +22,7 @@ const char * options_sw_version() { + #ifdef SW_VERSION + return SW_VERSION; + #else +- return "2023.01.01-atLeast"; // update date sometimes, like 1-2 times a year ++ return "2023-05-25-1"; // update date sometimes, like 1-2 times a year + #endif + } + diff --git a/https-dns-proxy/test.sh b/https-dns-proxy/test.sh old mode 100755 new mode 100644 index 45469ed96..443b747a0 --- a/https-dns-proxy/test.sh +++ b/https-dns-proxy/test.sh @@ -1,3 +1,3 @@ #!/bin/sh -/etc/init.d/"$1" version 2>&1 | grep "$2" +/etc/init.d/"$1" version 2>&1 | grep "$2" && "$1" -V 2>&1 | grep "$2" diff --git a/luci-app-adguardhome/Makefile b/luci-app-adguardhome/Makefile deleted file mode 100755 index db03e8acb..000000000 --- a/luci-app-adguardhome/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) 2018-2019 Lienol -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=luci-app-adguardhome -PKG_MAINTAINER:= - -LUCI_TITLE:=LuCI app for AdGuardHome -LUCI_PKGARCH:=all -LUCI_DEPENDS:=+ca-certs +curl +wget-ssl +PACKAGE_$(PKG_NAME)_INCLUDE_binary:adguardhome -LUCI_DESCRIPTION:=LuCI support for AdGuardHome - -define Package/$(PKG_NAME)/config -config PACKAGE_$(PKG_NAME)_INCLUDE_binary - bool "Include Binary File" - default y -endef - -PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_binary - -define Package/luci-app-adguardhome/conffiles -/usr/share/AdGuardHome/links.txt -/etc/config/AdGuardHome -/etc/AdGuardHome.yaml -endef - -define Package/luci-app-adguardhome/postinst -#!/bin/sh - /etc/init.d/AdGuardHome enable >/dev/null 2>&1 - enable=$(uci get AdGuardHome.AdGuardHome.enabled 2>/dev/null) - if [ "$enable" == "1" ]; then - /etc/init.d/AdGuardHome reload - fi - rm -f /tmp/luci-indexcache - rm -f /tmp/luci-modulecache/* -exit 0 -endef - -define Package/luci-app-adguardhome/prerm -#!/bin/sh -if [ -z "$${IPKG_INSTROOT}" ]; then - /etc/init.d/AdGuardHome disable - /etc/init.d/AdGuardHome stop -uci -q batch <<-EOF >/dev/null 2>&1 - delete ucitrack.@AdGuardHome[-1] - commit ucitrack -EOF -fi -exit 0 -endef - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua b/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua deleted file mode 100755 index e9d37a766..000000000 --- a/luci-app-adguardhome/luasrc/controller/AdGuardHome.lua +++ /dev/null @@ -1,130 +0,0 @@ -module("luci.controller.AdGuardHome",package.seeall) -local fs=require"nixio.fs" -local http=require"luci.http" -local uci=require"luci.model.uci".cursor() -function index() -local page = entry({"admin", "services", "AdGuardHome"},alias("admin", "services", "AdGuardHome", "base"),_("AdGuard Home")) -page.order = 10 -page.dependent = true -page.acl_depends = { "luci-app-adguardhome" } -entry({"admin","services","AdGuardHome","base"},cbi("AdGuardHome/base"),_("Base Setting"),1).leaf = true -entry({"admin","services","AdGuardHome","log"},form("AdGuardHome/log"),_("Log"),2).leaf = true -entry({"admin","services","AdGuardHome","manual"},cbi("AdGuardHome/manual"),_("Manual Config"),3).leaf = true -entry({"admin","services","AdGuardHome","status"},call("act_status")).leaf=true -entry({"admin", "services", "AdGuardHome", "check"}, call("check_update")) -entry({"admin", "services", "AdGuardHome", "doupdate"}, call("do_update")) -entry({"admin", "services", "AdGuardHome", "getlog"}, call("get_log")) -entry({"admin", "services", "AdGuardHome", "dodellog"}, call("do_dellog")) -entry({"admin", "services", "AdGuardHome", "reloadconfig"}, call("reload_config")) -entry({"admin", "services", "AdGuardHome", "gettemplateconfig"}, call("get_template_config")) -end -function get_template_config() - local b - local d="" - for cnt in io.lines("/tmp/resolv.conf.d/resolv.conf.auto") do - b=string.match (cnt,"^[^#]*nameserver%s+([^%s]+)$") - if (b~=nil) then - d=d.." - "..b.."\n" - end - end - local f=io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+") - local tbl = {} - local a="" - while (1) do - a=f:read("*l") - if (a=="#bootstrap_dns") then - a=d - elseif (a=="#upstream_dns") then - a=d - elseif (a==nil) then - break - end - table.insert(tbl, a) - end - f:close() - http.prepare_content("text/plain; charset=utf-8") - http.write(table.concat(tbl, "\n")) -end -function reload_config() - fs.remove("/tmp/AdGuardHometmpconfig.yaml") - http.prepare_content("application/json") - http.write('') -end -function act_status() - local e={} - local binpath=uci:get("AdGuardHome","AdGuardHome","binpath") - e.running=luci.sys.call("pgrep "..binpath.." >/dev/null")==0 - e.redirect=(fs.readfile("/var/run/AdGredir")=="1") - http.prepare_content("application/json") - http.write_json(e) -end -function do_update() - fs.writefile("/var/run/lucilogpos","0") - http.prepare_content("application/json") - http.write('') - local arg - if luci.http.formvalue("force") == "1" then - arg="force" - else - arg="" - end - if fs.access("/var/run/update_core") then - if arg=="force" then - luci.sys.exec("kill $(pgrep /usr/share/AdGuardHome/update_core.sh) ; sh /usr/share/AdGuardHome/update_core.sh "..arg.." >/tmp/AdGuardHome_update.log 2>&1 &") - end - else - luci.sys.exec("sh /usr/share/AdGuardHome/update_core.sh "..arg.." >/tmp/AdGuardHome_update.log 2>&1 &") - end -end -function get_log() - local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") - if (logfile==nil) then - http.write("no log available\n") - return - elseif (logfile=="syslog") then - if not fs.access("/var/run/AdGuardHomesyslog") then - luci.sys.exec("(/usr/share/AdGuardHome/getsyslog.sh &); sleep 1;") - end - logfile="/tmp/AdGuardHometmp.log" - fs.writefile("/var/run/AdGuardHomesyslog","1") - elseif not fs.access(logfile) then - http.write("") - return - end - http.prepare_content("text/plain; charset=utf-8") - local fdp - if fs.access("/var/run/lucilogreload") then - fdp=0 - fs.remove("/var/run/lucilogreload") - else - fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0 - end - local f=io.open(logfile, "r+") - f:seek("set",fdp) - local a=f:read(2048000) or "" - fdp=f:seek() - fs.writefile("/var/run/lucilogpos",tostring(fdp)) - f:close() - http.write(a) -end -function do_dellog() - local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") - fs.writefile(logfile,"") - http.prepare_content("application/json") - http.write('') -end -function check_update() - http.prepare_content("text/plain; charset=utf-8") - local fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0 - local f=io.open("/tmp/AdGuardHome_update.log", "r+") - f:seek("set",fdp) - local a=f:read(2048000) or "" - fdp=f:seek() - fs.writefile("/var/run/lucilogpos",tostring(fdp)) - f:close() -if fs.access("/var/run/update_core") then - http.write(a) -else - http.write(a.."\0") -end -end diff --git a/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua b/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua deleted file mode 100755 index 6896b61ef..000000000 --- a/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua +++ /dev/null @@ -1,304 +0,0 @@ -require("luci.sys") -require("luci.util") -require("io") -local m,s,o,o1 -local fs=require"nixio.fs" -local uci=require"luci.model.uci".cursor() -local configpath=uci:get("AdGuardHome","AdGuardHome","configpath") or "/etc/AdGuardHome.yaml" -local binpath=uci:get("AdGuardHome","AdGuardHome","binpath") or "/usr/bin/AdGuardHome" -httpport=uci:get("AdGuardHome","AdGuardHome","httpport") or "3000" -m = Map("AdGuardHome", "AdGuard Home") -m.description = translate("Free and open source, powerful network-wide ads & trackers blocking DNS server.") -m:section(SimpleSection).template = "AdGuardHome/AdGuardHome_status" - -s = m:section(TypedSection, "AdGuardHome") -s.anonymous=true -s.addremove=false ----- enable -o = s:option(Flag, "enabled", translate("Enable")) -o.default = 0 -o.optional = false ----- httpport -o =s:option(Value,"httpport",translate("Browser management port")) -o.placeholder=3000 -o.default=3000 -o.datatype="port" -o.optional = false -o.description = translate("") ----- update warning not safe -local binmtime=uci:get("AdGuardHome","AdGuardHome","binmtime") or "0" -local e="" -if not fs.access(configpath) then - e=e.." "..translate("no config") -end -if not fs.access(binpath) then - e=e.." "..translate("no core") -else - local version=uci:get("AdGuardHome","AdGuardHome","version") - local testtime=fs.stat(binpath,"mtime") - if testtime~=tonumber(binmtime) or version==nil then - local tmp=luci.sys.exec(binpath.." --version | grep -m 1 -E 'v[0-9.]+' -o ") - version=string.sub(tmp, 1) - if version=="" then version="core error" end - uci:set("AdGuardHome","AdGuardHome","version",version) - uci:set("AdGuardHome","AdGuardHome","binmtime",testtime) - uci:save("AdGuardHome") - end - e=version..e -end -o=s:option(Button,"restart",translate("Update")) -o.inputtitle=translate("Update core version") -o.template = "AdGuardHome/AdGuardHome_check" -o.showfastconfig=(not fs.access(configpath)) -o.description=string.format(translate("core version:").."%s ",e) ----- port warning not safe -local port=luci.sys.exec("awk '/ port:/{printf($2);exit;}' "..configpath.." 2>nul") -if (port=="") then port="?" end ----- Redirect -o = s:option(ListValue, "redirect", port..translate("Redirect"), translate("AdGuardHome redirect mode")) -o.placeholder = "none" -o:value("none", translate("none")) -o:value("dnsmasq-upstream", translate("Run as dnsmasq upstream server")) -o:value("redirect", translate("Redirect 53 port to AdGuardHome")) -o:value("exchange", translate("Use port 53 replace dnsmasq")) -o.default = "none" -o.optional = true ----- bin path -o = s:option(Value, "binpath", translate("Bin Path"), translate("AdGuardHome Bin path if no bin will auto download")) -o.default = "/usr/bin/AdGuardHome" -o.datatype = "string" -o.optional = false -o.rmempty=false -o.validate=function(self, value) -if value=="" then return nil end -if fs.stat(value,"type")=="dir" then - fs.rmdir(value) -end -if fs.stat(value,"type")=="dir" then - if (m.message) then - m.message =m.message.."\nerror!bin path is a dir" - else - m.message ="error!bin path is a dir" - end - return nil -end -return value -end ---- upx -o = s:option(ListValue, "upxflag", translate("use upx to compress bin after download")) -o:value("", translate("none")) -o:value("-1", translate("compress faster")) -o:value("-9", translate("compress better")) -o:value("--best", translate("compress best(can be slow for big files)")) -o:value("--brute", translate("try all available compression methods & filters [slow]")) -o:value("--ultra-brute", translate("try even more compression variants [very slow]")) -o.default = "" -o.description=translate("bin use less space,but may have compatibility issues") -o.rmempty = true ----- config path -o = s:option(Value, "configpath", translate("Config Path"), translate("AdGuardHome config path")) -o.default = "/etc/AdGuardHome.yaml" -o.datatype = "string" -o.optional = false -o.rmempty=false -o.validate=function(self, value) -if value==nil then return nil end -if fs.stat(value,"type")=="dir" then - fs.rmdir(value) -end -if fs.stat(value,"type")=="dir" then - if m.message then - m.message =m.message.."\nerror!config path is a dir" - else - m.message ="error!config path is a dir" - end - return nil -end -return value -end ----- work dir -o = s:option(Value, "workdir", translate("Work dir"), translate("AdGuardHome work dir include rules,audit log and database")) -o.default = "/etc/AdGuardHome" -o.datatype = "string" -o.optional = false -o.rmempty=false -o.validate=function(self, value) -if value=="" then return nil end -if fs.stat(value,"type")=="reg" then - if m.message then - m.message =m.message.."\nerror!work dir is a file" - else - m.message ="error!work dir is a file" - end - return nil -end -if string.sub(value, -1)=="/" then - return string.sub(value, 1, -2) -else - return value -end -end ----- log file -o = s:option(Value, "logfile", translate("Runtime log file"), translate("AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log")) -o.datatype = "string" -o.rmempty = true -o.validate=function(self, value) -if fs.stat(value,"type")=="dir" then - fs.rmdir(value) -end -if fs.stat(value,"type")=="dir" then - if m.message then - m.message =m.message.."\nerror!log file is a dir" - else - m.message ="error!log file is a dir" - end - return nil -end -return value -end ----- debug -o = s:option(Flag, "verbose", translate("Verbose log")) -o.default = 0 -o.optional = true ----- gfwlist -local a=luci.sys.call("grep -m 1 -q programadd "..configpath) -if (a==0) then -a="Added" -else -a="Not added" -end -o=s:option(Button,"gfwdel",translate("Del gfwlist"),translate(a)) -o.optional = true -o.inputtitle=translate("Del") -o.write=function() - luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh del 2>&1") - luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome")) -end -o=s:option(Button,"gfwadd",translate("Add gfwlist"),translate(a)) -o.optional = true -o.inputtitle=translate("Add") -o.write=function() - luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh 2>&1") - luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome")) -end -o = s:option(Value, "gfwupstream", translate("Gfwlist upstream dns server"), translate("Gfwlist domain upstream dns service")..translate(a)) -o.default = "tcp://208.67.220.220:5353" -o.datatype = "string" -o.optional = true ----- chpass -o = s:option(Value, "hashpass", translate("Change browser management password"), translate("Press load culculate model and culculate finally save/apply")) -o.default = "" -o.datatype = "string" -o.template = "AdGuardHome/AdGuardHome_chpass" -o.optional = true ----- upgrade protect -o = s:option(MultiValue, "upprotect", translate("Keep files when system upgrade")) -o:value("$binpath",translate("core bin")) -o:value("$configpath",translate("config file")) -o:value("$logfile",translate("log file")) -o:value("$workdir/data/sessions.db",translate("sessions.db")) -o:value("$workdir/data/stats.db",translate("stats.db")) -o:value("$workdir/data/querylog.json",translate("querylog.json")) -o:value("$workdir/data/filters",translate("filters")) -o.widget = "checkbox" -o.default = nil -o.optional=true ----- wait net on boot -o = s:option(Flag, "waitonboot", translate("On boot when network ok restart")) -o.default = 1 -o.optional = true ----- backup workdir on shutdown -local workdir=uci:get("AdGuardHome","AdGuardHome","workdir") or "/etc/AdGuardHome" -o = s:option(MultiValue, "backupfile", translate("Backup workdir files when shutdown")) -o1 = s:option(Value, "backupwdpath", translate("Backup workdir path")) -local name -o:value("filters","filters") -o:value("stats.db","stats.db") -o:value("querylog.json","querylog.json") -o:value("sessions.db","sessions.db") -o1:depends ("backupfile", "filters") -o1:depends ("backupfile", "stats.db") -o1:depends ("backupfile", "querylog.json") -o1:depends ("backupfile", "sessions.db") -for name in fs.glob(workdir.."/data/*") -do - name=fs.basename (name) - if name~="filters" and name~="stats.db" and name~="querylog.json" and name~="sessions.db" then - o:value(name,name) - o1:depends ("backupfile", name) - end -end -o.widget = "checkbox" -o.default = nil -o.optional=false -o.description=translate("Will be restore when workdir/data is empty") -----backup workdir path - -o1.default = "/etc/AdGuardHome" -o1.datatype = "string" -o1.optional = false -o1.validate=function(self, value) -if fs.stat(value,"type")=="reg" then - if m.message then - m.message =m.message.."\nerror!backup dir is a file" - else - m.message ="error!backup dir is a file" - end - return nil -end -if string.sub(value,-1)=="/" then - return string.sub(value, 1, -2) -else - return value -end -end - -----Crontab -o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab")) -o:value("autoupdate",translate("Auto update core")) -o:value("cutquerylog",translate("Auto tail querylog")) -o:value("cutruntimelog",translate("Auto tail runtime log")) -o:value("autohost",translate("Auto update ipv6 hosts and restart adh")) -o:value("autogfw",translate("Auto update gfwlist and restart adh")) -o.widget = "checkbox" -o.default = nil -o.optional=true - -----downloadpath -o = s:option(TextValue, "downloadlinks",translate("Download links for update")) -o.optional = false -o.rows = 4 -o.wrap = "soft" -o.cfgvalue = function(self, section) - return fs.readfile("/usr/share/AdGuardHome/links.txt") -end -o.write = function(self, section, value) - fs.writefile("/usr/share/AdGuardHome/links.txt", value:gsub("\r\n", "\n")) -end -fs.writefile("/var/run/lucilogpos","0") -function m.on_commit(map) - if (fs.access("/var/run/AdGserverdis")) then - io.popen("/etc/init.d/AdGuardHome reload &") - return - end - local ucitracktest=uci:get("AdGuardHome","AdGuardHome","ucitracktest") - if ucitracktest=="1" then - return - elseif ucitracktest=="0" then - io.popen("/etc/init.d/AdGuardHome reload &") - else - if (fs.access("/var/run/AdGlucitest")) then - uci:set("AdGuardHome","AdGuardHome","ucitracktest","0") - io.popen("/etc/init.d/AdGuardHome reload &") - else - fs.writefile("/var/run/AdGlucitest","") - if (ucitracktest=="2") then - uci:set("AdGuardHome","AdGuardHome","ucitracktest","1") - else - uci:set("AdGuardHome","AdGuardHome","ucitracktest","2") - end - end - uci:save("AdGuardHome") - end -end -return m diff --git a/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua b/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua deleted file mode 100755 index 5d18a88db..000000000 --- a/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua +++ /dev/null @@ -1,16 +0,0 @@ -local fs=require"nixio.fs" -local uci=require"luci.model.uci".cursor() -local f,t -f=SimpleForm("logview") -f.reset = false -f.submit = false -t=f:field(TextValue,"conf") -t.rmempty=true -t.rows=20 -t.template="AdGuardHome/log" -t.readonly="readonly" -local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") or "" -t.timereplace=(logfile~="syslog" and logfile~="" ) -t.pollcheck=logfile~="" -fs.writefile("/var/run/lucilogreload","") -return f diff --git a/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua b/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua deleted file mode 100755 index ecf072bbc..000000000 --- a/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua +++ /dev/null @@ -1,97 +0,0 @@ -local m, s, o -local fs = require "nixio.fs" -local uci=require"luci.model.uci".cursor() -local sys=require"luci.sys" -require("string") -require("io") -require("table") -function gen_template_config() - local b - local d="" - for cnt in io.lines("/tmp/resolv.conf.d/resolv.conf.auto") do - b=string.match (cnt,"^[^#]*nameserver%s+([^%s]+)$") - if (b~=nil) then - d=d.." - "..b.."\n" - end - end - local f=io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+") - local tbl = {} - local a="" - while (1) do - a=f:read("*l") - if (a=="#bootstrap_dns") then - a=d - elseif (a=="#upstream_dns") then - a=d - elseif (a==nil) then - break - end - table.insert(tbl, a) - end - f:close() - return table.concat(tbl, "\n") -end -m = Map("AdGuardHome") -local configpath = uci:get("AdGuardHome","AdGuardHome","configpath") -local binpath = uci:get("AdGuardHome","AdGuardHome","binpath") -s = m:section(TypedSection, "AdGuardHome") -s.anonymous=true -s.addremove=false ---- config -o = s:option(TextValue, "escconf") -o.rows = 66 -o.wrap = "off" -o.rmempty = true -o.cfgvalue = function(self, section) - return fs.readfile("/tmp/AdGuardHometmpconfig.yaml") or fs.readfile(configpath) or gen_template_config() or "" -end -o.validate=function(self, value) - fs.writefile("/tmp/AdGuardHometmpconfig.yaml", value:gsub("\r\n", "\n")) - if fs.access(binpath) then - if (sys.call(binpath.." -c /tmp/AdGuardHometmpconfig.yaml --check-config 2> /tmp/AdGuardHometest.log")==0) then - return value - end - else - return value - end - luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome","manual")) - return nil -end -o.write = function(self, section, value) - fs.move("/tmp/AdGuardHometmpconfig.yaml",configpath) -end -o.remove = function(self, section, value) - fs.writefile(configpath, "") -end ---- js and reload button -o = s:option(DummyValue, "") -o.anonymous=true -o.template = "AdGuardHome/yamleditor" -if not fs.access(binpath) then - o.description=translate("WARNING!!! no bin found apply config will not be test") -end ---- log -if (fs.access("/tmp/AdGuardHometmpconfig.yaml")) then -local c=fs.readfile("/tmp/AdGuardHometest.log") -if (c~="") then -o = s:option(TextValue, "") -o.readonly=true -o.rows = 5 -o.rmempty = true -o.name="" -o.cfgvalue = function(self, section) - return fs.readfile("/tmp/AdGuardHometest.log") -end -end -end -function m.on_commit(map) - local ucitracktest=uci:get("AdGuardHome","AdGuardHome","ucitracktest") - if ucitracktest=="1" then - return - elseif ucitracktest=="0" then - io.popen("/etc/init.d/AdGuardHome reload &") - else - fs.writefile("/var/run/AdGlucitest","") - end -end -return m diff --git a/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm b/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm deleted file mode 100755 index 832a1df46..000000000 --- a/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm +++ /dev/null @@ -1,78 +0,0 @@ -<%+cbi/valueheader%> -<%local fs=require"nixio.fs"%> - - -<% if self.showfastconfig then %> - -<%end%> - - -<%+cbi/valuefooter%> diff --git a/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm b/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm deleted file mode 100755 index b6ff3ebb3..000000000 --- a/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm +++ /dev/null @@ -1,49 +0,0 @@ -<%+cbi/valueheader%> - - 0, "data-choices", { self.keylist, self.vallist }) - %> /> - <% if self.password then %><% end %> - -<%+cbi/valuefooter%> diff --git a/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm b/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm deleted file mode 100755 index 7e924d119..000000000 --- a/luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm +++ /dev/null @@ -1,27 +0,0 @@ - - -
-

- <%:Collecting data...%> -

-
\ No newline at end of file diff --git a/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm b/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm deleted file mode 100755 index 11a1f787a..000000000 --- a/luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm +++ /dev/null @@ -1,111 +0,0 @@ -<%+cbi/valueheader%> -<%:reverse%> -<%if self.timereplace then%> -<%:localtime%>
-<%end%> - - - - -<%+cbi/valuefooter%> diff --git a/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm b/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm deleted file mode 100755 index 639cb9988..000000000 --- a/luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm +++ /dev/null @@ -1,39 +0,0 @@ -<%+cbi/valueheader%> - - - - - - - - - -<%fs=require"nixio.fs"%> -<%if fs.access("/tmp/AdGuardHometmpconfig.yaml") then%> - -<%end%> - -<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-adguardhome/po/zh-cn b/luci-app-adguardhome/po/zh-cn deleted file mode 100755 index 8d69574dd..000000000 --- a/luci-app-adguardhome/po/zh-cn +++ /dev/null @@ -1 +0,0 @@ -zh_Hans \ No newline at end of file diff --git a/luci-app-adguardhome/po/zh_Hans/adguardhome.po b/luci-app-adguardhome/po/zh_Hans/adguardhome.po deleted file mode 100755 index 0ace89bae..000000000 --- a/luci-app-adguardhome/po/zh_Hans/adguardhome.po +++ /dev/null @@ -1,408 +0,0 @@ -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" - -#: /mnt/A/openwrt-latest/package/ctcgfw/luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua:27 -msgid "" -"/dev/null 2>&1 - if [ $? -eq 0 ]; then - return - fi - uci delete dhcp.@dnsmasq[0].server 2>/dev/null - uci add_list dhcp.@dnsmasq[0].server=$addr - for server in $OLD_SERVER; do - if [ "$server" = "$addr" ]; then - continue - fi - # uci add_list dhcp.@dnsmasq[0].server=$server - done - uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null - uci set dhcp.@dnsmasq[0].noresolv=1 - uci commit dhcp - /etc/init.d/dnsmasq restart -} - -stop_forward_dnsmasq() -{ - local OLD_PORT="$1" - addr="127.0.0.1#$OLD_PORT" - OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`" - echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1 - if [ $? -ne 0 ]; then - return - fi - - uci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null - addrlist="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`" - if [ -z "$addrlist" ] ; then - uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.d/resolv.conf.auto 2>/dev/null - uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null - fi - uci commit dhcp - /etc/init.d/dnsmasq restart -} - -set_iptable() -{ - local ipv6_server=$1 - local tcp_server=$2 - uci -q batch <<-EOF >/dev/null 2>&1 - delete firewall.AdGuardHome - set firewall.AdGuardHome=include - set firewall.AdGuardHome.type=script - set firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start - set firewall.AdGuardHome.reload=1 - commit firewall -EOF - - IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`" - for IP in $IPS - do - if [ "$tcp_server" == "1" ]; then - iptables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 - fi - iptables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 - done - - if [ "$ipv6_server" == 0 ]; then - return - fi - - IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`" - for IP in $IPS - do - if [ "$tcp_server" == "1" ]; then - ip6tables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 - fi - ip6tables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1 - done -} - -clear_iptable() -{ - uci -q batch <<-EOF >/dev/null 2>&1 - delete firewall.AdGuardHome - commit firewall -EOF - local OLD_PORT="$1" - local ipv6_server=$2 - IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`" - for IP in $IPS - do - iptables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 - iptables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 - done - - if [ "$ipv6_server" == 0 ]; then - return - fi - echo "warn ip6tables nat mod is needed" - IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`" - for IP in $IPS - do - ip6tables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 - ip6tables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1 - done -} - -service_triggers() { - procd_add_reload_trigger "$CONFIGURATION" - [ "$(uci get AdGuardHome.AdGuardHome.redirect)" == "redirect" ] && procd_add_reload_trigger firewall -} - -isrunning(){ - config_load "${CONFIGURATION}" - _isrunning - local r=$? - ([ "$r" == "0" ] && echo "running") || ([ "$r" == "1" ] && echo "not run" ) || echo "no bin" - return $r -} - -_isrunning(){ - config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome" - [ ! -f "$binpath" ] && return 2 - pgrep $binpath 2>&1 >/dev/null && return 0 - return 1 -} - -force_reload(){ - config_load "${CONFIGURATION}" - _isrunning && procd_send_signal "$CONFIGURATION" || start -} - -get_tz() -{ - SET_TZ="" - - if [ -e "/etc/localtime" ]; then - return - fi - - for tzfile in /etc/TZ /var/etc/TZ - do - if [ ! -e "$tzfile" ]; then - continue - fi - - tz="`cat $tzfile 2>/dev/null`" - done - - if [ -z "$tz" ]; then - return - fi - - SET_TZ=$tz -} - -rm_port53() -{ - local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1") - dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null) - if [ -z "$dnsmasq_port" ]; then - dnsmasq_port="53" - fi - if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then - if [ "$dnsmasq_port" == "53" ]; then - dnsmasq_port="1745" - fi - elif [ "$dnsmasq_port" == "53" ]; then - return - fi - config_editor "dns.port" "$dnsmasq_port" "$configpath" - uci set dhcp.@dnsmasq[0].port="53" - uci commit dhcp - config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome" - killall -9 $binpath - /etc/init.d/dnsmasq restart -} - -use_port53() -{ - local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1") - dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null) - if [ -z "$dnsmasq_port" ]; then - dnsmasq_port="53" - fi - if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then - if [ "$dnsmasq_port" == "53" ]; then - AdGuardHome_PORT="1745" - fi - elif [ "$AdGuardHome_PORT" == "53" ]; then - return - fi - config_editor "dns.port" "53" "$configpath" - uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT" - uci commit dhcp - /etc/init.d/dnsmasq reload -} - -do_redirect() -{ - config_load "${CONFIGURATION}" - _do_redirect $1 -} - -_do_redirect() -{ - local section="$CONFIGURATION" - args="" - ipv6_server=1 - tcp_server=0 - enabled=$1 - if [ "$enabled" == "1" ]; then - echo -n "1">/var/run/AdGredir - else - echo -n "0">/var/run/AdGredir - fi - config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml" - AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1") - if [ ! -s "$configpath" ]; then - cp -f /usr/share/AdGuardHome/AdGuardHome_template.yaml $configpath - fi - if [ -z "$AdGuardHome_PORT" ]; then - AdGuardHome_PORT="0" - fi - config_get "redirect" "$section" "redirect" "none" - config_get "old_redirect" "$section" "old_redirect" "none" - config_get "old_port" "$section" "old_port" "0" - config_get "old_enabled" "$section" "old_enabled" "0" - uci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port="53" >/dev/null 2>&1 - if [ "$old_enabled" = "1" -a "$old_redirect" == "exchange" ]; then - AdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null) - fi - - if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || [ "$old_enabled" = "1" -a "$enabled" = "0" ]; then - if [ "$old_redirect" != "none" ]; then - if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then - clear_iptable "$old_port" "$ipv6_server" - elif [ "$old_redirect" == "dnsmasq-upstream" ]; then - stop_forward_dnsmasq "$old_port" - elif [ "$old_redirect" == "exchange" ]; then - rm_port53 - fi - fi - elif [ "$old_enabled" = "1" -a "$enabled" = "1" ]; then - if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then - clear_iptable "$old_port" "$ipv6_server" - fi - fi - uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null - uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null - uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null - uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null - uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null - uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null - uci commit AdGuardHome - [ "$enabled" == "0" ] && return 1 - if [ "$AdGuardHome_PORT" == "0" ]; then - return 1 - fi - if [ "$redirect" = "redirect" ]; then - set_iptable $ipv6_server $tcp_server - elif [ "$redirect" = "dnsmasq-upstream" ]; then - set_forward_dnsmasq "$AdGuardHome_PORT" - elif [ "$redirect" == "exchange" -a "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" == "53" ]; then - use_port53 - fi -} - -get_filesystem() -{ -# print out path filesystem - echo $1 | awk ' - BEGIN{ - while (("mount"| getline ret) > 0) - { - split(ret,d); - fs[d[3]]=d[5]; - m=index(d[1],":") - if (m==0) - { - pt[d[3]]=d[1] - }else{ - pt[d[3]]=substr(d[1],m+1) - }}}{ - split($0,d,"/"); - if ("/" in fs) - { - result1=fs["/"]; - } - if ("/" in pt) - { - result2=pt["/"]; - } - for (i=2;i<=length(d);i++) - { - p[i]=p[i-1]"/"d[i]; - if (p[i] in fs) - { - result1=fs[p[i]]; - result2=pt[p[i]]; - } - } - if (result2 in fs){ - result=fs[result2]} - else{ - result=result1} - print(result);}' -} - -config_editor() -{ - awk -v yaml="$1" -v value="$2" -v file="$3" -v ro="$4" ' - BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);} - { - if (match($0,s""part[i]":")) - { - if (i==l) - { - split($0,t,": "); - if (ro==""){ - system("sed -i '\''"FNR"c \\"t[1]": "value"'\'' "file); - }else{ - print(t[2]); - } - exit; - } - s=s"[- ]{2}"; - i++; - } - }' $3 -} - -boot_service() { - rm /var/run/AdGserverdis >/dev/null 2>&1 - config_load "${CONFIGURATION}" - config_get waitonboot $CONFIGURATION waitonboot "0" - config_get_bool enabled $CONFIGURATION enabled 0 - config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome" - [ -f "$binpath" ] && start_service - if [ "$enabled" == "1" ] && [ "$waitonboot" == "1" ]; then - procd_open_instance "waitnet" - procd_set_param command "/usr/share/AdGuardHome/waitnet.sh" - procd_close_instance - echo "no net start pinging" - fi -} - -testbackup(){ - config_load "${CONFIGURATION}" - if [ "$1" == "backup" ]; then - backup - elif [ "$1" == "restore" ]; then - restore - fi -} - -restore() -{ - config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome" - config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome" - cp -u -r -f $backupwdpath/data $workdir -} - -backup() { - config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome" - mkdir -p $backupwdpath/data - config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome" - config_get backupfile $CONFIGURATION backupfile "" - for one in $backupfile; - do - while : - do - if [ -d "$backupwdpath/data/$one" ]; then - cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data 2>&1) - else - cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data/$one 2>&1) - fi - echo "$cpret" - echo "$cpret" | grep "no space left on device" - if [ "$?" == "0" ]; then - echo "磁盘已满,删除log重试中" - del_querylog && continue - rm -f -r $backupwdpath/data/filters - rm -f -r $workdir/data/filters && continue - echo "backup failed" - fi - break - done - done -} - -start_service() { - # Reading config - rm /var/run/AdGserverdis >/dev/null 2>&1 - config_load "${CONFIGURATION}" - # update password - config_get hashpass $CONFIGURATION hashpass "" - config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml" - if [ -n "$hashpass" ]; then - config_editor "users.password" "$hashpass" "$configpath" - uci set $CONFIGURATION.$CONFIGURATION.hashpass="" - fi - local enabled - config_get_bool enabled $CONFIGURATION enabled 0 - # update crontab - do_crontab - if [ "$enabled" == "0" ]; then - _do_redirect 0 - return - fi - #what need to do before reload - config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome" - - config_get backupfile $CONFIGURATION backupfile "" - mkdir -p $workdir/data - if [ -n "$backupfile" ] && [ ! -d "$workdir/data" ]; then - restore - fi - # for overlay data-stk-oo not suppport - local cwdfs=$(get_filesystem $workdir) - echo "workdir is a $cwdfs filesystem" - if [ "$cwdfs" == "jffs2" ]; then - echo "fs error ln db to tmp $workdir $cwdfs" - logger "AdGuardHome" "warning db redirect to tmp" - touch $workdir/data/stats.db - if [ ! -L $workdir/data/stats.db ]; then - mv -f $workdir/data/stats.db /tmp/stats.db 2>/dev/null - ln -s /tmp/stats.db $workdir/data/stats.db 2>/dev/null - fi - touch $workdir/data/sessions.db - if [ ! -L $workdir/data/sessions.db ]; then - mv -f $workdir/data/sessions.db /tmp/sessions.db 2>/dev/null - ln -s /tmp/sessions.db $workdir/data/sessions.db 2>/dev/null - fi - fi - local ADDITIONAL_ARGS="" - config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome" - - mkdir -p ${binpath%/*} - ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath" - ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir" - config_get httpport $CONFIGURATION httpport 3000 - ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport" - - # hack to save config file when upgrade system - config_get upprotect $CONFIGURATION upprotect "" - eval upprotect=${upprotect// /\\\\n} - echo -e "$upprotect">/lib/upgrade/keep.d/luci-app-adguardhome - - config_get logfile $CONFIGURATION logfile "" - if [ -n "$logfile" ]; then - ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile" - fi - - if [ ! -f "$binpath" ]; then - _do_redirect 0 - /usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log & - exit 0 - fi - - config_get_bool verbose $CONFIGURATION verbose 0 - if [ "$verbose" -eq 1 ]; then - ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v" - fi - - procd_open_instance - get_tz - if [ -n "$SET_TZ" ]; then - procd_set_param env TZ="$SET_TZ" - fi - procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} - procd_set_param limits core="unlimited" nofile="65535 65535" - procd_set_param stderr 1 - procd_set_param command $binpath $ADDITIONAL_ARGS - procd_set_param file "$configpath" "/etc/hosts" "/etc/config/AdGuardHome" - procd_close_instance - if [ -f "$configpath" ]; then - _do_redirect 1 - else - _do_redirect 0 - config_get "redirect" "AdGuardHome" "redirect" "none" - if [ "$redirect" != "none" ]; then - procd_open_instance "waitconfig" - procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh" - procd_close_instance - echo "no config start watching" - fi - fi - echo "AdGuardHome service enabled" - echo "luci enable switch=$enabled" - (sleep 10 && [ -z "$(pgrep $binpath)" ] && logger "AdGuardHome" "no process in 10s cancel redirect" && _do_redirect 0 )& - if [[ "`uci get bypass.@global[0].global_server 2>/dev/null`" && "`uci get bypass.@global[0].adguardhome 2>/dev/null`" == 1 && "$(uci get dhcp.@dnsmasq[0].port)" == "53" ]]; then - uci -q set AdGuardHome.AdGuardHome.redirect='exchange' - uci commit AdGuardHome - do_redirect 1 - fi -} - -reload_service() -{ - rm /var/run/AdGlucitest >/dev/null 2>&1 - echo "AdGuardHome reloading" - start -} - -del_querylog(){ - local btarget=$(ls $backupwdpath/data | grep -F "querylog.json" | sort -r | head -n 1) - local wtarget=$(ls $workdir/data | grep -F "querylog.json" | sort -r | head -n 1) - if [ "$btarget"x == "$wtarget"x ]; then - [ -z "$btarget" ] && return 1 - rm -f $workdir/data/$wtarget - rm -f $backupwdpath/data/$btarget - return 0 - fi - if [ "$btarget" \> "$wtarget" ]; then - rm -f $backupwdpath/data/$btarget - return 0 - else - rm -f $workdir/data/$wtarget - return 0 - fi -} - -stop_service() -{ - config_load "${CONFIGURATION}" - _do_redirect 0 - do_crontab - if [ "$1" != "nobackup" ]; then - config_get backupfile $CONFIGURATION backupfile "0" - if [ -n "$backupfile" ]; then - backup - fi - fi - echo "AdGuardHome service disabled" - touch /var/run/AdGserverdis -} - -boot() { - rc_procd boot_service "$@" - if eval "type service_started" 2>/dev/null >/dev/null; then - service_started - fi -} - -test_crontab(){ - config_load "${CONFIGURATION}" - do_crontab -} - -do_crontab(){ - config_get_bool enabled $CONFIGURATION enabled 0 - config_get crontab $CONFIGURATION crontab "" - local findstr default cronenable replace commit - local cronreload=0 - local commit=0 - findstr="/usr/share/AdGuardHome/update_core.sh" - default="30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1" - [ "$enabled" == "0" ] || [ "${crontab//autoupdate/}" == "$crontab" ] && cronenable=0 || cronenable=1 - crontab_editor - - config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome" - config_get lastworkdir $CONFIGURATION lastworkdir "/etc/AdGuardHome" - findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json" - #[ -n "$lastworkdir" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastworkdir/data/querylog.json" && [ "$lastworkdir" != "$workdir" ] && replace="${lastworkdir//\//\\/}/${workdir//\//\\/}" - default="0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json" - [ "$enabled" == "0" ] || [ "${crontab//cutquerylog/}" == "$crontab" ] && cronenable=0 || cronenable=1 - crontab_editor - #[ "$lastworkdir" != "$workdir" ] && uci set AdGuardHome.AdGuardHome.lastworkdir="$workdir" && commit=1 - - config_get logfile $CONFIGURATION logfile "" - config_get lastlogfile $CONFIGURATION lastlogfile "" - findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.logfile)" - default="30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.logfile)" - #[ -n "$lastlogfile" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastlogfile" && [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}" - [ "$logfile" == "syslog" ] || [ "$logfile" == "" ] || [ "$enabled" == "0" ] || [ "${crontab//cutruntimelog/}" == "$crontab" ] && cronenable=0 || cronenable=1 - crontab_editor - #[ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set AdGuardHome.AdGuardHome.lastlogfile="$logfile" && commit=1 - - findstr="/usr/share/AdGuardHome/addhost.sh" - default="0 * * * * /usr/share/AdGuardHome/addhost.sh" - [ "$enabled" == "0" ] || [ "${crontab//autohost/}" == "$crontab" ] && cronenable=0 || cronenable=1 - crontab_editor - [ "$cronenable" == "0" ] && /usr/share/AdGuardHome/addhost.sh "del" "noreload" || /usr/share/AdGuardHome/addhost.sh "" "noreload" - - findstr="/usr/share/AdGuardHome/gfw2adg.sh" - default="30 3 * * * /usr/share/AdGuardHome/gfw2adg.sh" - [ "$enabled" == "0" ] || [ "${crontab//autogfw/}" == "$crontab" ] && cronenable=0 || cronenable=1 - crontab_editor - [ "$cronreload" -gt 0 ] && /etc/init.d/cron restart - #[ "$commit" -gt 0 ] && uci commit AdGuardHome -} - -crontab_editor(){ - #usage input: - #findstr= - #default= - #cronenable= - #replace="${last//\//\\/}/${now//\//\\/}" - #output:cronreload:if >1 please /etc/init.d/cron restart manual - local testline reload - local line="$(grep "$findstr" $CRON_FILE)" - [ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace="" - if [ "${line:0:1}" != "#" ]; then - if [ $cronenable -eq 1 ]; then - [ -z "$line" ] && line="$default" && reload="1" - if [ -n "$reload" ]; then - sed -i "\,$findstr,d" $CRON_FILE - echo "$line" >> $CRON_FILE - cronreload=$((cronreload+1)) - fi - elif [ -n "$line" ]; then - sed -i "\,$findstr,d" $CRON_FILE - echo "#$line" >> $CRON_FILE - cronreload=$((cronreload+1)) - fi - else - if [ $cronenable -eq 1 ]; then - sed -i "\,$findstr,d" $CRON_FILE - echo "${line:1}" >> $CRON_FILE - cronreload=$((cronreload+1)) - elif [ -z "$reload" ]; then - sed -i "\,$findstr,d" $CRON_FILE - echo "$line" >> $CRON_FILE - fi - fi -} diff --git a/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome b/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome deleted file mode 100755 index 37e192cdd..000000000 --- a/luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -uci -q batch <<-EOF >/dev/null 2>&1 - delete ucitrack.@AdGuardHome[-1] - add ucitrack AdGuardHome - set ucitrack.@AdGuardHome[-1].init=AdGuardHome - commit ucitrack - delete AdGuardHome.AdGuardHome.ucitracktest - /etc/init.d/AdGuardHome restart -EOF - -rm -f /tmp/luci-indexcache - -chmod +x /etc/init.d/AdGuardHome /usr/share/AdGuardHome/* -exit 0 diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml b/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml deleted file mode 100755 index 612a57706..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml +++ /dev/null @@ -1,131 +0,0 @@ -bind_host: 0.0.0.0 -bind_port: 3000 -beta_bind_port: 0 -users: -- name: root - password: $2y$10$dwn0hTYoECQMZETBErGlzOId2VANOVsPHsuH13TM/8KnysM5Dh/ve -auth_attempts: 5 -block_auth_min: 15 -http_proxy: "" -language: zh-cn -debug_pprof: false -web_session_ttl: 720 -dns: - bind_hosts: - - 0.0.0.0 - port: 1745 - statistics_interval: 30 - querylog_enabled: true - querylog_file_enabled: true - querylog_interval: 6h - querylog_size_memory: 1000 - anonymize_client_ip: false - protection_enabled: true - blocking_mode: default - blocking_ipv4: "" - blocking_ipv6: "" - blocked_response_ttl: 60 - parental_block_host: family-block.dns.adguard.com - safebrowsing_block_host: standard-block.dns.adguard.com - ratelimit: 0 - ratelimit_whitelist: [] - refuse_any: false - upstream_dns: - - 223.5.5.5 - upstream_dns_file: "" - bootstrap_dns: - - 119.29.29.29 - - 223.5.5.5 - all_servers: false - fastest_addr: false - fastest_timeout: 1s - allowed_clients: [] - disallowed_clients: [] - blocked_hosts: - - version.bind - - id.server - - hostname.bind - trusted_proxies: - - 127.0.0.0/8 - - ::1/128 - cache_size: 4194304 - cache_ttl_min: 0 - cache_ttl_max: 0 - cache_optimistic: true - bogus_nxdomain: [] - aaaa_disabled: false - enable_dnssec: false - edns_client_subnet: false - max_goroutines: 300 - ipset: [] - filtering_enabled: true - filters_update_interval: 24 - parental_enabled: false - safesearch_enabled: false - safebrowsing_enabled: false - safebrowsing_cache_size: 1048576 - safesearch_cache_size: 1048576 - parental_cache_size: 1048576 - cache_time: 30 - rewrites: [] - blocked_services: [] - upstream_timeout: 10s - local_domain_name: lan - resolve_clients: true - use_private_ptr_resolvers: true - local_ptr_upstreams: [] -tls: - enabled: false - server_name: "" - force_https: false - port_https: 443 - port_dns_over_tls: 853 - port_dns_over_quic: 784 - port_dnscrypt: 0 - dnscrypt_config_file: "" - allow_unencrypted_doh: false - strict_sni_check: false - certificate_chain: "" - private_key: "" - certificate_path: "" - private_key_path: "" -filters: -- enabled: true - url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt - name: AdGuard DNS filter - id: 1628750870 -- enabled: true - url: https://anti-ad.net/easylist.txt - name: 'CHN: anti-AD' - id: 1628750871 -whitelist_filters: [] -user_rules: [] -dhcp: - enabled: false - interface_name: "" - dhcpv4: - gateway_ip: "" - subnet_mask: "" - range_start: "" - range_end: "" - lease_duration: 86400 - icmp_timeout_msec: 1000 - options: [] - dhcpv6: - range_start: "" - lease_duration: 86400 - ra_slaac_only: false - ra_allow_slaac: false -clients: [] -log_compress: false -log_localtime: false -log_max_backups: 0 -log_max_size: 100 -log_max_age: 3 -log_file: "" -verbose: false -os: - group: "" - user: "" - rlimit_nofile: 0 -schema_version: 12 diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh deleted file mode 100755 index 6c6b7b769..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -checkmd5(){ -local nowmd5=$(md5sum /etc/hosts) -nowmd5=${nowmd5%% *} -local lastmd5=$(uci get AdGuardHome.AdGuardHome.hostsmd5 2>/dev/null) -if [ "$nowmd5" != "$lastmd5" ]; then - uci set AdGuardHome.AdGuardHome.hostsmd5="$nowmd5" - uci commit AdGuardHome - [ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload -fi -} - -[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' /etc/hosts && checkmd5 "$2" && exit 0 -/usr/bin/awk 'BEGIN{ -while ((getline < "/tmp/dhcp.leases") > 0) -{ - a[$2]=$4; -} -while (("ip -6 neighbor show | grep -v fe80" | getline) > 0) -{ - if (a[$5]) {print $1" "a[$5] >"/tmp/tmphost"; } -} -print "#programaddend" >"/tmp/tmphost"; -}' -grep programaddstart /etc/hosts >/dev/null 2>&1 -if [ "$?" == "0" ]; then - sed -i '/programaddstart/,/programaddend/c\#programaddstart' /etc/hosts - sed -i '/programaddstart/'r/tmp/tmphost /etc/hosts -else - echo "#programaddstart" >>/etc/hosts - cat /tmp/tmphost >> /etc/hosts -fi -rm /tmp/tmphost -checkmd5 "$2" diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start b/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start deleted file mode 100755 index 562117e52..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -AdGuardHome_enable=$(uci get AdGuardHome.AdGuardHome.enabled) -redirect=$(uci get AdGuardHome.AdGuardHome.redirect) - -if [ $AdGuardHome_enable -eq 1 -a "$redirect" == "redirect" ]; then - /etc/init.d/AdGuardHome do_redirect 1 -fi diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh deleted file mode 100755 index 908bdf631..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -PATH="/usr/sbin:/usr/bin:/sbin:/bin" -logread -e AdGuardHome > /tmp/AdGuardHometmp.log -logread -e AdGuardHome -f >> /tmp/AdGuardHometmp.log & -pid=$! -echo "1">/var/run/AdGuardHomesyslog -while true -do - sleep 12 - watchdog=$(cat /var/run/AdGuardHomesyslog) - if [ "$watchdog"x == "0"x ]; then - kill $pid - rm /tmp/AdGuardHometmp.log - rm /var/run/AdGuardHomesyslog - exit 0 - else - echo "0">/var/run/AdGuardHomesyslog - fi -done diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh deleted file mode 100755 index a3add84e8..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh - -PATH="/usr/sbin:/usr/bin:/sbin:/bin" - -checkmd5(){ -local nowmd5=$(md5sum /tmp/adguard.list 2>/dev/null) -nowmd5=${nowmd5%% *} -local lastmd5=$(uci get AdGuardHome.AdGuardHome.gfwlistmd5 2>/dev/null) -if [ "$nowmd5" != "$lastmd5" ]; then - uci set AdGuardHome.AdGuardHome.gfwlistmd5="$nowmd5" - uci commit AdGuardHome - [ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload -fi -} - -configpath=$(uci get AdGuardHome.AdGuardHome.configpath 2>/dev/null) -[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' $configpath && checkmd5 "$2" && exit 0 -gfwupstream=$(uci get AdGuardHome.AdGuardHome.gfwupstream 2>/dev/null) -if [ -z $gfwupstream ]; then -gfwupstream="tcp://208.67.220.220:5353" -fi -if [ ! -f "$configpath" ]; then - echo "please make a config first" - exit 1 -fi -wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O- | base64 -d > /tmp/gfwlist.txt -cat /tmp/gfwlist.txt | awk -v upst="$gfwupstream" 'BEGIN{getline;}{ -s1=substr($0,1,1); -if (s1=="!") -{next;} -if (s1=="@"){ - $0=substr($0,3); - s1=substr($0,1,1); - white=1;} -else{ - white=0; -} - -if (s1=="|") - {s2=substr($0,2,1); - if (s2=="|") - { - $0=substr($0,3); - split($0,d,"/"); - $0=d[1]; - }else{ - split($0,d,"/"); - $0=d[3]; - }} -else{ - split($0,d,"/"); - $0=d[1]; -} -star=index($0,"*"); -if (star!=0) -{ - $0=substr($0,star+1); - dot=index($0,"."); - if (dot!=0) - $0=substr($0,dot+1); - else - next; - s1=substr($0,1,1); -} -if (s1==".") -{fin=substr($0,2);} -else{fin=$0;} -if (index(fin,".")==0) next; -if (index(fin,"%")!=0) next; -if (index(fin,":")!=0) next; -match(fin,"^[0-9\.]+") -if (RSTART==1 && RLENGTH==length(fin)) {print "ipset add gfwlist "fin>"/tmp/doipset.sh";next;} -if (fin=="" || finl==fin) next; -finl=fin; -if (white==0) - {print(" - '\''[/"fin"/]"upst"'\''");} -else{ - print(" - '\''[/"fin"/]#'\''");} -}END{print(" - '\''[/programaddend/]#'\''")}' > /tmp/adguard.list -grep programaddstart $configpath -if [ "$?" == "0" ]; then - sed -i '/programaddstart/,/programaddend/c\ - '\''\[\/programaddstart\/\]#'\''' $configpath - sed -i '/programaddstart/'r/tmp/adguard.list $configpath -else - sed -i '1i\ - '\''[/programaddstart/]#'\''' /tmp/adguard.list - sed -i '/upstream_dns:/'r/tmp/adguard.list $configpath -fi -checkmd5 "$2" -rm -f /tmp/gfwlist.txt /tmp/adguard.list diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt b/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt deleted file mode 100755 index e4f1c8fa7..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt +++ /dev/null @@ -1,3 +0,0 @@ -https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_${Arch}.tar.gz -https://github.com/AdguardTeam/AdGuardHome/releases/download/${latest_ver}/AdGuardHome_linux_${Arch}.tar.gz -https://static.adguard.com/adguardhome/release/AdGuardHome_linux_${Arch}.tar.gz diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh deleted file mode 100755 index 9ccc21903..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -tail -n $1 "$2" > /var/run/tailtmp -cat /var/run/tailtmp > "$2" -rm /var/run/tailtmp diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh deleted file mode 100755 index 74ba7268d..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh +++ /dev/null @@ -1,236 +0,0 @@ -#!/bin/bash - -PATH="/usr/sbin:/usr/bin:/sbin:/bin" -binpath=$(uci get AdGuardHome.AdGuardHome.binpath) -if [ -z "$binpath" ]; then -uci set AdGuardHome.AdGuardHome.binpath="/tmp/AdGuardHome/AdGuardHome" -binpath="/tmp/AdGuardHome/AdGuardHome" -fi -mkdir -p ${binpath%/*} -upxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null) - -check_if_already_running(){ - running_tasks="$(ps |grep "AdGuardHome" |grep "update_core" |grep -v "grep" |awk '{print $1}' |wc -l)" - [ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." && EXIT 2 -} - -check_wgetcurl(){ - which curl && downloader="curl -L -k --retry 2 --connect-timeout 20 -o" && return - which wget-ssl && downloader="wget-ssl --no-check-certificate -t 2 -T 20 -O" && return - [ -z "$1" ] && opkg update || (echo error opkg && EXIT 1) - [ -z "$1" ] && (opkg remove wget wget-nossl --force-depends ; opkg install wget ; check_wgetcurl 1 ;return) - [ "$1" == "1" ] && (opkg install curl ; check_wgetcurl 2 ; return) - echo error curl and wget && EXIT 1 -} - -check_latest_version(){ - check_wgetcurl - latest_ver="$($downloader - https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E 'v[0-9.]+' -o 2>/dev/null)" - if [ -z "${latest_ver}" ]; then - echo -e "\nFailed to check latest version, please try again later." && EXIT 1 - fi - now_ver="$($binpath -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o)" - if [ "${latest_ver}"x != "${now_ver}"x ] || [ "$1" == "force" ]; then - echo -e "Local version: ${now_ver}., cloud version: ${latest_ver}." - doupdate_core - else - echo -e "\nLocal version: ${now_ver}, cloud version: ${latest_ver}." - echo -e "You're already using the latest version." - if [ ! -z "$upxflag" ]; then - filesize=$(ls -l $binpath | awk '{ print $5 }') - if [ $filesize -gt 8000000 ]; then - echo -e "start upx may take a long time" - doupx - mkdir -p "/tmp/AdGuardHomeupdate/AdGuardHome" >/dev/null 2>&1 - rm -fr /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} - /tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $binpath -o /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} - rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux - /etc/init.d/AdGuardHome stop nobackup - rm $binpath - mv -f /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} $binpath - /etc/init.d/AdGuardHome start - echo -e "finished" - fi - fi - EXIT 0 - fi -} - -doupx(){ - Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')" - case $Archt in - "i386") - Arch="i386" - ;; - "i686") - Arch="i386" - echo -e "i686 use $Arch may have bug" - ;; - "x86") - Arch="amd64" - ;; - "mipsel") - Arch="mipsel" - ;; - "mips64el") - Arch="mips64el" - Arch="mipsel" - echo -e "mips64el use $Arch may have bug" - ;; - "mips") - Arch="mips" - ;; - "mips64") - Arch="mips64" - Arch="mips" - echo -e "mips64 use $Arch may have bug" - ;; - "arm") - Arch="arm" - ;; - "armeb") - Arch="armeb" - ;; - "aarch64") - Arch="arm64" - ;; - "powerpc") - Arch="powerpc" - ;; - "powerpc64") - Arch="powerpc64" - ;; - *) - echo -e "error not support $Archt if you can use offical release please issue a bug" - EXIT 1 - ;; - esac - upx_latest_ver="$($downloader - https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E '[0-9.]+' -o 2>/dev/null)" - $downloader /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz "https://github.com/upx/upx/releases/download/v${upx_latest_ver}/upx-${upx_latest_ver}-${Arch}_linux.tar.xz" 2>&1 - #tar xvJf - which xz || (opkg list | grep ^xz || opkg update && opkg install xz) || (echo "xz download fail" && EXIT 1) - mkdir -p /tmp/upx-${upx_latest_ver}-${Arch}_linux - xz -d -c /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz| tar -x -C "/tmp" >/dev/null 2>&1 - if [ ! -e "/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx" ]; then - echo -e "Failed to download upx." - EXIT 1 - fi - rm /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz -} - -doupdate_core(){ - echo -e "Updating core..." - mkdir -p "/tmp/AdGuardHomeupdate" - rm -rf /tmp/AdGuardHomeupdate/* >/dev/null 2>&1 - Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')" - case $Archt in - "i386") - Arch="386" - ;; - "i686") - Arch="386" - ;; - "x86") - Arch="amd64" - ;; - "mipsel") - Arch="mipsle" - ;; - "mips64el") - Arch="mips64le" - Arch="mipsle" - echo -e "mips64el use $Arch may have bug" - ;; - "mips") - Arch="mips" - ;; - "mips64") - Arch="mips64" - Arch="mips" - echo -e "mips64 use $Arch may have bug" - ;; - "arm") - Arch="arm" - ;; - "aarch64") - Arch="arm64" - ;; - "powerpc") - Arch="ppc" - echo -e "error not support $Archt" - EXIT 1 - ;; - "powerpc64") - Arch="ppc64" - echo -e "error not support $Archt" - EXIT 1 - ;; - *) - echo -e "error not support $Archt if you can use offical release please issue a bug" - EXIT 1 - ;; - esac - echo -e "start download" - grep -v "^#" /usr/share/AdGuardHome/links.txt >/tmp/run/AdHlinks.txt - while read link - do - eval link="$link" - $downloader /tmp/AdGuardHomeupdate/${link##*/} "$link" 2>&1 - if [ "$?" != "0" ]; then - echo "download failed try another download" - rm -f /tmp/AdGuardHomeupdate/${link##*/} - else - local success="1" - break - fi - done < "/tmp/run/AdHlinks.txt" - rm /tmp/run/AdHlinks.txt - [ -z "$success" ] && echo "no download success" && EXIT 1 - if [ "${link##*.}" == "gz" ]; then - tar -zxf "/tmp/AdGuardHomeupdate/${link##*/}" -C "/tmp/AdGuardHomeupdate/" - if [ ! -e "/tmp/AdGuardHomeupdate/AdGuardHome" ]; then - echo -e "Failed to download core." - rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1 - EXIT 1 - fi - downloadbin="/tmp/AdGuardHomeupdate/AdGuardHome/AdGuardHome" - else - downloadbin="/tmp/AdGuardHomeupdate/${link##*/}" - fi - chmod 755 $downloadbin - echo -e "download success start copy" - if [ -n "$upxflag" ]; then - echo -e "start upx may take a long time" - doupx - /tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $downloadbin - rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux - fi - echo -e "start copy" - /etc/init.d/AdGuardHome stop nobackup - rm "$binpath" - mv -f "$downloadbin" "$binpath" - if [ "$?" == "1" ]; then - echo "mv failed maybe not enough space please use upx or change bin to /tmp/AdGuardHome" - EXIT 1 - fi - /etc/init.d/AdGuardHome start - rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1 - echo -e "Succeeded in updating core." - echo -e "Local version: ${latest_ver}, cloud version: ${latest_ver}.\n" - EXIT 0 -} - -EXIT(){ - rm /var/run/update_core 2>/dev/null - [ "$1" != "0" ] && touch /var/run/update_core_error - exit $1 -} - -main(){ - check_if_already_running - check_latest_version $1 -} - trap "EXIT 1" SIGTERM SIGINT - touch /var/run/update_core - rm /var/run/update_core_error 2>/dev/null - main $1 diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh deleted file mode 100755 index c7745e101..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -PATH="/usr/sbin:/usr/bin:/sbin:/bin" -count=0 -while : -do - ping -c 1 -W 1 -q www.baidu.com 1>/dev/null 2>&1 - if [ "$?" == "0" ]; then - /etc/init.d/AdGuardHome force_reload - break - fi - ping -c 1 -W 1 -q 202.108.22.5 1>/dev/null 2>&1 - if [ "$?" == "0" ]; then - /etc/init.d/AdGuardHome force_reload - break - fi - sleep 5 - ping -c 1 -W 1 -q www.google.com 1>/dev/null 2>&1 - if [ "$?" == "0" ]; then - /etc/init.d/AdGuardHome force_reload - break - fi - ping -c 1 -W 1 -q 8.8.8.8 1>/dev/null 2>&1 - if [ "$?" == "0" ]; then - /etc/init.d/AdGuardHome force_reload - break - fi - sleep 5 - count=$((count+1)) - if [ $count -gt 18 ]; then - /etc/init.d/AdGuardHome force_reload - break - fi -done -return 0 diff --git a/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh b/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh deleted file mode 100755 index 61ba09de7..000000000 --- a/luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -PATH="/usr/sbin:/usr/bin:/sbin:/bin" -configpath=$(uci get AdGuardHome.AdGuardHome.configpath) -while : -do - sleep 10 - if [ -f "$configpath" ]; then - /etc/init.d/AdGuardHome do_redirect 1 - break - fi -done -return 0 diff --git a/luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json b/luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json deleted file mode 100755 index 485aa6205..000000000 --- a/luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "luci-app-adguardhome": { - "description": "Grant UCI access for luci-app-adguardhome", - "read": { - "uci": [ "AdGuardHome" ] - }, - "write": { - "uci": [ "AdGuardHome" ] - } - } -} diff --git a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js b/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js deleted file mode 100755 index f93d42b7f..000000000 --- a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js +++ /dev/null @@ -1 +0,0 @@ -!function(n){"object"==typeof exports&&"object"==typeof module?n(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)}(function(n){"use strict";function e(e,o,i,t){if(i&&i.call){var l=i;i=null}else l=r(e,i,"rangeFinder");"number"==typeof o&&(o=n.Pos(o,0));var f=r(e,i,"minFoldSize");function d(n){var r=l(e,o);if(!r||r.to.line-r.from.linee.firstLine();)o=n.Pos(o.line-1,0),u=d(!1);if(u&&!u.cleared&&"unfold"!==t){var a=function(n,e){var o=r(n,e,"widget");if("string"==typeof o){var i=document.createTextNode(o);(o=document.createElement("span")).appendChild(i),o.className="CodeMirror-foldmarker"}else o&&(o=o.cloneNode(!0));return o}(e,i);n.on(a,"mousedown",function(e){c.clear(),n.e_preventDefault(e)});var c=e.markText(u.from,u.to,{replacedWith:a,clearOnEnter:r(e,i,"clearOnEnter"),__isFold:!0});c.on("clear",function(o,r){n.signal(e,"unfold",e,o,r)}),n.signal(e,"fold",e,u.from,u.to)}}n.newFoldFunction=function(n,o){return function(r,i){e(r,i,{rangeFinder:n,widget:o})}},n.defineExtension("foldCode",function(n,o,r){e(this,n,o,r)}),n.defineExtension("isFolded",function(n){for(var e=this.findMarksAt(n),o=0;o=u){if(s&&f&&s.test(f.className))return;i=r(a.indicatorOpen)}}(i||f)&&t.setGutterMarker(n,a.gutter,i)})}function i(t){return new RegExp("(^|\\s)"+t+"(?:$|\\s)\\s*")}function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation(function(){n(t,o.from,o.to)}),e.from=o.from,e.to=o.to)}function a(t,r,n){var i=t.state.foldGutter;if(i){var f=i.options;if(n==f.gutter){var a=e(t,r);a?a.clear():t.foldCode(o(r,0),f)}}}function d(t){var o=t.state.foldGutter;if(o){var e=o.options;o.from=o.to=0,clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){f(t)},e.foldOnChangeTimeSpan||600)}}function u(t){var o=t.state.foldGutter;if(o){var e=o.options;clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){var e=t.getViewport();o.from==o.to||e.from-o.to>20||o.from-e.to>20?f(t):t.operation(function(){e.fromo.to&&(n(t,o.to,e.to),o.to=e.to)})},e.updateViewportTimeSpan||400)}}function l(t,o){var e=t.state.foldGutter;if(e){var r=o.line;r>=e.from&&ro))break;r=l}}return r?{from:e.Pos(i.line,t.getLine(i.line).length),to:e.Pos(r,t.getLine(r).length)}:void 0}})}); \ No newline at end of file diff --git a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css b/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css deleted file mode 100755 index 43ac1a9fa..000000000 --- a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css +++ /dev/null @@ -1 +0,0 @@ -.CodeMirror{font-family:monospace;height:500px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:0;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0 !important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,0.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0} diff --git a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js b/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js deleted file mode 100755 index d01f072ee..000000000 --- a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){"use strict";var e=navigator.userAgent,t=navigator.platform,r=/gecko\/\d/i.test(e),n=/MSIE \d/.test(e),i=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),o=/Edge\/(\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\//.test(e),u=a&&/Qt\/\d+\.\d+/.test(e),c=!o&&/Chrome\//.test(e),h=/Opera\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\bCrOS\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\/(\d*\.\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:"")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null,this.f=null,this.time=0,this.handler=E(this.onTimeout,this)};function B(e,t){for(var r=0;r=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[""];function _(e){for(;Y.length<=e;)Y.push($(Y)+" ");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var r=[],n=0;n"€"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf("\\w")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:tr?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}var se=null;function ae(e,t,r){var n;se=null;for(var i=0;it)return i;o.to==t&&(o.from!=o.to&&"before"==r?n=i:se=i),o.from==t&&(o.from!=o.to&&"before"!=r?n=i:se=i)}return null!=n?n:se}var ue=function(){var e="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",t="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";var r=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c="ltr"==u?"L":"R";if(0==a.length||"ltr"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function ge(e,t){var r=de(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i0}function be(e){e.prototype.on=function(e,t){fe(this,e,t)},e.prototype.off=function(e,t){pe(this,e,t)}}function we(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function xe(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ce(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Se(e){we(e),xe(e)}function Le(e){return e.target||e.srcElement}function ke(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Te,Me,Ne=function(){if(l&&s<9)return!1;var e=O("div");return"draggable"in e||"dragDrop"in e}();function Oe(e){if(null==Te){var t=O("span","​");N(e,O("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Te=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=Te?O("span","​"):O("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return r.setAttribute("cm-text",""),r}function Ae(e){if(null!=Me)return Me;var t=N(e,document.createTextNode("AخA")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(Me=n.right-r.right<3)}var De,We=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\r\n?|\n/)},He=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Fe="oncopy"in(De=O("div"))||(De.setAttribute("oncopy","return;"),"function"==typeof De.oncopy),Pe=null;var Ee={},Ie={};function ze(e){if("string"==typeof e&&Ie.hasOwnProperty(e))e=Ie[e];else if(e&&"string"==typeof e.name&&Ie.hasOwnProperty(e.name)){var t=Ie[e.name];"string"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return ze("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return ze("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Re(e,t){t=ze(t);var r=Ee[t.name];if(!r)return Re(e,"text/plain");var n=r(e,t);if(Be.hasOwnProperty(t.name)){var i=Be[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n["_"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Be={};function Ge(e,t){I(t,Be.hasOwnProperty(e)?Be[e]:Be[e]={})}function Ue(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function Ve(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Ke(e,t,r){return!e.startState||e.startState(t,r)}var je=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};function Xe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t=e.first&&tr?et(r,Xe(e,r).text.length):function(e,t){var r=e.ch;return null==r||r>t?et(e.line,t):r<0?et(e.line,0):e}(t,Xe(e,t.line).text.length)}function at(e,t){for(var r=[],n=0;n=this.string.length},je.prototype.sol=function(){return this.pos==this.lineStart},je.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},je.prototype.next=function(){if(this.post},je.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},je.prototype.skipToEnd=function(){this.pos=this.string.length},je.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},je.prototype.backUp=function(e){this.pos-=e},je.prototype.column=function(){return this.lastColumnPos0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},je.prototype.current=function(){return this.string.slice(this.start,this.pos)},je.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},je.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},je.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var ut=function(e,t){this.state=e,this.lookAhead=t},ct=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function ht(e,t,r,n){var i=[e.state.modeGen],o={};wt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,wt(e,t.text,s.mode,r,function(e,t){for(var r=a;ue&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,"overlay "+t),a=r+2;else for(;re.options.maxHighlightLength&&Ue(e.doc.mode,n.state),o=ht(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function dt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new ct(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=Xe(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof ut?u.lookAhead:0)<=o.modeFrontier))return s;var c=z(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&Xe(n,o-1).stateAfter,s=l?ct.fromSaved(n,l,o):new ct(n,Ke(n.mode),o);return n.iter(o,t,function(r){pt(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&nt.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}ct.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},ct.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},ct.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},ct.fromSaved=function(e,t,r){return t instanceof ut?new ct(e,Ue(e.mode,t.state),r,t.lookAhead):new ct(e,Ue(e.mode,t),r)},ct.prototype.save=function(e){var t=!1!==e?Ue(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ut(t,this.maxLookAhead):t};var mt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function yt(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=Xe(l,(t=st(l,t)).line),u=dt(e,t.line,r),c=new je(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pose.options.maxHighlightLength?(s=!1,l&&pt(e,t,n,h.pos),h.pos=t.length,a=null):a=bt(vt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a="m-"+(a?d+" "+a:d))}if(!s||c!=a){for(;u=t:o.to>t);(n||(n=[])).push(new St(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i=t:o.to>t)||o.from==t&&"bookmark"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from0&&s)for(var b=0;bt)&&(!r||Wt(r,o.marker)<0)&&(r=o.marker)}return r}function It(e,t,r,n,i){var o=Xe(e,t),l=Ct&&o.markedSpans;if(l)for(var s=0;s=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.to,r)>=0:tt(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.from,n)<=0:tt(u.from,n)<0)))return!0}}}function zt(e){for(var t;t=Ft(e);)e=t.find(-1,!0).line;return e}function Rt(e,t){var r=Xe(e,t),n=zt(r);return r==n?t:qe(n)}function Bt(e,t){if(t>e.lastLine())return t;var r,n=Xe(e,t);if(!Gt(e,n))return t;for(;r=Pt(n);)n=r.find(1,!0).line;return qe(n)+1}function Gt(e,t){var r=Ct&&t.markedSpans;if(r)for(var n=void 0,i=0;it.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var Xt=function(e,t,r){this.text=e,Ot(this,t),this.height=r?r(this):1};function Yt(e){e.parent=null,Nt(e)}Xt.prototype.lineNo=function(){return qe(this)},be(Xt);var _t={},$t={};function qt(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass?$t:_t;return r[e]||(r[e]=e.replace(/\S+/g,"cm-$&"))}function Zt(e,t){var r=A("span",null,null,a?"padding-right: .1px":null),n={pre:A("pre",[r],"CodeMirror-line"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,l=void 0;n.pos=0,n.addToken=Jt,Ae(e.display.measure)&&(l=ce(o,e.doc.direction))&&(n.addToken=er(n.addToken,l)),n.map=[],rr(o,n,ft(e,o,t!=e.display.externalMeasured&&qe(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||"")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||""))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(Oe(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var s=n.content.lastChild;(/\bcm-tab\b/.test(s.className)||s.querySelector&&s.querySelector(".cm-tab"))&&(n.content.className="cm-tab-wrap-hack")}return ge(e,"renderLine",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||"")),n}function Qt(e){var t=O("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Jt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n="",i=0;iu&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function tr(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rr(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v="",m=0;;){if(m==p){a=u=c=s="",f=null,h=null,m=1/0;for(var y=[],b=void 0,w=0;wp||C.collapsed&&x.to==p&&x.from==p)){if(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=""),C.className&&(a+=" "+C.className),C.css&&(s=(s?s+";":"")+C.css),C.startStyle&&x.from==p&&(c+=" "+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&((f||(f={})).title=C.title),C.attributes)for(var S in C.attributes)(f||(f={}))[S]=C.attributes[S];C.collapsed&&(!h||Wt(h.marker,C)<0)&&(h=x)}else x.from>p&&m>x.from&&(m=x.from)}if(b)for(var L=0;L=d)break;for(var T=Math.min(d,m);;){if(v){var M=p+v.length;if(!h){var N=M>T?v.slice(0,T-p):v;t.addToken(t,N,l?l+a:a,c,p+N.length==m?u:"",s,f)}if(M>=T){v=v.slice(T-p),p=T;break}p=M,c=""}v=i.slice(o,o=r[g++]),l=qt(r[g++],t.cm.options)}}else for(var O=1;Or)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Or(e,t,r,n){return Wr(e,Dr(e,t),r,n)}function Ar(e,t){if(t>=e.display.viewFrom&&t=r.lineN&&t2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Pr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n="right"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d["right"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+tn(e.display),top:p.top,bottom:p.bottom}:Fr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;bt)&&(i=(o=a-s)-1,t>=a&&(l="right")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?"left":"right")&&(l=r),"left"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l="left";if("right"==r&&i==a-s)for(;u=0&&(r=e[i]).left==r.right;i--);return r}function Ir(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t=n.text.length?(a=n.text.length,u="before"):a<=0&&(a=0,u="after"),!s)return l("before"==u?a-1:a,"before"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=ae(s,a,u),f=se,d=c(a,h,"before"==u);return null!=f&&(d.other=c(a,f,"before"!=u)),d}function Yr(e,t){var r=0;t=st(e.doc,t),e.options.lineWrapping||(r=tn(e.display)*t.ch);var n=Xe(e.doc,t.line),i=Vt(n)+Cr(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function _r(e,t,r,n,i){var o=et(e,t,r);return o.xRel=i,n&&(o.outside=n),o}function $r(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return _r(n.first,0,null,-1,-1);var i=Ze(n,r),o=n.first+n.size-1;if(i>o)return _r(n.first+n.size-1,Xe(n,o).text.length,null,1,1);t<0&&(t=0);for(var l=Xe(n,i);;){var s=Jr(e,l,i,t,r),a=Et(l,s.ch+(s.xRel>0||s.outside>0?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Xe(n,i=u.line)}}function qr(e,t,r,n){n-=Ur(t);var i=t.text.length,o=le(function(t){return Wr(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Wr(e,r,t).top>n},o,i)}}function Zr(e,t,r,n){return r||(r=Dr(e,t)),qr(e,t,r,Vr(e,t,Wr(e,r,n),"line").top)}function Qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function Jr(e,t,r,n,i){i-=Vt(t);var o=Dr(e,t),l=Ur(t),s=0,a=t.text.length,u=!0,c=ce(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=qr(e,t,n,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f=u||d.to<=a)){var p=1!=d.level,g=Wr(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=gv)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.fromu&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return Qr(Xr(e,et(r,u?a.to:a.from,u?"before":"after"),"line",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Xr(e,et(r,u?a.from:a.to,u?"after":"before"),"line",t,n);Qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Wr(e,o,t);return r.top+=l,r.bottom+=l,!!Qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left=w.bottom?1:0}return _r(r,v=oe(t.text,v,1),d,m,n-f)}function en(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Hr){Hr=O("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Hr.appendChild(document.createTextNode("x")),Hr.appendChild(O("br"));Hr.appendChild(document.createTextNode("x"))}N(e.measure,Hr);var r=Hr.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function tn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O("span","xxxxxxxxxx"),r=O("pre",[t],"CodeMirror-line-like");N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function rn(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;r[s]=o.offsetLeft+o.clientLeft+i,n[s]=o.clientWidth}return{fixedPos:nn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function nn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function on(e){var t=en(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/tn(e.display)-3);return function(i){if(Gt(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;nt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Ct&&Rt(e.doc,t)i.viewFrom?hn(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)hn(e);else if(t<=i.viewFrom){var o=fn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):hn(e)}else if(r>=i.viewTo){var l=fn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):hn(e)}else{var s=fn(e,t,t,-1),a=fn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(ir(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):hn(e)}var u=i.externalMeasured;u&&(r=i.lineN&&t=n.viewTo)){var o=n.view[an(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function hn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function fn(e,t,r,n){var i,o=an(e,t),l=e.display.view;if(!Ct||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Rt(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function dn(e){for(var t=e.display.view,r=0,n=0;n=e.display.viewTo||s.to().linet||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?"rtl":"ltr",o),i=!0)}i||n(t,r,"ltr")}(g,r||0,null==n?f:n,function(e,t,i,h){var v="ltr"==i,m=d(e,v?"left":"right"),y=d(t-1,v?"right":"left"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,"before"),N=u?s:p(t,i,"after"),O=u&&w&&C?a:y.right):(T=u?p(e,i,"before"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,"after"):a),c(T,m.top,M-T,m.bottom),m.bottom0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function wn(e){e.state.focused||(e.display.input.focus(),Cn(e))}function xn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Sn(e))},100)}function Cn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(ge(e,"focus",e,t),e.state.focused=!0,H(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),bn(e))}function Sn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(ge(e,"blur",e,t),e.state.focused=!1,T(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function Ln(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n.005||f<-.005)&&($e(i.line,a),kn(i.line),i.rest))for(var d=0;de.display.sizerWidth){var p=Math.ceil(u/tn(e.display));p>e.display.maxLineLength&&(e.display.maxLineLength=p,e.display.maxLine=i.line,e.display.maxLineChanged=!0)}}}}function kn(e){if(e.widgets)for(var t=0;t=l&&(o=Ze(t,Vt(Xe(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function Mn(e,t){var r=e.display,n=en(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Mr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+Sr(r),a=t.tops-n;if(t.topi+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Tr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.leftf+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Nn(e,t){null!=t&&(Dn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function On(e){Dn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function An(e,t,r){null==t&&null==r||Dn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function Dn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Wn(e,Yr(e,t.from),Yr(e,t.to),t.margin))}function Wn(e,t,r,n){var i=Mn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});An(e,i.scrollLeft,i.scrollTop)}function Hn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||oi(e,{top:t}),Fn(e,t,!0),r&&oi(e),ei(e,100))}function Fn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Pn(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,ai(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function En(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+Sr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+kr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var In=function(e,t,r){this.cm=r;var n=this.vert=O("div",[O("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=O("div",[O("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");n.tabIndex=i.tabIndex=-1,e(n),e(i),fe(n,"scroll",function(){n.clientHeight&&t(n.scrollTop,"vertical")}),fe(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};In.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display="block",this.vert.style.bottom=t?n+"px":"0";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=r?n+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},In.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},In.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},In.prototype.zeroWidthHack=function(){var e=y&&!d?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new R,this.disableVert=new R},In.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents="auto",t.set(1e3,function n(){var i=e.getBoundingClientRect();("vert"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,n)})},In.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var zn=function(){};function Rn(e,t){t||(t=En(e));var r=e.display.barWidth,n=e.display.barHeight;Bn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&Ln(e),Bn(e,En(e)),r=e.display.barWidth,n=e.display.barHeight}function Bn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+"px",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+"px",r.heightForcer.style.borderBottom=n.bottom+"px solid transparent",n.right&&n.bottom?(r.scrollbarFiller.style.display="block",r.scrollbarFiller.style.height=n.bottom+"px",r.scrollbarFiller.style.width=n.right+"px"):r.scrollbarFiller.style.display="",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display="block",r.gutterFiller.style.height=n.bottom+"px",r.gutterFiller.style.width=t.gutterWidth+"px"):r.gutterFiller.style.display=""}zn.prototype.update=function(){return{bottom:0,right:0}},zn.prototype.setScrollLeft=function(){},zn.prototype.setScrollTop=function(){},zn.prototype.clear=function(){};var Gn={native:In,null:zn};function Un(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Gn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),fe(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,r){"horizontal"==r?Pn(e,t):Hn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var Vn=0;function Kn(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Vn},t=e.curOp,or?or.ops.push(t):t.ownsGroup=or={ops:[t],delayedCallbacks:[]}}function jn(e){var t=e.curOp;t&&function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r=r.viewTo)||r.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new ri(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Yn(e){var t=e.cm,r=t.display;e.updatedDisplay&&Ln(t),e.barMeasure=En(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Or(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+kr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Tr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function _n(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O("div","​",null,"position: absolute;\n top: "+(t.top-r.viewOffset-Cr(e.display))+"px;\n height: "+(t.bottom-t.top+kr(e)+r.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r="before"==(t=t.ch?et(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?et(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var l=!1,s=Xr(e,t),a=r&&r!=t?Xr(e,r):s,u=Mn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Hn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(Pn(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,st(n,e.scrollToPos.from),st(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l=e.display.viewTo)){var r=+new Date+e.options.workTime,n=dt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ue(t.mode,n.state):null,a=ht(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&fr)return ei(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&qn(e,function(){for(var t=0;t=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==dn(e))return!1;ui(e)&&(hn(e),t.dims=rn(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFroml&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),Ct&&(o=Rt(e.doc,o),l=Bt(e.doc,l));var s=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;!function(e,t,r){var n=e.display;0==n.view.length||t>=n.viewTo||r<=n.viewFrom?(n.view=ir(e,t,r),n.viewFrom=t):(n.viewFrom>t?n.view=ir(e,t,n.viewFrom).concat(n.view):n.viewFromr&&(n.view=n.view.slice(0,an(e,r)))),n.viewTo=r}(e,o,l),r.viewOffset=Vt(Xe(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var u=dn(e);if(!s&&0==u&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var c=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return u>4&&(r.lineDiv.style.display="none"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h-1&&(d=!1),ur(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(Je(e.options,c)))),l=f.node.nextSibling}else{var p=vr(e,f,c,r);o.insertBefore(p,l)}c+=f.size}for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),u>4&&(r.lineDiv.style.display=""),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(c),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,s&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,ei(e,400)),r.updateLineNumbers=null,!0}function ii(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Tr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+Sr(e.display)-Mr(e),r.top)}),t.visible=Tn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ni(e,t);n=!1){Ln(e);var i=En(e);pn(e),Rn(e,i),si(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function oi(e,t){var r=new ri(e,t);if(ni(e,r)){Ln(e),ii(e,r);var n=En(e);pn(e),Rn(e,n),si(e,n),r.finish()}}function li(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function si(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+kr(e)+"px"}function ai(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=nn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+"px",l=0;ls.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p=0&&tt(e,n.to())<=0)return r}return-1};var bi=function(e,t){this.anchor=e,this.head=t};function wi(e,t,r){var n=e&&e.options.selectionsMayTouch,i=t[r];t.sort(function(e,t){return tt(e.from(),t.from())}),r=B(t,i);for(var o=1;o0:a>=0){var u=ot(s.from(),l.from()),c=it(s.to(),l.to()),h=s.empty()?l.from()==l.head:s.from()==s.head;o<=r&&--r,t.splice(--o,2,new bi(h?c:u,h?u:c))}}return new yi(t,r)}function xi(e,t){return new yi([new bi(e,t||e)],0)}function Ci(e){return e.text?et(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function Si(e,t){if(tt(e,t.from)<0)return e;if(tt(e,t.to)<=0)return Ci(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=Ci(t).ch-t.to.ch),et(r,n)}function Li(e,t){for(var r=[],n=0;n1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}sr(e,"change",e,t)}function Ai(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;ls-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=function(e,t){return t?(Pi(e.done),$(e.done)):e.done.length&&!$(e.done).ranges?$(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),$(e.done)):void 0}(i,i.lastOp==n)))l=$(o.changes),0==tt(t.from,t.to)&&0==tt(t.from,l.to)?l.to=Ci(t):o.changes.push(Fi(e,t));else{var a=$(i.done);for(a&&a.ranges||zi(e.sel,i.done),o={changes:[Fi(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||ge(e,"historyAdded")}function Ii(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||function(e,t,r,n){var i=t.charAt(0);return"*"==i||"+"==i&&r.ranges.length==n.ranges.length&&r.somethingSelected()==n.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,$(i.done),t))?i.done[i.done.length-1]=t:zi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=r,n&&!1!==n.clearRedo&&Pi(i.undone)}function zi(e,t){var r=$(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Ri(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=r.markedSpans),++o})}function Bi(e){if(!e)return null;for(var t,r=0;r-1&&($(s)[h]=u[h],delete u[h])}}}return n}function Vi(e,t,r,n){if(n){var i=e.anchor;if(r){var o=tt(t,i)<0;o!=tt(r,i)<0?(i=t,t=r):o!=tt(t,r)<0&&(t=r)}return new bi(i,t)}return new bi(r||t,t)}function Ki(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),$i(e,new yi([Vi(e.sel.primary(),t,r,i)],0),n)}function ji(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o=t.ch:s.to>t.ch))){if(i&&(ge(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var h=a.find(n<0?1:-1),f=void 0;if((n<0?c:u)&&(h=ro(e,h,-n,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(f=tt(h,r))&&(n<0?f<0:f>0))return eo(e,h,t,n,i)}var d=a.find(n<0?-1:1);return(n<0?u:c)&&(d=ro(e,d,n,d.line==t.line?o:null)),d?eo(e,d,t,n,i):null}}return t}function to(e,t,r,n,i){var o=n||1,l=eo(e,t,r,o,i)||!i&&eo(e,t,r,o,!0)||eo(e,t,r,-o,i)||!i&&eo(e,t,r,-o,!0);return l||(e.cantEdit=!0,et(e.first,0))}function ro(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?st(e,et(t.line-1)):null:r>0&&t.ch==(n||Xe(e,t.line)).text.length?t.line0)){var c=[a,1],h=tt(u.from,s.from),f=tt(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)lo(e,{from:n[i].from,to:n[i].to,text:i?[""]:t.text,origin:t.origin});else lo(e,t)}}function lo(e,t){if(1!=t.text.length||""!=t.text[0]||0!=tt(t.from,t.to)){var r=Li(e,t);Ei(e,t,r,e.cm?e.cm.curOp.id:NaN),uo(e,t,r,Tt(e,t));var n=[];Ai(e,function(e,r){r||-1!=B(n,e.history)||(po(e.history,t),n.push(e.history)),uo(e,t,null,Tt(e,t))})}}function so(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s="undo"==t?o.done:o.undone,a="undo"==t?o.undone:o.done,u=0;u=0;--d){var p=f(d);if(p)return p.v}}}}function ao(e,t){if(0!=t&&(e.first+=t,e.sel=new yi(q(e.sel.ranges,function(e){return new bi(et(e.anchor.line+t,e.anchor.ch),et(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){un(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;ne.lastLine())){if(t.from.lineo&&(t={from:t.from,to:et(o,Xe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ye(e,t.from,t.to),r||(r=Li(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=qe(zt(Xe(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&me(e);Oi(n,t,r,on(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Kt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontierr;n--){var i=Xe(e,n).stateAfter;if(i&&(!(i instanceof ut)||n+i.lookAhead1||!(this.children[0]instanceof vo))){var s=[];this.collapse(s),this.children=[new vo(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var l=i.lines.length%25+25,s=l;s10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A("span",[o.replacedWith],"CodeMirror-widget"),n.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(It(e,t.line,t,r,o)||t.line!=r.line&&It(e,r.line,t,r,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Ct=!0}o.addToHistory&&Ei(e,{from:t,to:r,origin:"markText"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){u&&o.collapsed&&!u.options.lineWrapping&&zt(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&$e(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new St(o,a==t.line?t.ch:null,a==r.line?r.ch:null)),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Gt(e,t)&&$e(t,0)}),o.clearOnEnter&&fe(o,"beforeCursorEnter",function(){return o.clear()}),o.readOnly&&(xt=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++wo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)un(u,t.line,r.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=t.line;c<=r.line;c++)cn(u,c,"text");o.atomic&&Qi(u.doc),sr(u,"markerAdded",u,o)}return o}xo.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Kn(e),ye(this,"clear")){var r=this.find();r&&sr(this,"clear",r.from,r.to)}for(var n=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=u,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=n&&e&&this.collapsed&&un(e,n,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Qi(e.doc)),e&&sr(e,"markerCleared",e,this,n,i),t&&jn(e),this.parent&&this.parent.clear()}},xo.prototype.find=function(e,t){var r,n;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i=0;a--)oo(this,n[a]);s?_i(this,s):this.cm&&On(this.cm)}),undo:Jn(function(){so(this,"undo")}),redo:Jn(function(){so(this,"redo")}),undoSelection:Jn(function(){so(this,"undo",!0)}),redoSelection:Jn(function(){so(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=st(this,e),t=st(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;ne)return t=e,!0;e-=o,++r}),st(this,et(r,t))},indexFromPos:function(e){var t=(e=st(this,e)).ch;if(e.linet&&(t=e.from),null!=e.to&&e.to-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData("Text");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),qi(t.doc,xi(r,r)),h)for(var f=0;f=0;t--)co(e.doc,"",n[t].from,n[t].to,"+delete");On(e)})}function _o(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function $o(e,t,r){var n=_o(e,t.ch,r);return null==n?null:new et(t.line,n,r<0?"after":"before")}function qo(e,t,r,n,i){if(e){var o=ce(r,t.doc.direction);if(o){var l,s=i<0?$(o):o[0],a=i<0==(1==s.level)?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var u=Dr(t,r);l=i<0?r.text.length-1:0;var c=Wr(t,u,l).top;l=le(function(e){return Wr(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),"before"==a&&(l=_o(r,l,1))}else l=i<0?s.to:s.from;return new et(n,l,a)}}return new et(n,i<0?r.text.length:0,i<0?"before":"after")}Ro.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Ro.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Ro.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Ro.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Ro.default=y?Ro.macDefault:Ro.pcDefault;var Zo={selectAll:no,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(e){return Yo(e,function(t){if(t.empty()){var r=Xe(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line0)i=new et(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),et(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Xe(e.doc,i.line-1).text;l&&(i=new et(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),et(i.line-1,l.length-1),i,"+transpose"))}r.push(new bi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return qn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,"+input");t=e.listSelections();for(var n=0;n-1&&(tt((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(tt(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=Zn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,pe(i.wrapper.ownerDocument,"mouseup",u),pe(i.wrapper.ownerDocument,"mousemove",c),pe(i.scroller,"dragstart",h),pe(i.scroller,"drop",u),o||(we(t),n.addNew||Ki(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();fe(i.wrapper.ownerDocument,"mouseup",u),fe(i.wrapper.ownerDocument,"mousemove",c),fe(i.scroller,"dragstart",h),fe(i.scroller,"drop",u),xn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;we(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new bi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if("rectangle"==n.unit)n.addNew||(l=new bi(r,r)),r=sn(e,t,!0,!0),s=-1;else{var c=dl(e,r,n.unit);l=n.extend?Vi(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,$i(o,wi(e,u.concat([l]),s),{scroll:!1,origin:"*mouse"})):u.length>1&&u[s].empty()&&"char"==n.unit&&!n.extend?($i(o,wi(e,u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),a=o.sel):Xi(o,s,l,K):(s=0,$i(o,new yi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=tt(h,t))if(h=t,"rectangle"==n.unit){for(var i=[],u=e.options.tabSize,c=z(Xe(o,r.line).text,r.ch,u),f=z(Xe(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=Xe(o,g).text,y=X(m,d,u);d==p?i.push(new bi(et(g,y),et(g,y))):m.length>y&&i.push(new bi(et(g,y),et(g,X(m,p,u))))}i.length||i.push(new bi(r,r)),$i(o,wi(e,a.ranges.slice(0,s).concat(i),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=dl(e,t,n.unit),C=w.anchor;tt(x.anchor,C)>0?(b=x.head,C=ot(w.from(),x.anchor)):(b=x.anchor,C=it(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=Xe(e.doc,r.line);if(0==tt(r,n)&&r.sticky==n.sticky)return t;var o=ce(i);if(!o)return t;var l=ae(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=ae(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?"after":"before";return r.ch==p&&r.sticky==g?t:new bi(new et(r.line,p,g),n)}(e,new bi(st(o,C),b)),$i(o,wi(e,S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,t&&(we(t),i.input.focus()),pe(i.wrapper.ownerDocument,"mousemove",v),pe(i.wrapper.ownerDocument,"mouseup",m),o.history.lastSelOrigin=null}var v=Zn(e,function(t){0!==t.buttons&&ke(t)?function t(r){var l=++p;var s=sn(e,r,!0,"rectangle"==n.unit);if(!s)return;if(0!=tt(s,h)){e.curOp.focus=W(),f(s);var a=Tn(i,o);(s.line>=a.to||s.lined.bottom?20:0;u&&setTimeout(Zn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=Zn(e,g);e.state.selectingText=m,fe(i.wrapper.ownerDocument,"mousemove",v),fe(i.wrapper.ownerDocument,"mouseup",m)}(e,n,t,o)}(t,n,o,e):Le(e)==r.scroller&&we(e):2==i?(n&&Ki(t.doc,n),setTimeout(function(){return r.input.focus()},20)):3==i&&(S?t.display.input.onContextMenu(e):xn(t)))}}function dl(e,t,r){if("char"==r)return new bi(t,t);if("word"==r)return e.findWordAt(t);if("line"==r)return new bi(et(t.line,0),st(e.doc,et(t.line+1,0)));var n=r(e,t);return new bi(n.from,n.to)}function pl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&we(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ye(e,r))return Ce(t);o-=s.top-l.viewOffset;for(var a=0;a=i)return ge(e,r,e,Ze(e.doc,o),e.display.gutterSpecs[a].className,t),Ce(t)}}function gl(e,t){return pl(e,t,"gutterClick",!0)}function vl(e,t){xr(e.display,t)||function(e,t){if(!ye(e,"gutterContextMenu"))return!1;return pl(e,t,"gutterContextMenu",!1)}(e,t)||ve(e,t,"contextmenu")||S||e.display.input.onContextMenu(t)}function ml(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Rr(e)}hl.prototype.compare=function(e,t,r){return this.time+400>e&&0==tt(t,this.pos)&&r==this.button};var yl={toString:function(){return"CodeMirror.Init"}},bl={},wl={};function xl(e,t,r){if(!t!=!(r&&r!=yl)){var n=e.display.dragFunctions,i=t?fe:pe;i(e.display.scroller,"dragstart",n.start),i(e.display.scroller,"dragenter",n.enter),i(e.display.scroller,"dragover",n.over),i(e.display.scroller,"dragleave",n.leave),i(e.display.scroller,"drop",n.drop)}}function Cl(e){e.options.lineWrapping?(H(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(T(e.display.wrapper,"CodeMirror-wrap"),jt(e)),ln(e),un(e),Rr(e),setTimeout(function(){return Rn(e)},100)}function Sl(e,t){var n=this;if(!(this instanceof Sl))return new Sl(e,t);this.options=t=t?I(t):{},I(bl,t,!1);var i=t.value;"string"==typeof i?i=new Mo(i,t.mode,null,t.lineSeparator,t.direction):t.mode&&(i.modeOption=t.mode),this.doc=i;var o=new Sl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n,i){var o=this;this.input=n,o.scrollbarFiller=O("div",null,"CodeMirror-scrollbar-filler"),o.scrollbarFiller.setAttribute("cm-not-content","true"),o.gutterFiller=O("div",null,"CodeMirror-gutter-filler"),o.gutterFiller.setAttribute("cm-not-content","true"),o.lineDiv=A("div",null,"CodeMirror-code"),o.selectionDiv=O("div",null,null,"position: relative; z-index: 1"),o.cursorDiv=O("div",null,"CodeMirror-cursors"),o.measure=O("div",null,"CodeMirror-measure"),o.lineMeasure=O("div",null,"CodeMirror-measure"),o.lineSpace=A("div",[o.measure,o.lineMeasure,o.selectionDiv,o.cursorDiv,o.lineDiv],null,"position: relative; outline: none");var u=A("div",[o.lineSpace],"CodeMirror-lines");o.mover=O("div",[u],null,"position: relative"),o.sizer=O("div",[o.mover],"CodeMirror-sizer"),o.sizerWidth=null,o.heightForcer=O("div",null,null,"position: absolute; height: "+G+"px; width: 1px;"),o.gutters=O("div",null,"CodeMirror-gutters"),o.lineGutter=null,o.scroller=O("div",[o.sizer,o.heightForcer,o.gutters],"CodeMirror-scroll"),o.scroller.setAttribute("tabIndex","-1"),o.wrapper=O("div",[o.scrollbarFiller,o.gutterFiller,o.scroller],"CodeMirror"),l&&s<8&&(o.gutters.style.zIndex=-1,o.scroller.style.paddingRight=0),a||r&&m||(o.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(o.wrapper):e(o.wrapper)),o.viewFrom=o.viewTo=t.first,o.reportedViewFrom=o.reportedViewTo=t.first,o.view=[],o.renderedView=null,o.externalMeasured=null,o.viewOffset=0,o.lastWrapHeight=o.lastWrapWidth=0,o.updateLineNumbers=null,o.nativeBarWidth=o.barHeight=o.barWidth=0,o.scrollbarsClipped=!1,o.lineNumWidth=o.lineNumInnerWidth=o.lineNumChars=null,o.alignWidgets=!1,o.cachedCharWidth=o.cachedTextHeight=o.cachedPaddingH=null,o.maxLine=null,o.maxLineLength=0,o.maxLineChanged=!1,o.wheelDX=o.wheelDY=o.wheelStartX=o.wheelStartY=null,o.shift=!1,o.selForContextMenu=null,o.activeTouch=null,o.gutterSpecs=ci(i.gutters,i.lineNumbers),hi(o),n.init(o)}(e,i,o,t);for(var c in u.wrapper.CodeMirror=this,ml(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Un(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;fe(t.scroller,"mousedown",Zn(e,fl)),fe(t.scroller,"dblclick",l&&s<11?Zn(e,function(t){if(!ve(e,t)){var r=sn(e,t);if(r&&!gl(e,t)&&!xr(e.display,t)){we(t);var n=e.findWordAt(r);Ki(e.doc,n.anchor,n.head)}}}):function(t){return ve(e,t)||we(t)});fe(t.scroller,"contextmenu",function(t){return vl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}fe(t.scroller,"touchstart",function(i){if(!ve(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!gl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),fe(t.scroller,"touchmove",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),fe(t.scroller,"touchend",function(r){var n=t.activeTouch;if(n&&!xr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,"page");l=!n.prev||o(n,n.prev)?new bi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new bi(et(s.line,0),st(e.doc,et(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),we(r)}i()}),fe(t.scroller,"touchcancel",i),fe(t.scroller,"scroll",function(){t.scroller.clientHeight&&(Hn(e,t.scroller.scrollTop),Pn(e,t.scroller.scrollLeft,!0),ge(e,"scroll",e))}),fe(t.scroller,"mousewheel",function(t){return mi(e,t)}),fe(t.scroller,"DOMMouseScroll",function(t){return mi(e,t)}),fe(t.wrapper,"scroll",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){ve(e,t)||Se(t)},over:function(t){ve(e,t)||(!function(e,t){var r=sn(e,t);if(r){var n=document.createDocumentFragment();vn(e,r,n),e.display.dragCursor||(e.display.dragCursor=O("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),Se(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-No<100))Se(t);else if(!ve(e,t)&&!xr(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var r=O("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:Zn(e,Oo),leave:function(t){ve(e,t)||Ao(e)}};var a=t.input.getField();fe(a,"keyup",function(t){return sl.call(e,t)}),fe(a,"keydown",Zn(e,ll)),fe(a,"keypress",Zn(e,al)),fe(a,"focus",function(t){return Cn(e,t)}),fe(a,"blur",function(t){return Sn(e,t)})}(this),Ho(),Kn(this),this.curOp.forceUpdate=!0,Di(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(Cn,this),20):Sn(this),wl)wl.hasOwnProperty(c)&&wl[c](n,t[c],yl);ui(this),t.finishInit&&t.finishInit(this);for(var d=0;d150)){if(!n)return;r="prev"}}else u=0,r="not";"prev"==r?u=t>o.first?z(Xe(o,t-1).text,null,l):0:"add"==r?u=a+e.options.indentUnit:"subtract"==r?u=a-e.options.indentUnit:"number"==typeof r&&(u=a+r),u=Math.max(0,u);var h="",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+="\t";if(fl,a=We(t),u=null;if(s&&n.ranges.length>1)if(Tl&&Tl.text.join("\n")==t){if(n.ranges.length%Tl.text.length==0){u=[];for(var c=0;c=0;f--){var d=n.ranges[f],p=d.from(),g=d.to();d.empty()&&(r&&r>0?p=et(p.line,p.ch-r):e.state.overwrite&&!s?g=et(g.line,Math.min(Xe(o,g.line).text.length,g.ch+$(a).length)):s&&Tl&&Tl.lineWise&&Tl.text.join("\n")==t&&(p=g=et(p.line,0)));var v={from:p,to:g,text:u?u[f%u.length]:a,origin:i||(s?"paste":e.state.cutIncoming>l?"cut":"+input")};oo(e.doc,v),sr(e,"inputRead",e,v)}t&&!s&&Al(e,t),On(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function Ol(e,t){var r=e.clipboardData&&e.clipboardData.getData("Text");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||qn(t,function(){return Nl(t,r,0,null,"paste")}),!0}function Al(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s-1){l=kl(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Xe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=kl(e,i.head.line,"smart"));l&&sr(e,"electricInput",e,i.head.line)}}}function Dl(e){for(var t=[],r=[],n=0;n=t.text.length?(r.ch=t.text.length,r.sticky="before"):r.ch<=0&&(r.ch=0,r.sticky="after");var o=ae(i,r.ch,r.sticky),l=i[o];if("ltr"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from=l.from&&f>=c.begin)){var d=h?"before":"after";return new et(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new et(r.line,a(e,1),"before"):new et(r.line,e,"after")};e>=0&&e0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):$o(s,t,r))){if(n||(l=t.line+r)=e.first+e.size||(t=new et(l,t.ch,t.sticky),!(s=Xe(e,l))))return!1;t=qo(i,e.cm,s,t.line,r)}else t=o;return!0}if("char"==n)a();else if("column"==n)a(!0);else if("word"==n||"group"==n)for(var u=null,c="group"==n,h=e.cm&&e.cm.getHelper(t,"wordChars"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||"\n",p=te(d,h)?"w":c&&"\n"==d?"n":!c||/\s/.test(d)?null:"p";if(!c||f||p||(p="s"),u&&u!=p){r<0&&(r=1,a(),t.sticky="after");break}if(p&&(u=p),r>0&&!a(!f))break}var g=to(e,t,o,l,!0);return rt(o,g)&&(g.hitSide=!0),g}function Pl(e,t,r,n){var i,o,l=e.doc,s=t.left;if("page"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*en(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else"line"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=$r(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var El=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Il(e,t){var r=Ar(e,t.line);if(!r||r.hidden)return null;var n=Xe(e.doc,t.line),i=Nr(r,n,t.line),o=ce(n,e.doc.direction),l="left";o&&(l=ae(o,t.ch)%2?"right":"left");var s=Pr(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function zl(e,t){return t&&(e.bad=!0),e}function Rl(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return zl(e.clipPos(et(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i=t.display.viewTo||o.line=t.display.viewFrom&&Il(t,i)||{node:a[0].measure.map[2],offset:0},c=o.linen.firstLine()&&(l=et(l.line-1,Xe(n.doc,l.line-1).length)),s.ch==Xe(n.doc,s.line).text.length&&s.linei.viewTo-1)return!1;l.line==i.viewFrom||0==(e=an(n,l.line))?(t=qe(i.view[0].line),r=i.view[0].node):(t=qe(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=an(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=qe(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o="",l=!1,s=e.doc.lineSeparator(),a=!1;function u(){l&&(o+=s,a&&(o+=s),l=a=!1)}function c(e){e&&(u(),o+=e)}function h(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(r)return void c(r);var o,f=t.getAttribute("cm-marker");if(f){var d=e.findMarks(et(n,0),et(i+1,0),(v=+f,function(e){return e.id==v}));return void(d.length&&(o=d[0].find(0))&&c(Ye(e.doc,o.from,o.to).join(s)))}if("false"==t.getAttribute("contenteditable"))return;var p=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;p&&u();for(var g=0;g1&&f.length>1;)if($(h)==$(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);dl.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\u200b+/,""),h[0]=h[0].slice(d).replace(/\u200b+$/,"");var x=et(t,d),C=et(a,f.length?$(f).length-p:0);return h.length>1||h[0]||tt(x,C)?(co(n.doc,h,x,C,"+input"),!0):void 0},El.prototype.ensurePolled=function(){this.forceCompositionEnd()},El.prototype.reset=function(){this.forceCompositionEnd()},El.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},El.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},El.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||qn(this.cm,function(){return un(e.cm)})},El.prototype.setUneditable=function(e){e.contentEditable="false"},El.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Zn(this.cm,Nl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},El.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},El.prototype.onContextMenu=function(){},El.prototype.resetPosition=function(){},El.prototype.needsContentAttribute=!0;var Gl=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Dl(n);Ml({lineWise:!0,text:t.text}),"cut"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput="",i.value=t.text.join("\n"),P(i))}"cut"==e.type&&(n.state.cutIncoming=+new Date)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width="0px"),fe(i,"input",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),fe(i,"paste",function(e){ve(n,e)||Ol(e,n)||(n.state.pasteIncoming=+new Date,r.fastPoll())}),fe(i,"cut",o),fe(i,"copy",o),fe(e.scroller,"paste",function(t){if(!xr(e,t)&&!ve(n,t)){if(!i.dispatchEvent)return n.state.pasteIncoming=+new Date,void r.focus();var o=new Event("paste");o.clipboardData=t.clipboardData,i.dispatchEvent(o)}}),fe(e.lineSpace,"selectstart",function(t){xr(e,t)||we(t)}),fe(i,"compositionstart",function(){var e=n.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor("to"),{className:"CodeMirror-composing"})}}),fe(i,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Hl(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=gn(e);if(e.options.moveInputWithCursor){var i=Xr(e,r.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value="",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||He(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var a=0,u=Math.min(n.length,i.length);a1e3||i.indexOf("\n")>-1?r.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var o=sn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&Zn(r,$i)(r.doc,xi(o),V);var c,f=i.style.cssText,d=t.wrapper.style.cssText,p=t.wrapper.offsetParent.getBoundingClientRect();if(t.wrapper.style.cssText="position: static",i.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-p.top-5)+"px; left: "+(e.clientX-p.left-5)+"px;\n z-index: 1000; background: "+(l?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",a&&(c=window.scrollY),n.input.focus(),a&&window.scrollTo(null,c),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=m,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){Se(e);var g=function(){pe(window,"mouseup",g),setTimeout(m,20)};fe(window,"mouseup",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o="​"+(e?i.value:"");i.value="⇚",i.value=o,t.prevInput=e?"":"​",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending==m&&(t.contextMenuPending=!1,t.wrapper.style.cssText=d,i.style.cssText=f,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart)){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&"​"==t.prevInput?Zn(r,no)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=yl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=yl,r("value","",function(e,t){return e.setValue(t)},!0),r("mode",null,function(e,t){e.doc.modeOption=t,Ti(e)},!0),r("indentUnit",2,Ti,!0),r("indentWithTabs",!1),r("smartIndent",!0),r("tabSize",4,function(e){Mi(e),Rr(e),un(e)},!0),r("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(et(n,o))}n++});for(var i=r.length-1;i>=0;i--)co(e.doc,t,r[i],et(r[i].line,r[i].ch+t.length))}}),r("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),r!=yl&&e.refresh()}),r("specialCharPlaceholder",Qt,function(e){return e.refresh()},!0),r("electricChars",!0),r("inputStyle",m?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),r("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r("autocorrect",!1,function(e,t){return e.getInputField().autocorrect=t},!0),r("autocapitalize",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),r("rtlMoveVisually",!w),r("wholeLineUpdateBefore",!0),r("theme","default",function(e){ml(e),fi(e)},!0),r("keyMap","default",function(e,t,r){var n=Xo(t),i=r!=yl&&Xo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r("extraKeys",null),r("configureMouse",null),r("lineWrapping",!1,Cl,!0),r("gutters",[],function(e,t){e.display.gutterSpecs=ci(t,e.options.lineNumbers),fi(e)},!0),r("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?nn(e.display)+"px":"0",e.refresh()},!0),r("coverGutterNextToScrollbar",!1,function(e){return Rn(e)},!0),r("scrollbarStyle","native",function(e){Un(e),Rn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r("lineNumbers",!1,function(e,t){e.display.gutterSpecs=ci(e.options.gutters,t),fi(e)},!0),r("firstLineNumber",1,fi,!0),r("lineNumberFormatter",function(e){return e},fi,!0),r("showCursorWhenSelecting",!1,pn,!0),r("resetSelectionOnContextMenu",!0),r("lineWiseCopyCut",!0),r("pasteLinesPerSelection",!0),r("selectionsMayTouch",!1),r("readOnly",!1,function(e,t){"nocursor"==t&&(Sn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),r("dragDrop",!0,xl),r("allowDropFileTypes",null),r("cursorBlinkRate",530),r("cursorScrollMargin",0),r("cursorHeight",1,pn,!0),r("singleCursorHeightPerLine",!0,pn,!0),r("workTime",100),r("workDelay",100),r("flattenSpans",!0,Mi,!0),r("addModeClass",!1,Mi,!0),r("pollInterval",100),r("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),r("historyEventDelay",1250),r("viewportMargin",10,function(e){return e.refresh()},!0),r("maxHighlightLength",1e4,Mi,!0),r("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),r("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),r("autofocus",null),r("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0),r("phrases",null)}(Sl),function(e){var t=e.optionHandlers,r=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,r){var n=this.options,i=n[e];n[e]==r&&"mode"!=e||(n[e]=r,t.hasOwnProperty(e)&&Zn(this,t[e])(this,r,i),ge(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Xo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;rr&&(kl(this,i.head.line,e,!0),r=i.head.line,n==this.doc.sel.primIndex&&On(this));else{var o=i.from(),l=i.to(),s=Math.max(r,o.line);r=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var a=s;a0&&Xi(this.doc,n,new bi(o,u[n].to()),V)}}}),getTokenAt:function(e,t){return yt(this,e,t)},getLineTokens:function(e,t){return yt(this,et(e),t,!0)},getTokenTypeAt:function(e){e=st(this.doc,e);var t,r=ft(this,Xe(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]o&&(e=o,i=!0),n=Xe(this.doc,e)}else n=e;return Vr(this,n,{top:0,left:0},t||"page",r||i).top+(i?this.doc.height-Vt(n):0)},defaultTextHeight:function(){return en(this.display)},defaultCharWidth:function(){return tn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Xr(this,st(this.doc,e))).bottom,c=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),a.sizer.appendChild(t),"over"==n)u=e.top;else if("above"==n||"near"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);("above"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+"px",t.style.left=t.style.right="","right"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?c=0:"middle"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+"px"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=Mn(o,l)).scrollTop&&Hn(o,s.scrollTop),null!=s.scrollLeft&&Pn(o,s.scrollLeft))},triggerOnKeyDown:Qn(ll),triggerOnKeyPress:Qn(al),triggerOnKeyUp:sl,triggerOnMouseDown:Qn(fl),execCommand:function(e){if(Zo.hasOwnProperty(e))return Zo[e].call(null,this)},triggerElectric:Qn(function(e){Al(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=st(this.doc,e),l=0;l0&&l(t.charAt(r-1));)--r;for(;n.5)&&ln(this),ge(this,"refresh",this)}),swapDoc:Qn(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Di(this,e),Rr(this),this.display.input.reset(),An(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,sr(this,"swapDoc",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},be(e),e.registerHelper=function(t,n,i){r.hasOwnProperty(t)||(r[t]=e[t]={_global:[]}),r[t][n]=i},e.registerGlobalHelper=function(t,n,i,o){e.registerHelper(t,n,o),r[t]._global.push({pred:i,val:o})}}(Sl);var Ul="iter insert remove copy getEditor constructor".split(" ");for(var Vl in Mo.prototype)Mo.prototype.hasOwnProperty(Vl)&&B(Ul,Vl)<0&&(Sl.prototype[Vl]=function(e){return function(){return e.apply(this.doc,arguments)}}(Mo.prototype[Vl]));return be(Mo),Sl.inputStyles={textarea:Gl,contenteditable:El},Sl.defineMode=function(e){Sl.defaults.mode||"null"==e||(Sl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ee[e]=t}.apply(this,arguments)},Sl.defineMIME=function(e,t){Ie[e]=t},Sl.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),Sl.defineMIME("text/plain","null"),Sl.defineExtension=function(e,t){Sl.prototype[e]=t},Sl.defineDocExtension=function(e,t){Mo.prototype[e]=t},Sl.fromTextArea=function(e,t){if((t=t?I(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute("autofocus")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(fe(e.form,"submit",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(r){r.save=n,r.getTextArea=function(){return e},r.toTextArea=function(){r.toTextArea=isNaN,n(),e.parentNode.removeChild(r.getWrapperElement()),e.style.display="",e.form&&(pe(e.form,"submit",n),t.leaveSubmitMethodAlone||"function"!=typeof e.form.submit||(e.form.submit=i))}},e.style.display="none";var s=Sl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},function(e){e.off=pe,e.on=fe,e.wheelEventPixels=vi,e.Doc=Mo,e.splitLines=We,e.countColumn=z,e.findColumn=X,e.isWordChar=ee,e.Pass=U,e.signal=ge,e.Line=Xt,e.changeEnd=Ci,e.scrollbarModel=Gn,e.Pos=et,e.cmpPos=tt,e.modes=Ee,e.mimeModes=Ie,e.resolveMode=ze,e.getMode=Re,e.modeExtensions=Be,e.extendMode=Ge,e.copyState=Ue,e.startState=Ke,e.innerMode=Ve,e.commands=Zo,e.keyMap=Ro,e.keyName=jo,e.isModifierKey=Vo,e.lookupKey=Uo,e.normalizeKeyMap=Go,e.StringStream=je,e.SharedTextMarker=So,e.TextMarker=xo,e.LineWidget=yo,e.e_preventDefault=we,e.e_stopPropagation=xe,e.e_stop=Se,e.addClass=H,e.contains=D,e.rmClass=T,e.keyNames=Po}(Sl),Sl.version="5.49.2",Sl}); \ No newline at end of file diff --git a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js b/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js deleted file mode 100755 index 4a5e499bf..000000000 --- a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("yaml",function(){var e=new RegExp("\\b(("+["true","false","on","off","yes","no"].join(")|(")+"))$","i");return{token:function(i,t){var r=i.peek(),n=t.escaped;if(t.escaped=!1,"#"==r&&(0==i.pos||/\s/.test(i.string.charAt(i.pos-1))))return i.skipToEnd(),"comment";if(i.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(t.literal&&i.indentation()>t.keyCol)return i.skipToEnd(),"string";if(t.literal&&(t.literal=!1),i.sol()){if(t.keyCol=0,t.pair=!1,t.pairStart=!1,i.match(/---/))return"def";if(i.match(/\.\.\./))return"def";if(i.match(/\s*-\s+/))return"meta"}if(i.match(/^(\{|\}|\[|\])/))return"{"==r?t.inlinePairs++:"}"==r?t.inlinePairs--:"["==r?t.inlineList++:t.inlineList--,"meta";if(t.inlineList>0&&!n&&","==r)return i.next(),"meta";if(t.inlinePairs>0&&!n&&","==r)return t.keyCol=0,t.pair=!1,t.pairStart=!1,i.next(),"meta";if(t.pairStart){if(i.match(/^\s*(\||\>)\s*/))return t.literal=!0,"meta";if(i.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(0==t.inlinePairs&&i.match(/^\s*-?[0-9\.\,]+\s?$/))return"number";if(t.inlinePairs>0&&i.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(i.match(e))return"keyword"}return!t.pair&&i.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)?(t.pair=!0,t.keyCol=i.indentation(),"atom"):t.pair&&i.match(/^:\s*/)?(t.pairStart=!0,"meta"):(t.pairStart=!1,t.escaped="\\"==r,i.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),e.defineMIME("text/x-yaml","yaml"),e.defineMIME("text/yaml","yaml")}); \ No newline at end of file diff --git a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css b/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css deleted file mode 100755 index 6c708c010..000000000 --- a/luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css +++ /dev/null @@ -1 +0,0 @@ -.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36 !important;color:#f8f8f2 !important;border:0}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,0.10)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:white}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-keyword{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute{color:#50fa7b}.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-variable-3,.cm-s-dracula span.cm-type{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:rgba(255,255,255,0.1)}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:white !important} diff --git a/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js b/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js deleted file mode 100755 index 6284357c6..000000000 --- a/luci-app-adguardhome/root/www/luci-static/resources/twin-bcrypt.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/* @license - * Twin-Bcrypt 2.2.0 - * https://github.com/fpirsch/twin-bcrypt - * Licence: BSD-3-Clause - */ -!function(r,n){"use strict";function e(r){return y[g]=t.apply(n,r),g++}function t(r){var e=[].slice.call(arguments,1);return function(){"function"==typeof r?r.apply(n,e):new Function(""+r)()}}function o(r){if(m)setTimeout(t(o,r),0);else{var n=y[r];if(n){m=!0;try{n()}finally{a(r),m=!1}}}}function a(r){delete y[r]}function i(){p=function(){var r=e(arguments);return process.nextTick(t(o,r)),r}}function u(){if(r.postMessage&&!r.importScripts){var n=!0,e=r.onmessage;return r.onmessage=function(){n=!1},r.postMessage("","*"),r.onmessage=e,n}}function f(){var n="setImmediate$"+Math.random()+"$",t=function(e){e.source===r&&"string"==typeof e.data&&0===e.data.indexOf(n)&&o(+e.data.slice(n.length))};r.addEventListener?r.addEventListener("message",t,!1):r.attachEvent("onmessage",t),p=function(){var t=e(arguments);return r.postMessage(n+t,"*"),t}}function c(){var r=new MessageChannel;r.port1.onmessage=function(r){var n=r.data;o(n)},p=function(){var n=e(arguments);return r.port2.postMessage(n),n}}function s(){var r=v.documentElement;p=function(){var n=e(arguments),t=v.createElement("script");return t.onreadystatechange=function(){o(n),t.onreadystatechange=null,r.removeChild(t),t=null},r.appendChild(t),n}}function l(){p=function(){var r=e(arguments);return setTimeout(t(o,r),0),r}}if(!r.setImmediate){var p,g=1,y={},m=!1,v=r.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(r);d=d&&d.setTimeout?d:r,"[object process]"==={}.toString.call(r.process)?i():u()?f():r.MessageChannel?c():v&&"onreadystatechange"in v.createElement("script")?s():l(),d.setImmediate=p,d.clearImmediate=a}}(new Function("return this")()),function(r){"object"==typeof exports?r(exports,require("crypto")):r(self.TwinBcrypt={},self.crypto||self.msCrypto)}(function(r,n){"use strict";function e(r){for(var n=unescape(encodeURIComponent(r)),e=n.length,t=new Array(e),o=0;e>o;o++)t[o]=n.charCodeAt(o);return t}function t(r){for(var n=r.length,e=new Array(n),t=0;n>t;t++)e[t]=r.charCodeAt(t);return e}function o(r,n){for(var e,t,o=0,a="";n>o;){if(e=255&r[o++],a+=B[e>>2],e=(3&e)<<4,o>=n){a+=B[e];break}if(t=255&r[o++],e|=t>>4,a+=B[e],e=(15&t)<<2,o>=n){a+=B[e];break}t=255&r[o++],e|=t>>6,a+=B[e],a+=B[63&t]}return a}function a(r){for(var n,e,t=new Array(16),o=0,a=0;;){if(n=D[r.charCodeAt(o++)-46],e=D[r.charCodeAt(o++)-46],t[a++]=255&(n<<2|e>>4),22===o)break;n=e<<4,e=D[r.charCodeAt(o++)-46],t[a++]=255&(n|e>>2),n=e<<6,e=D[r.charCodeAt(o++)-46],t[a++]=255&(n|e)}return t}function i(r){for(var n=r.length,e=new Array(72),t=0,o=0;72>o;)e[o++]=r[t++],t===n&&(t=0);return e}function u(r,n,e){for(var t=0,o=e>>2;tt;)r[n++]=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++]}function c(r){function n(n){for(var e=r,t=G>>2,o=t|O,f=n>>2,c=e[f]^e[t],s=e[1|f];o>t;)s^=(e[c>>>24]+e[a|c>>>16&255]^e[i|c>>>8&255])+e[u|255&c]^e[++t],c^=(e[s>>>24]+e[a|s>>>16&255]^e[i|s>>>8&255])+e[u|255&s]^e[++t];e[f]=s^e[S>>2],e[1|f]=c}function e(n){var e;for(r[L>>2]=0,r[L+4>>2]=0,e=0;M>e;e++)r[G>>2|e]^=r[(n>>2)+e];var t,o,f,c,s,l=r;for(e=0;M>e;e+=2){for(t=G>>2,o=t|O,f=L>>2,c=l[f]^l[t],s=l[1|f];o>t;)s^=(l[c>>>24]+l[a|c>>>16&255]^l[i|c>>>8&255])+l[u|255&c]^l[++t],c^=(l[s>>>24]+l[a|s>>>16&255]^l[i|s>>>8&255])+l[u|255&s]^l[++t];l[f]=s^l[S>>2],l[1|f]=c,r[G>>2|e]=l[f],r[G>>2|e+1]=c}for(e=0;T>e;e+=2){for(t=G>>2,o=t|O,f=L>>2,c=l[f]^l[t],s=l[1|f];o>t;)s^=(l[c>>>24]+l[a|c>>>16&255]^l[i|c>>>8&255])+l[u|255&c]^l[++t],c^=(l[s>>>24]+l[a|s>>>16&255]^l[i|s>>>8&255])+l[u|255&s]^l[++t];l[f]=s^l[S>>2],l[1|f]=c,r[e]=l[f],r[1|e]=c}}function t(r,n,t){for(var o=0;t>=o&&!(r>n);o++)e(R),e(j),r++;return r}var o=k>>2,a=o+256|0,i=a+256|0,u=i+256|0;return{encrypt:n,expandLoop:t}}function s(stdlib, foreign, heap) {"use asm";var HEAP32=new stdlib.Uint32Array(heap);var BLOWFISH_NUM_ROUNDS=16;var S_offset=0x0000;var S1_offset=0x0400;var S2_offset=0x0800;var S3_offset=0x0C00;var P_offset=0x1000;var P_last_offset=0x1044;var crypt_ciphertext_offset=0x1048;var LR_offset=0x01060;var password_offset=0x1068;var salt_offset=0x10b0;var P_LEN=18;var S_LEN=1024;function encrypt(offset) {offset=offset|0;var i=0;var n=0;var L=0;var R=0;var imax=0;imax=P_offset|BLOWFISH_NUM_ROUNDS<<2;L=HEAP32[offset>>2]|0;R=HEAP32[offset+4>>2]|0;L=L^HEAP32[P_offset>>2];for (i=P_offset; (i|0)<(imax|0);) {i=(i+4)>>>0;R=R^(((HEAP32[(L>>>22)>>2]>>>0) +(HEAP32[(S1_offset|(L>>>14&0x3ff))>>2]>>>0) ^(HEAP32[(S2_offset|(L>>>6&0x3ff))>>2])) +(HEAP32[(S3_offset|(L<<2&0x3ff))>>2]>>>0))^HEAP32[i>>2];i=(i+4)>>>0;L=L^(((HEAP32[(R>>>22)>>2]>>>0) +(HEAP32[(S1_offset|(R>>>14&0x3ff))>>2]>>>0) ^(HEAP32[(S2_offset|(R>>>6&0x3ff))>>2])) +(HEAP32[(S3_offset|(R<<2&0x3ff))>>2]>>>0))^HEAP32[i>>2];}HEAP32[offset>>2]=R^HEAP32[P_last_offset>>2];HEAP32[(offset+4)>>2]=L;}function expandKey(offset) {offset=offset|0;var i=0;var off=0;off=P_offset|0;for (i=0; (i|0)<(P_LEN|0); i=(i+1)|0) {HEAP32[off>>2]=HEAP32[off>>2]^HEAP32[offset>>2];offset=(offset+4)|0;off=(off+4)|0;}HEAP32[LR_offset>>2]=0;HEAP32[LR_offset+4>>2]=0;off=P_offset;for (i=0; (i|0)<(P_LEN|0); i=(i+2)|0) {encrypt(LR_offset);HEAP32[off>>2]=HEAP32[LR_offset>>2];HEAP32[off+4>>2]=HEAP32[LR_offset+4>>2];off=(off+8)|0;}off=S_offset;for (i=0; (i|0)<(S_LEN|0); i=(i+2)|0) {encrypt(LR_offset);HEAP32[off>>2]=HEAP32[LR_offset>>2];HEAP32[off+4>>2]=HEAP32[LR_offset+4>>2];off=(off+8)|0;}}function expandLoop(i, counterEnd, maxIterations) {i=i|0;counterEnd=counterEnd|0;maxIterations=maxIterations|0;var j=0;for (j=0; (j|0) <= (maxIterations|0); j=(j+1)|0) {if ((i>>>0)>(counterEnd>>>0)) break;expandKey(password_offset);expandKey(salt_offset);i=(i+1)>>>0;}return i|0;}return {encrypt: encrypt,expandLoop: expandLoop};} -function l(r,n,e,t){var o,a,i,u=L>>2,f=u+1;for(t[u]=0,t[f]=0,a=0,o=0;M>o;o++)i=n[a++]<<24|n[a++]<<16|n[a++]<<8|n[a++],t[G>>2|o]^=i;for(a=0,o=0;M>o;o+=2)i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[u]^=i,i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[f]^=i,e.encrypt(L),t[G>>2|o]=t[u],t[G>>2|o+1]=t[f];var c=k>>2;for(o=0;T>o;o+=2)i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[u]^=i,i=r[a++]<<24|r[a++]<<16|r[a++]<<8|r[a++],a&=65295,t[f]^=i,e.encrypt(L),t[c|o]=t[u],t[c|o+1]=t[f]}function p(r,n,e,t,o,a,i){for(var u=e;t>=u;){if(u=r.expandLoop(u,t,o),a){var f=a(u/(t+1));if(f===!1)return}if(u>t){if(i)return void setImmediate(g.bind(null,r,n,i));return}if(i)return void setImmediate(p.bind(null,r,n,u,t,o,a,i))}}function g(r,n,e){u(n,x,F);var t;for(t=0;64>t;t++)r.encrypt(F+0),r.encrypt(F+8),r.encrypt(F+16);var o,a=0,i=x.length,f=new Array(4*i);for(t=0;i>t;t++)o=n[(F>>2)+t],f[a++]=o>>24,f[a++]=o>>16&255,f[a++]=o>>8&255,f[a++]=255&o;return e&&e(f),f}function y(r,n){return r+o(n,23)}function m(n,o,m,v){var d,h=o.substr(0,29),w=+o.substr(4,2),A=o.substr(7,22);if("string"==typeof n)d=r.encodingMode===r.ENCODING_UTF8?e(n):t(n);else if(Array.isArray(n))d=n.map(function(r){return 255&r});else{if(!(n instanceof Uint8Array))throw new Error("Incorrect arguments");d=Array.prototype.slice.call(n)}d.push(0);var b,E,N=a(A,C),O=31>w?1<>2,N),f(b,R>>2,d),l(N,d,E,b),v?void p(E,b,0,M,T,m,function(r){v(y(h,r))}):(p(E,b,0,M,T,m),y(h,g(E,b)))}function v(r){if(!b)throw new Error("No cryptographically secure pseudorandom number generator available.");if(null==r&&(r=N),r=0|+r,isNaN(r)||4>r||r>31)throw new Error("Invalid cost parameter.");var n="$2y$";return 10>r&&(n+="0"),n+=r+"$",n+=o(b(C),C)}function d(r,n,e){if(n&&"number"!=typeof n){if("string"!=typeof n||!z.test(n))throw new Error("Invalid salt")}else n=v(n);return m(r,n,e)}function h(r,n,e,t){if(arguments.length<2)throw new Error("Incorrect arguments");if(2===arguments.length?(t=n,n=e=null):3===arguments.length&&(t=e,e=null,"function"==typeof n&&(e=n,n=null)),n&&"number"!=typeof n){if("string"!=typeof n||!z.test(n))throw new Error("Invalid salt")}else n=v(n);if(!t||"function"!=typeof t)throw new Error("No callback function was given.");m(r,n,e,t)}function w(r,n){if("string"!=typeof n||!Z.test(n))throw new Error("Incorrect arguments");var e=n.substr(0,n.length-31),t=d(r,e);return t===n}function A(r,n,e,t){if("string"!=typeof n||!Z.test(n))throw new Error("Incorrect arguments");if(t||(t=e,e=null),!t||"function"!=typeof t)throw new Error("No callback function was given.");var o=n.substr(0,n.length-31);h(r,o,e,function(r){t(r===n)})}var b,E="undefined"!=typeof InstallTrigger,I=E;n&&(b=n.randomBytes,n.getRandomValues&&(b=function(r){var e=new Uint8Array(r);return n.getRandomValues(e)}));var C=16,N=10,O=16,$=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],U=[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946,1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055,3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504,976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462],M=$.length,T=U.length,x=[1332899944,1700884034,1701343084,1684370003,1668446532,1869963892],k=0,G=4096,S=4164,F=4168,L=4192,R=4200,j=4272,B="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",D=[0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,-1,-1,-1,-1,-1],z=/^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/,Z=/^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu][.\/A-Za-z0-9]{30}[.CGKOSWaeimquy26]$/;r.genSalt=v,r.hashSync=d,r.hash=h,r.compareSync=w,r.compare=A,r.ENCODING_UTF8=0,r.ENCODING_RAW=1,r.encodingMode=r.ENCODING_UTF8,r.cryptoRNG=!!b,r.randomBytes=b,r.defaultCost=N,r.version="2.2.0"}); \ No newline at end of file diff --git a/luci-app-diskman/Makefile b/luci-app-diskman/Makefile deleted file mode 100755 index fa6c46357..000000000 --- a/luci-app-diskman/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=luci-app-diskman - -PKG_MAINTAINER:=lisaac -PKG_LICENSE:=AGPL-3.0 - -LUCI_TITLE:=Disk Manager interface for LuCI -LUCI_DEPENDS:=+blkid +e2fsprogs +parted +smartmontools \ - +PACKAGE_$(PKG_NAME)_INCLUDE_btrfs_progs:btrfs-progs \ - +PACKAGE_$(PKG_NAME)_INCLUDE_lsblk:lsblk \ - +PACKAGE_$(PKG_NAME)_INCLUDE_mdadm:mdadm \ - +PACKAGE_$(PKG_NAME)_INCLUDE_kmod_md_raid456:mdadm \ - +PACKAGE_$(PKG_NAME)_INCLUDE_kmod_md_raid456:kmod-md-raid456 \ - +PACKAGE_$(PKG_NAME)_INCLUDE_kmod_md_linears:mdadm \ - +PACKAGE_$(PKG_NAME)_INCLUDE_kmod_md_linears:kmod-md-linear - -include $(INCLUDE_DIR)/package.mk - -define Package/$(PKG_NAME)/config -config PACKAGE_$(PKG_NAME)_INCLUDE_btrfs_progs - bool "Include btrfs-progs" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_lsblk - bool "Include lsblk" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_mdadm - bool "Include mdadm" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_kmod_md_raid456 - depends on PACKAGE_$(PKG_NAME)_INCLUDE_mdadm - bool "Include kmod-md-raid456" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_kmod_md_linear - depends on PACKAGE_$(PKG_NAME)_INCLUDE_mdadm - bool "Include kmod-md-linear" - default n -endef - -define Package/$(PKG_NAME)/postinst -#!/bin/sh -rm -fr /tmp/luci-indexcache /tmp/luci-modulecache -endef - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-diskman/luasrc/controller/diskman.lua b/luci-app-diskman/luasrc/controller/diskman.lua deleted file mode 100755 index 258120430..000000000 --- a/luci-app-diskman/luasrc/controller/diskman.lua +++ /dev/null @@ -1,155 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -require "luci.util" -module("luci.controller.diskman",package.seeall) - -function index() - -- check all used executables in disk management are existed - local CMD = {"parted", "blkid", "smartctl"} - local executables_all_existed = true - for _, cmd in ipairs(CMD) do - local command = luci.sys.exec("/usr/bin/which " .. cmd) - if not command:match(cmd) then - executables_all_existed = false - break - end - end - - if not executables_all_existed then return end - -- entry(path, target, title, order) - -- set leaf attr to true to pass argument throughe url (e.g. admin/system/disk/partition/sda) - entry({"admin", "system", "diskman"}, alias("admin", "system", "diskman", "disks"), _("Disk Man"), 55) - entry({"admin", "system", "diskman", "disks"}, form("diskman/disks"), nil).leaf = true - entry({"admin", "system", "diskman", "partition"}, form("diskman/partition"), nil).leaf = true - entry({"admin", "system", "diskman", "btrfs"}, form("diskman/btrfs"), nil).leaf = true - entry({"admin", "system", "diskman", "format_partition"}, call("format_partition"), nil).leaf = true - entry({"admin", "system", "diskman", "get_disk_info"}, call("get_disk_info"), nil).leaf = true - entry({"admin", "system", "diskman", "mk_p_table"}, call("mk_p_table"), nil).leaf = true - entry({"admin", "system", "diskman", "smartdetail"}, call("smart_detail"), nil).leaf = true - entry({"admin", "system", "diskman", "smartattr"}, call("smart_attr"), nil).leaf = true -end - -function format_partition() - local partation_name = luci.http.formvalue("partation_name") - local fs = luci.http.formvalue("file_system") - if not partation_name then - luci.http.status(500, "Partition NOT found!") - luci.http.write_json("Partition NOT found!") - return - elseif not nixio.fs.access("/dev/"..partation_name) then - luci.http.status(500, "Partition NOT found!") - luci.http.write_json("Partition NOT found!") - return - elseif not fs then - luci.http.status(500, "no file system") - luci.http.write_json("no file system") - return - end - local dm = require "luci.model.diskman" - code, msg = dm.format_partition(partation_name, fs) - luci.http.status(code, msg) - luci.http.write_json(msg) -end - -function get_disk_info(dev) - if not dev then - luci.http.status(500, "no device") - luci.http.write_json("no device") - return - elseif not nixio.fs.access("/dev/"..dev) then - luci.http.status(500, "no device") - luci.http.write_json("no device") - return - end - local dm = require "luci.model.diskman" - local device_info = dm.get_disk_info(dev) - luci.http.status(200, "ok") - luci.http.prepare_content("application/json") - luci.http.write_json(device_info) -end - -function mk_p_table() - local p_table = luci.http.formvalue("p_table") - local dev = luci.http.formvalue("dev") - if not dev then - luci.http.status(500, "no device") - luci.http.write_json("no device") - return - elseif not nixio.fs.access("/dev/"..dev) then - luci.http.status(500, "no device") - luci.http.write_json("no device") - return - end - local dm = require "luci.model.diskman" - if p_table == "GPT" or p_table == "MBR" then - p_table = p_table == "MBR" and "msdos" or "gpt" - local res = luci.sys.call(dm.command.parted .. " -s /dev/" .. dev .. " mktable ".. p_table) - if res == 0 then - luci.http.status(200, "ok") - else - luci.http.status(500, "command exec error") - end - luci.http.prepare_content("application/json") - luci.http.write_json({code=res}) - else - luci.http.status(404, "not support") - luci.http.prepare_content("application/json") - luci.http.write_json({code="1"}) - end -end - -function smart_detail(dev) - luci.template.render("diskman/smart_detail", {dev=dev}) -end - -function smart_attr(dev) - local dm = require "luci.model.diskman" - local cmd = io.popen(dm.command.smartctl .. " -H -A -i /dev/%s" % dev) - if cmd then - local attr = { } - if cmd:match("NVMe Version:")then - while true do - local ln = cmd:read("*l") - if not ln then - break - elseif ln:match("^(.-):%s+(.+)") then - local key, value = ln:match("^(.-):%s+(.+)") - attr[#attr+1]= { - key = key, - value = value - } - end - end - else - while true do - local ln = cmd:read("*l") - if not ln then - break - elseif ln:match("^.*%d+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+") then - local id,attrbute,flag,value,worst,thresh,type,updated,raw = ln:match("^%s*(%d+)%s+([%a%p]+)%s+(%w+)%s+(%d+)%s+(%d+)%s+(%d+)%s+([%a%p]+)%s+(%a+)%s+[%w%p]+%s+(.+)") - id= "%x" % id - if not id:match("^%w%w") then - id = "0%s" % id - end - attr[#attr+1]= { - id = id:upper(), - attrbute = attrbute, - flag = flag, - value = value, - worst = worst, - thresh = thresh, - type = type, - updated = updated, - raw = raw - } - end - end - end - cmd:close() - luci.http.prepare_content("application/json") - luci.http.write_json(attr) - end -end diff --git a/luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua b/luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua deleted file mode 100755 index 006007853..000000000 --- a/luci-app-diskman/luasrc/model/cbi/diskman/btrfs.lua +++ /dev/null @@ -1,210 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -require "luci.util" -require("luci.tools.webadmin") -local dm = require "luci.model.diskman" -local uuid = arg[1] - -if not uuid then luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) end - --- mount subv=/ to tempfs -mount_point = "/tmp/.btrfs_tmp" -nixio.fs.mkdirr(mount_point) -luci.util.exec(dm.command.umount .. " "..mount_point .. " >/dev/null 2>&1") -luci.util.exec(dm.command.mount .. " -t btrfs -o subvol=/ UUID="..uuid.." "..mount_point) - -m = SimpleForm("btrfs", translate("Btrfs"), translate("Manage Btrfs")) -m.template = "diskman/cbi/xsimpleform" -m.redirect = luci.dispatcher.build_url("admin/system/diskman") -m.submit = false -m.reset = false - --- info -local btrfs_info = dm.get_btrfs_info(mount_point) -local table_btrfs_info = m:section(Table, {btrfs_info}, translate("Btrfs Info")) -table_btrfs_info:option(DummyValue, "uuid", translate("UUID")) -table_btrfs_info:option(DummyValue, "members", translate("Members")) -table_btrfs_info:option(DummyValue, "data_raid_level", translate("Data")) -table_btrfs_info:option(DummyValue, "metadata_raid_lavel", translate("Metadata")) -table_btrfs_info:option(DummyValue, "size_formated", translate("Size")) -table_btrfs_info:option(DummyValue, "used_formated", translate("Used")) -table_btrfs_info:option(DummyValue, "free_formated", translate("Free Space")) -table_btrfs_info:option(DummyValue, "usage", translate("Usage")) -local v_btrfs_label = table_btrfs_info:option(Value, "label", translate("Label")) -local value_btrfs_label = "" -v_btrfs_label.write = function(self, section, value) - value_btrfs_label = value or "" -end -local btn_update_label = table_btrfs_info:option(Button, "_update_label") -btn_update_label.inputtitle = translate("Update") -btn_update_label.inputstyle = "edit" -btn_update_label.write = function(self, section, value) - local cmd = dm.command.btrfs .. " filesystem label " .. mount_point .. " " .. value_btrfs_label - local res = luci.util.exec(cmd) - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) -end --- subvolume -local subvolume_list = dm.get_btrfs_subv(mount_point) -subvolume_list["_"] = { ID = 0 } -table_subvolume = m:section(Table, subvolume_list, translate("SubVolumes")) -table_subvolume:option(DummyValue, "id", translate("ID")) -table_subvolume:option(DummyValue, "top_level", translate("Top Level")) -table_subvolume:option(DummyValue, "uuid", translate("UUID")) -table_subvolume:option(DummyValue, "otime", translate("Otime")) -table_subvolume:option(DummyValue, "snapshots", translate("Snapshots")) -local v_path = table_subvolume:option(Value, "path", translate("Path")) -v_path.forcewrite = true -v_path.render = function(self, section, scope) - if subvolume_list[section].ID == 0 then - self.template = "cbi/value" - self.placeholder = "/my_subvolume" - self.forcewrite = true - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end -end -local value_path -v_path.write = function(self, section, value) - value_path = value -end -local btn_set_default = table_subvolume:option(Button, "_subv_set_default", translate("Set Default")) -btn_set_default.forcewrite = true -btn_set_default.inputstyle = "edit" -btn_set_default.template = "diskman/cbi/disabled_button" -btn_set_default.render = function(self, section, scope) - if subvolume_list[section].default_subvolume then - self.view_disabled = true - self.inputtitle = translate("Set Default") - elseif subvolume_list[section].ID == 0 then - self.template = "cbi/dvalue" - else - self.inputtitle = translate("Set Default") - self.view_disabled = false - end - Button.render(self, section, scope) -end -btn_set_default.write = function(self, section, value) - local cmd - if value == translate("Set Default") then - cmd = dm.command.btrfs .. " subvolume set-default " .. mount_point..subvolume_list[section].path - else - cmd = dm.command.btrfs .. " subvolume set-default " .. mount_point.."/" - end - local res = luci.util.exec(cmd.. " 2>&1") - if res and (res:match("ERR") or res:match("not enough arguments")) then - m.errmessage = res - else - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) - end -end -local btn_remove = table_subvolume:option(Button, "_subv_remove") -btn_remove.template = "diskman/cbi/disabled_button" -btn_remove.forcewrite = true -btn_remove.render = function(self, section, scope) - if subvolume_list[section].ID == 0 then - btn_remove.inputtitle = translate("Create") - btn_remove.inputstyle = "add" - self.view_disabled = false - elseif subvolume_list[section].path == "/" or subvolume_list[section].default_subvolume then - btn_remove.inputtitle = translate("Delete") - btn_remove.inputstyle = "remove" - self.view_disabled = true - else - btn_remove.inputtitle = translate("Delete") - btn_remove.inputstyle = "remove" - self.view_disabled = false - end - Button.render(self, section, scope) -end - -btn_remove.write = function(self, section, value) - local cmd - if value == translate("Delete") then - cmd = dm.command.btrfs .. " subvolume delete " .. mount_point .. subvolume_list[section].path - elseif value == translate("Create") then - if value_path and value_path:match("^/") then - cmd = dm.command.btrfs .. " subvolume create " .. mount_point .. value_path - else - m.errmessage = translate("Please input Subvolume Path, Subvolume must start with '/'") - return - end - end - local res = luci.util.exec(cmd.. " 2>&1") - if res and (res:match("ERR") or res:match("not enough arguments")) then - m.errmessage = luci.util.pcdata(res) - else - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) - end -end --- snapshot --- local snapshot_list = dm.get_btrfs_subv(mount_point, 1) --- table_snapshot = m:section(Table, snapshot_list, translate("Snapshots")) --- table_snapshot:option(DummyValue, "id", translate("ID")) --- table_snapshot:option(DummyValue, "top_level", translate("Top Level")) --- table_snapshot:option(DummyValue, "uuid", translate("UUID")) --- table_snapshot:option(DummyValue, "otime", translate("Otime")) --- table_snapshot:option(DummyValue, "path", translate("Path")) --- local snp_remove = table_snapshot:option(Button, "_snp_remove") --- snp_remove.inputtitle = translate("Delete") --- snp_remove.inputstyle = "remove" --- snp_remove.write = function(self, section, value) --- local cmd = dm.command.btrfs .. " subvolume delete " .. mount_point .. snapshot_list[section].path --- local res = luci.util.exec(cmd.. " 2>&1") --- if res and (res:match("ERR") or res:match("not enough arguments")) then --- m.errmessage = luci.util.pcdata(res) --- else --- luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) --- end --- end - --- new snapshots -local s_snapshot = m:section(SimpleSection, translate("New Snapshot")) -local value_sorce, value_dest, value_readonly -local v_sorce = s_snapshot:option(Value, "_source", translate("Source Path"), translate("The source path for create the snapshot")) -v_sorce.placeholder = "/data" -v_sorce.forcewrite = true -v_sorce.write = function(self, section, value) - value_sorce = value -end - -local v_readonly = s_snapshot:option(Flag, "_readonly", translate("Readonly"), translate("The path where you want to store the snapshot")) -v_readonly.forcewrite = true -v_readonly.rmempty = false -v_readonly.disabled = 0 -v_readonly.enabled = 1 -v_readonly.default = 1 -v_readonly.write = function(self, section, value) - value_readonly = value -end -local v_dest = s_snapshot:option(Value, "_dest", translate("Destination Path (optional)")) -v_dest.forcewrite = true -v_dest.placeholder = "/.snapshot/202002051538" -v_dest.write = function(self, section, value) - value_dest = value -end -local btn_snp_create = s_snapshot:option(Button, "_snp_create") -btn_snp_create.title = " " -btn_snp_create.inputtitle = translate("New Snapshot") -btn_snp_create.inputstyle = "add" -btn_snp_create.write = function(self, section, value) - if value_sorce and value_sorce:match("^/") then - if not value_dest then value_dest = "/.snapshot"..value_sorce.."/"..os.date("%Y%m%d%H%M%S") end - nixio.fs.mkdirr(mount_point..value_dest:match("(.-)[^/]+$")) - local cmd = dm.command.btrfs .. " subvolume snapshot" .. (value_readonly == 1 and " -r " or " ") .. mount_point..value_sorce .. " " .. mount_point..value_dest - local res = luci.util.exec(cmd .. " 2>&1") - if res and (res:match("ERR") or res:match("not enough arguments")) then - m.errmessage = luci.util.pcdata(res) - else - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/btrfs/" .. uuid)) - end - else - m.errmessage = translate("Please input Source Path of snapshot, Source Path must start with '/'") - end -end - -return m diff --git a/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua b/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua deleted file mode 100755 index c209df0aa..000000000 --- a/luci-app-diskman/luasrc/model/cbi/diskman/disks.lua +++ /dev/null @@ -1,327 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -require "luci.util" -require("luci.tools.webadmin") -local dm = require "luci.model.diskman" - --- Use (non-UCI) SimpleForm since we have no related config file -m = SimpleForm("diskman", translate("DiskMan"), translate("Manage Disks over LuCI.")) -m.template = "diskman/cbi/xsimpleform" -m:append(Template("diskman/disk_info")) --- disable submit and reset button -m.submit = false -m.reset = false --- rescan disks -rescan = m:section(SimpleSection) -rescan_button = rescan:option(Button, "_rescan") -rescan_button.inputtitle= translate("Rescan Disks") -rescan_button.template = "diskman/cbi/inlinebutton" -rescan_button.inputstyle = "add" -rescan_button.forcewrite = true -rescan_button.write = function(self, section, value) - luci.util.exec("echo '- - -' | tee /sys/class/scsi_host/host*/scan > /dev/null") - if dm.command.mdadm then - luci.util.exec(dm.command.mdadm .. " --assemble --scan") - end - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) -end - --- disks -local disks = dm.list_devices() -d = m:section(Table, disks, translate("Disks")) -d.config = "disk" --- option(type, id(key of table), text) -d:option(DummyValue, "path", translate("Path")) -d:option(DummyValue, "model", translate("Model")) -d:option(DummyValue, "sn", translate("Serial Number")) -d:option(DummyValue, "size_formated", translate("Size")) -d:option(DummyValue, "temp", translate("Temp")) --- d:option(DummyValue, "sec_size", translate("Sector Size ")) -d:option(DummyValue, "p_table", translate("Partition Table")) -d:option(DummyValue, "sata_ver", translate("SATA Version")) --- d:option(DummyValue, "rota_rate", translate("Rotation Rate")) -d:option(DummyValue, "health", translate("Health")) -d:option(DummyValue, "status", translate("Status")) - -d.extedit = luci.dispatcher.build_url("admin/system/diskman/partition/%s") - --- raid devices -if dm.command.mdadm then - local raid_devices = dm.list_raid_devices() - -- raid_devices = diskmanager.getRAIDdevices() - if next(raid_devices) ~= nil then - local r = m:section(Table, raid_devices, translate("RAID Devices")) - r.config = "_raid" - r:option(DummyValue, "path", translate("Path")) - r:option(DummyValue, "level", translate("RAID mode")) - r:option(DummyValue, "size_formated", translate("Size")) - r:option(DummyValue, "p_table", translate("Partition Table")) - r:option(DummyValue, "status", translate("Status")) - r:option(DummyValue, "members_str", translate("Members")) - r:option(DummyValue, "active", translate("Active")) - r.extedit = luci.dispatcher.build_url("admin/system/diskman/partition/%s") - end -end - --- btrfs devices -if dm.command.btrfs then - btrfs_devices = dm.list_btrfs_devices() - if next(btrfs_devices) ~= nil then - local table_btrfs = m:section(Table, btrfs_devices, translate("Btrfs")) - table_btrfs:option(DummyValue, "uuid", translate("UUID")) - table_btrfs:option(DummyValue, "label", translate("Label")) - table_btrfs:option(DummyValue, "members", translate("Members")) - -- sieze is error, since there is RAID - -- table_btrfs:option(DummyValue, "size_formated", translate("Size")) - table_btrfs:option(DummyValue, "used_formated", translate("Usage")) - table_btrfs.extedit = luci.dispatcher.build_url("admin/system/diskman/btrfs/%s") - end -end - --- mount point -local mount_point = dm.get_mount_points() -local _mount_point = {} -table.insert( mount_point, { device = 0 } ) -local table_mp = m:section(Table, mount_point, translate("Mount Point")) -local v_device = table_mp:option(Value, "device", translate("Device")) -v_device.render = function(self, section, scope) - if mount_point[section].device == 0 then - self.template = "cbi/value" - self.forcewrite = true - for dev, info in pairs(disks) do - for i, v in ipairs(info.partitions) do - self:value("/dev/".. v.name, "/dev/".. v.name .. " ".. v.size_formated) - end - end - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end -end -v_device.write = function(self, section, value) - _mount_point.device = value and value:gsub("%s+", "") or "" -end -local v_fs = table_mp:option(Value, "fs", translate("File System")) -v_fs.render = function(self, section, scope) - if mount_point[section].device == 0 then - self.template = "cbi/value" - self:value("auto", "auto") - self.default = "auto" - self.forcewrite = true - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end -end -v_fs.write = function(self, section, value) - _mount_point.fs = value and value:gsub("%s+", "") or "" -end -local v_mount_option = table_mp:option(Value, "mount_options", translate("Mount Options")) -v_mount_option.render = function(self, section, scope) - if mount_point[section].device == 0 then - self.template = "cbi/value" - self.placeholder = "rw,noauto" - self.forcewrite = true - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - local mp = mount_point[section].mount_options - mount_point[section].mount_options = nil - local length = 0 - for k in mp:gmatch("([^,]+)") do - mount_point[section].mount_options = mount_point[section].mount_options and (mount_point[section].mount_options .. ",") or "" - if length > 20 then - mount_point[section].mount_options = mount_point[section].mount_options.. "
" - length = 0 - end - mount_point[section].mount_options = mount_point[section].mount_options .. k - length = length + #k - end - self.rawhtml = true - -- mount_point[section].mount_options = #mount_point[section].mount_options > 50 and mount_point[section].mount_options:sub(1,50) .. "..." or mount_point[section].mount_options - DummyValue.render(self, section, scope) - end -end -v_mount_option.write = function(self, section, value) - _mount_point.mount_options = value and value:gsub("%s+", "") or "" -end -local v_mount_point = table_mp:option(Value, "mount_point", translate("Mount Point")) -v_mount_point.render = function(self, section, scope) - if mount_point[section].device == 0 then - self.template = "cbi/value" - self.placeholder = "/media/diskX" - self.forcewrite = true - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - local new_mp = "" - local v_mp_d - for v_mp_d in self["section"]["data"][section]["mount_point"]:gmatch('[^/]+') do - if #v_mp_d > 12 then - new_mp = new_mp .. "/" .. v_mp_d:sub(1,7) .. ".." .. v_mp_d:sub(-4) - else - new_mp = new_mp .."/".. v_mp_d - end - end - self["section"]["data"][section]["mount_point"] = ''..new_mp..'' - self.rawhtml = true - DummyValue.render(self, section, scope) - end -end -v_mount_point.write = function(self, section, value) - _mount_point.mount_point = value -end -local btn_umount = table_mp:option(Button, "_mount", translate("Mount")) -btn_umount.forcewrite = true -btn_umount.render = function(self, section, scope) - if mount_point[section].device == 0 then - self.inputtitle = translate("Mount") - btn_umount.inputstyle = "add" - else - self.inputtitle = translate("Umount") - btn_umount.inputstyle = "remove" - end - Button.render(self, section, scope) -end -btn_umount.write = function(self, section, value) - local res - if value == translate("Mount") then - if not _mount_point.mount_point or not _mount_point.device then return end - luci.util.exec("mkdir -p ".. _mount_point.mount_point) - res = luci.util.exec(dm.command.mount .. " ".. _mount_point.device .. (_mount_point.fs and (" -t ".. _mount_point.fs )or "") .. (_mount_point.mount_options and (" -o " .. _mount_point.mount_options.. " ") or " ").._mount_point.mount_point .. " 2>&1") - elseif value == translate("Umount") then - res = luci.util.exec(dm.command.umount .. " "..mount_point[section].mount_point .. " 2>&1") - end - if res:match("^mount:") or res:match("^umount:") then - m.errmessage = luci.util.pcdata(res) - else - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) - end -end - -if dm.command.mdadm or dm.command.btrfs then -local creation_section = m:section(TypedSection, "_creation") -creation_section.cfgsections=function() - return {translate("Creation")} -end -creation_section:tab("raid", translate("RAID"), translate("RAID Creation")) -creation_section:tab("btrfs", translate("Btrfs"), translate("Multiple Devices Btrfs Creation")) - --- raid functions -if dm.command.mdadm then - - local rname, rmembers, rlevel - local r_name = creation_section:taboption("raid", Value, "_rname", translate("Raid Name")) - r_name.placeholder = "/dev/md0" - r_name.write = function(self, section, value) - rname = value - end - local r_level = creation_section:taboption("raid", ListValue, "_rlevel", translate("Raid Level")) - local valid_raid = luci.util.exec("lsmod | grep md_mod") - if valid_raid:match("linear") then - r_level:value("linear", "Linear") - end - if valid_raid:match("raid456") then - r_level:value("5", "Raid 5") - r_level:value("6", "Raid 6") - end - if valid_raid:match("raid1") then - r_level:value("1", "Raid 1") - end - if valid_raid:match("raid0") then - r_level:value("0", "Raid 0") - end - if valid_raid:match("raid10") then - r_level:value("10", "Raid 10") - end - r_level.write = function(self, section, value) - rlevel = value - end - local r_member = creation_section:taboption("raid", DynamicList, "_rmember", translate("Raid Member")) - for dev, info in pairs(disks) do - if not info.inuse and #info.partitions == 0 then - r_member:value(info.path, info.path.. " ".. info.size_formated) - end - for i, v in ipairs(info.partitions) do - if not v.inuse then - r_member:value("/dev/".. v.name, "/dev/".. v.name .. " ".. v.size_formated) - end - end - end - r_member.write = function(self, section, value) - rmembers = value - end - local r_create = creation_section:taboption("raid", Button, "_rcreate") - r_create.render = function(self, section, scope) - self.title = " " - self.inputtitle = translate("Create Raid") - self.inputstyle = "add" - Button.render(self, section, scope) - end - r_create.write = function(self, section, value) - -- mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb6 /dev/sdc5 - local res = dm.create_raid(rname, rlevel, rmembers) - if res and res:match("^ERR") then - m.errmessage = luci.util.pcdata(res) - return - end - dm.gen_mdadm_config() - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) - end -end - --- btrfs -if dm.command.btrfs then - local blabel, bmembers, blevel - local btrfs_label = creation_section:taboption("btrfs", Value, "_blabel", translate("Btrfs Label")) - btrfs_label.write = function(self, section, value) - blabel = value - end - local btrfs_level = creation_section:taboption("btrfs", ListValue, "_blevel", translate("Btrfs Raid Level")) - btrfs_level:value("single", "Single") - btrfs_level:value("raid0", "Raid 0") - btrfs_level:value("raid1", "Raid 1") - btrfs_level:value("raid10", "Raid 10") - btrfs_level.write = function(self, section, value) - blevel = value - end - - local btrfs_member = creation_section:taboption("btrfs", DynamicList, "_bmember", translate("Btrfs Member")) - for dev, info in pairs(disks) do - if not info.inuse and #info.partitions == 0 then - btrfs_member:value(info.path, info.path.. " ".. info.size_formated) - end - for i, v in ipairs(info.partitions) do - if not v.inuse then - btrfs_member:value("/dev/".. v.name, "/dev/".. v.name .. " ".. v.size_formated) - end - end - end - btrfs_member.write = function(self, section, value) - bmembers = value - end - local btrfs_create = creation_section:taboption("btrfs", Button, "_bcreate") - btrfs_create.render = function(self, section, scope) - self.title = " " - self.inputtitle = translate("Create Btrfs") - self.inputstyle = "add" - Button.render(self, section, scope) - end - btrfs_create.write = function(self, section, value) - -- mkfs.btrfs -L label -d blevel /dev/sda /dev/sdb - local res = dm.create_btrfs(blabel, blevel, bmembers) - if res and res:match("^ERR") then - m.errmessage = luci.util.pcdata(res) - return - end - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) - end -end -end - -return m diff --git a/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua b/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua deleted file mode 100755 index 1428eb6b2..000000000 --- a/luci-app-diskman/luasrc/model/cbi/diskman/partition.lua +++ /dev/null @@ -1,366 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -require "luci.util" -require("luci.tools.webadmin") -local dm = require "luci.model.diskman" -local dev = arg[1] - -if not dev then - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) -elseif not nixio.fs.access("/dev/"..dev) then - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) -end - -m = SimpleForm("partition", translate("Partition Management"), translate("Partition Disk over LuCI.")) -m.template = "diskman/cbi/xsimpleform" -m.redirect = luci.dispatcher.build_url("admin/system/diskman") -m:append(Template("diskman/partition_info")) --- disable submit and reset button -m.submit = false -m.reset = false - -local disk_info = dm.get_disk_info(dev, true) -local format_cmd = dm.get_format_cmd() - -s = m:section(Table, {disk_info}, translate("Device Info")) --- s:option(DummyValue, "key") --- s:option(DummyValue, "value") -s:option(DummyValue, "path", translate("Path")) -s:option(DummyValue, "model", translate("Model")) -s:option(DummyValue, "sn", translate("Serial Number")) -s:option(DummyValue, "size_formated", translate("Size")) -s:option(DummyValue, "sec_size", translate("Sector Size")) -local dv_p_table = s:option(ListValue, "p_table", translate("Partition Table")) -dv_p_table.render = function(self, section, scope) - -- create table only if not used by raid and no partitions on disk - if not disk_info.p_table:match("Raid") and (#disk_info.partitions == 0 or (#disk_info.partitions == 1 and disk_info.partitions[1].number == -1) or (disk_info.p_table:match("LOOP") and not disk_info.partitions[1].inuse)) then - self:value(disk_info.p_table, disk_info.p_table) - self:value("GPT", "GPT") - self:value("MBR", "MBR") - self.default = disk_info.p_table - ListValue.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end -end -if disk_info.type:match("md") then - s:option(DummyValue, "level", translate("Level")) - s:option(DummyValue, "members_str", translate("Members")) -else - s:option(DummyValue, "temp", translate("Temp")) - s:option(DummyValue, "sata_ver", translate("SATA Version")) - s:option(DummyValue, "rota_rate", translate("Rotation Rate")) -end -s:option(DummyValue, "status", translate("Status")) -local btn_health = s:option(Button, "health", translate("Health")) -btn_health.render = function(self, section, scope) - if disk_info.health then - self.inputtitle = disk_info.health - if disk_info.health == "PASSED" then - self.inputstyle = "add" - else - self.inputstyle = "remove" - end - Button.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end -end - -local btn_eject = s:option(Button, "_eject") -btn_eject.template = "diskman/cbi/disabled_button" -btn_eject.inputstyle = "remove" -btn_eject.render = function(self, section, scope) - for i, p in ipairs(disk_info.partitions) do - if p.mount_point ~= "-" then - self.view_disabled = true - break - end - end - if disk_info.p_table:match("Raid") then - self.view_disabled = true - end - if disk_info.type:match("md") then - btn_eject.inputtitle = translate("Remove") - else - btn_eject.inputtitle = translate("Eject") - end - Button.render(self, section, scope) -end -btn_eject.forcewrite = true -btn_eject.write = function(self, section, value) - for i, p in ipairs(disk_info.partitions) do - if p.mount_point ~= "-" then - m.errmessage = p.name .. translate("is in use! please unmount it first!") - return - end - end - if disk_info.type:match("md") then - luci.util.exec(dm.command.mdadm .. " --stop /dev/" .. dev) - luci.util.exec(dm.command.mdadm .. " --remove /dev/" .. dev) - for _, disk in ipairs(disk_info.members) do - luci.util.exec(dm.command.mdadm .. " --zero-superblock " .. disk) - end - dm.gen_mdadm_config() - else - luci.util.exec("echo 1 > /sys/block/" .. dev .. "/device/delete") - end - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman")) -end --- eject: echo 1 > /sys/block/(device)/device/delete --- rescan: echo '- - -' | tee /sys/class/scsi_host/host*/scan > /dev/null - - --- partitions info -if not disk_info.p_table:match("Raid") then - s_partition_table = m:section(Table, disk_info.partitions, translate("Partitions Info"), translate("Default 2048 sector alignment, support +size{b,k,m,g,t} in End Sector")) - - -- s_partition_table:option(DummyValue, "number", translate("Number")) - s_partition_table:option(DummyValue, "name", translate("Name")) - local val_sec_start = s_partition_table:option(Value, "sec_start", translate("Start Sector")) - val_sec_start.render = function(self, section, scope) - -- could create new partition - if disk_info.partitions[section].number == -1 and disk_info.partitions[section].size > 1 * 1024 * 1024 then - self.template = "cbi/value" - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end - end - local val_sec_end = s_partition_table:option(Value, "sec_end", translate("End Sector")) - val_sec_end.render = function(self, section, scope) - -- could create new partition - if disk_info.partitions[section].number == -1 and disk_info.partitions[section].size > 1 * 1024 * 1024 then - self.template = "cbi/value" - Value.render(self, section, scope) - else - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end - end - val_sec_start.forcewrite = true - val_sec_start.write = function(self, section, value) - disk_info.partitions[section]._sec_start = value - end - val_sec_end.forcewrite = true - val_sec_end.write = function(self, section, value) - disk_info.partitions[section]._sec_end = value - end - s_partition_table:option(DummyValue, "size_formated", translate("Size")) - if disk_info.p_table == "MBR" then - s_partition_table:option(DummyValue, "type", translate("Type")) - end - s_partition_table:option(DummyValue, "used_formated", translate("Used")) - s_partition_table:option(DummyValue, "free_formated", translate("Free Space")) - s_partition_table:option(DummyValue, "usage", translate("Usage")) - local dv_mount_point = s_partition_table:option(DummyValue, "mount_point", translate("Mount Point")) - dv_mount_point.rawhtml = true - dv_mount_point.render = function(self, section, scope) - local new_mp = "" - local v_mp_d - for line in self["section"]["data"][section]["mount_point"]:gmatch("[^%s]+") do - if line == '-' then - new_mp = line - break - end - for v_mp_d in line:gmatch('[^/]+') do - if #v_mp_d > 12 then - new_mp = new_mp .. "/" .. v_mp_d:sub(1,7) .. ".." .. v_mp_d:sub(-4) - else - new_mp = new_mp .."/".. v_mp_d - end - end - new_mp = '' ..new_mp ..'' .. "
" - end - self["section"]["data"][section]["mount_point"] = new_mp - DummyValue.render(self, section, scope) - end - local val_fs = s_partition_table:option(Value, "fs", translate("File System")) - val_fs.forcewrite = true - val_fs.partitions = disk_info.partitions - for k, v in pairs(format_cmd) do - val_fs.format_cmd = val_fs.format_cmd and (val_fs.format_cmd .. "," .. k) or k - end - - val_fs.write = function(self, section, value) - disk_info.partitions[section]._fs = value - end - val_fs.render = function(self, section, scope) - -- use listvalue when partition not mounted - if disk_info.partitions[section].mount_point == "-" and disk_info.partitions[section].number ~= -1 and disk_info.partitions[section].type ~= "extended" then - self.template = "diskman/cbi/format_button" - self.inputstyle = "reset" - self.inputtitle = disk_info.partitions[section].fs == "raw" and translate("Format") or disk_info.partitions[section].fs - Button.render(self, section, scope) - -- self:reset_values() - -- self.keylist = {} - -- self.vallist = {} - -- for k, v in pairs(format_cmd) do - -- self:value(k,k) - -- end - -- self.default = disk_info.partitions[section].fs - else - -- self:reset_values() - -- self.keylist = {} - -- self.vallist = {} - self.template = "cbi/dvalue" - DummyValue.render(self, section, scope) - end - end - -- btn_format = s_partition_table:option(Button, "_format") - -- btn_format.template = "diskman/cbi/format_button" - -- btn_format.partitions = disk_info.partitions - -- btn_format.render = function(self, section, scope) - -- if disk_info.partitions[section].mount_point == "-" and disk_info.partitions[section].number ~= -1 and disk_info.partitions[section].type ~= "extended" then - -- self.inputtitle = translate("Format") - -- self.template = "diskman/cbi/disabled_button" - -- self.view_disabled = false - -- self.inputstyle = "reset" - -- for k, v in pairs(format_cmd) do - -- self:depends("val_fs", "k") - -- end - -- -- elseif disk_info.partitions[section].mount_point ~= "-" and disk_info.partitions[section].number ~= -1 then - -- -- self.inputtitle = "Format" - -- -- self.template = "diskman/cbi/disabled_button" - -- -- self.view_disabled = true - -- -- self.inputstyle = "reset" - -- else - -- self.inputtitle = "" - -- self.template = "cbi/dvalue" - -- end - -- Button.render(self, section, scope) - -- end - -- btn_format.forcewrite = true - -- btn_format.write = function(self, section, value) - -- local partition_name = "/dev/".. disk_info.partitions[section].name - -- if not nixio.fs.access(partition_name) then - -- m.errmessage = translate("Partition NOT found!") - -- return - -- end - -- local fs = disk_info.partitions[section]._fs - -- if not format_cmd[fs] then - -- m.errmessage = translate("Filesystem NOT support!") - -- return - -- end - -- local cmd = format_cmd[fs].cmd .. " " .. format_cmd[fs].option .. " " .. partition_name - -- local res = luci.util.exec(cmd .. " 2>&1") - -- if res and res:lower():match("error+") then - -- m.errmessage = luci.util.pcdata(res) - -- else - -- luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) - -- end - -- end - - local btn_action = s_partition_table:option(Button, "_action") - btn_action.forcewrite = true - btn_action.template = "diskman/cbi/disabled_button" - btn_action.render = function(self, section, scope) - -- if partition is mounted or the size < 1mb, then disable the add action - if disk_info.partitions[section].mount_point ~= "-" or (disk_info.partitions[section].type ~= "extended" and disk_info.partitions[section].number == -1 and disk_info.partitions[section].size <= 1 * 1024 * 1024) then - self.view_disabled = true - -- self.inputtitle = "" - -- self.template = "cbi/dvalue" - elseif disk_info.partitions[section].type == "extended" and next(disk_info.partitions[section]["logicals"]) ~= nil then - self.view_disabled = true - else - -- self.template = "diskman/cbi/disabled_button" - self.view_disabled = false - end - if disk_info.partitions[section].number ~= -1 then - self.inputtitle = translate("Remove") - self.inputstyle = "remove" - else - self.inputtitle = translate("New") - self.inputstyle = "add" - end - Button.render(self, section, scope) - end - btn_action.write = function(self, section, value) - if value == translate("New") then - local start_sec = disk_info.partitions[section]._sec_start and tonumber(disk_info.partitions[section]._sec_start) or tonumber(disk_info.partitions[section].sec_start) - local end_sec = disk_info.partitions[section]._sec_end - - if start_sec then - -- for sector alignment - local align = tonumber(disk_info.phy_sec) / tonumber(disk_info.logic_sec) - align = (align < 2048) and 2048 - if start_sec < 2048 then - start_sec = "2048" .. "s" - elseif math.fmod( start_sec, align ) ~= 0 then - start_sec = tostring(start_sec + align - math.fmod( start_sec, align )) .. "s" - else - start_sec = start_sec .. "s" - end - else - m.errmessage = translate("Invalid Start Sector!") - return - end - -- support +size format for End sector - local end_size, end_unit = end_sec:match("^+(%d-)([bkmgtsBKMGTS])$") - if tonumber(end_size) and end_unit then - local unit ={ - B=1, - S=512, - K=1024, - M=1048576, - G=1073741824, - T=1099511627776 - } - end_unit = end_unit:upper() - end_sec = tostring(tonumber(end_size) * unit[end_unit] / unit["S"] + tonumber(start_sec:sub(1,-2)) - 1 ) .. "s" - elseif tonumber(end_sec) then - end_sec = end_sec .. "s" - else - m.errmessage = translate("Invalid End Sector!") - return - end - local part_type = "primary" - - if disk_info.p_table == "MBR" and disk_info["extended_partition_index"] then - if tonumber(disk_info.partitions[disk_info["extended_partition_index"]].sec_start) <= tonumber(start_sec:sub(1,-2)) and tonumber(disk_info.partitions[disk_info["extended_partition_index"]].sec_end) >= tonumber(end_sec:sub(1,-2)) then - part_type = "logical" - if tonumber(start_sec:sub(1,-2)) - tonumber(disk_info.partitions[section].sec_start) < 2048 then - start_sec = tonumber(start_sec:sub(1,-2)) + 2048 - start_sec = start_sec .."s" - end - end - elseif disk_info.p_table == "GPT" then - -- AUTOMATIC FIX GPT PARTITION TABLE - -- Not all of the space available to /dev/sdb appears to be used, you can fix the GPT to use all of the space (an extra 16123870 blocks) or continue with the current setting? - local cmd = ' printf "ok\nfix\n" | parted ---pretend-input-tty /dev/'.. dev ..' print' - luci.util.exec(cmd .. " 2>&1") - end - - -- partiton - local cmd = dm.command.parted .. " -s -a optimal /dev/" .. dev .. " mkpart " .. part_type .." " .. start_sec .. " " .. end_sec - local res = luci.util.exec(cmd .. " 2>&1") - if res and res:lower():match("error+") then - m.errmessage = luci.util.pcdata(res) - else - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) - end - elseif value == translate("Remove") then - -- remove partition - local number = tostring(disk_info.partitions[section].number) - if (not number) or (number == "") then - m.errmessage = translate("Partition not exists!") - return - end - local cmd = dm.command.parted .. " -s /dev/" .. dev .. " rm " .. number - local res = luci.util.exec(cmd .. " 2>&1") - if res and res:lower():match("error+") then - m.errmessage = luci.util.pcdata(res) - else - luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman/partition/" .. dev)) - end - end - end -end - -return m diff --git a/luci-app-diskman/luasrc/model/diskman.lua b/luci-app-diskman/luasrc/model/diskman.lua deleted file mode 100755 index b29308c31..000000000 --- a/luci-app-diskman/luasrc/model/diskman.lua +++ /dev/null @@ -1,738 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -require "luci.util" -local ver = require "luci.version" - -local CMD = {"parted", "mdadm", "blkid", "smartctl", "df", "btrfs", "lsblk"} - -local d = {command ={}} -for _, cmd in ipairs(CMD) do - local command = luci.sys.exec("/usr/bin/which " .. cmd) - d.command[cmd] = command:match("^.+"..cmd) or nil -end - -d.command.mount = nixio.fs.access("/usr/bin/mount") and "/usr/bin/mount" or "/bin/mount" -d.command.umount = nixio.fs.access("/usr/bin/umount") and "/usr/bin/umount" or "/bin/umount" - -local proc_mounts = nixio.fs.readfile("/proc/mounts") or "" -local mounts = luci.util.exec(d.command.mount .. " 2>/dev/null") or "" -local swaps = nixio.fs.readfile("/proc/swaps") or "" -local df = luci.sys.exec(d.command.df .. " 2>/dev/null") or "" - -function byte_format(byte) - local suff = {"B", "KB", "MB", "GB", "TB"} - for i=1, 5 do - if byte > 1024 and i < 5 then - byte = byte / 1024 - else - return string.format("%.2f %s", byte, suff[i]) - end - end -end - -local get_smart_info = function(device) - local section - local smart_info = {} - for _, line in ipairs(luci.util.execl(d.command.smartctl .. " -H -A -i -n standby -f brief /dev/" .. device)) do - local attrib, val - if section == 1 then - attrib, val = line:match "^(.-):%s+(.+)" - elseif section == 2 and smart_info.nvme_ver then - attrib, val = line:match("^(.-):%s+(.+)") - if not smart_info.health then smart_info.health = line:match(".-overall%-health.-: (.+)") end - elseif section == 2 then - attrib, val = line:match("^([0-9 ]+)%s+[^ ]+%s+[POSRCK-]+%s+[0-9-]+%s+[0-9-]+%s+[0-9-]+%s+[0-9-]+%s+([0-9-]+)") - if not smart_info.health then smart_info.health = line:match(".-overall%-health.-: (.+)") end - else - attrib = line:match "^=== START OF (.*) SECTION ===" - if attrib and attrib:match("INFORMATION") then - section = 1 - elseif attrib and attrib:match("SMART DATA") then - section = 2 - elseif not smart_info.status then - val = line:match "^Device is in (.*) mode" - if val then smart_info.status = val end - end - end - - if not attrib then - if section ~= 2 then section = 0 end - elseif (attrib == "Power mode is") or - (attrib == "Power mode was") then - smart_info.status = val:match("(%S+)") - -- elseif attrib == "Sector Sizes" then - -- -- 512 bytes logical, 4096 bytes physical - -- smart_info.phy_sec = val:match "([0-9]*) bytes physical" - -- smart_info.logic_sec = val:match "([0-9]*) bytes logical" - -- elseif attrib == "Sector Size" then - -- -- 512 bytes logical/physical - -- smart_info.phy_sec = val:match "([0-9]*)" - -- smart_info.logic_sec = smart_info.phy_sec - elseif attrib == "Serial Number" then - smart_info.sn = val - elseif attrib == "194" or attrib == "Temperature" then - smart_info.temp = val:match("(%d+)") .. "°C" - elseif attrib == "Rotation Rate" then - smart_info.rota_rate = val - elseif attrib == "SATA Version is" then - smart_info.sata_ver = val - elseif attrib == "NVMe Version" then - smart_info.nvme_ver = val - end - end - return smart_info -end - -local parse_parted_info = function(keys, line) - -- parse the output of parted command (machine parseable format) - -- /dev/sda:5860533168s:scsi:512:4096:gpt:ATA ST3000DM001-1ER1:; - -- 1:34s:2047s:2014s:free; - -- 1:2048s:1073743872s:1073741825s:ext4:primary:; - local result = {} - local values = {} - - for value in line:gmatch("(.-)[:;]") do table.insert(values, value) end - for i = 1,#keys do - result[keys[i]] = values[i] or "" - end - return result -end - -local is_raid_member = function(partition) - -- check if inuse as raid member - if nixio.fs.access("/proc/mdstat") then - for _, result in ipairs(luci.util.execl("grep md /proc/mdstat | sed 's/[][]//g'")) do - local md, buf - md, buf = result:match("(md.-):(.+)") - if buf:match(partition) then - return "Raid Member: ".. md - end - end - end - return nil -end - -local get_mount_point = function(partition) - local mount_point - for m in mounts:gmatch("/dev/"..partition.." on ([^ ]*)") do - mount_point = (mount_point and (mount_point .. " ") or "") .. m - end - if mount_point then return mount_point end - -- result = luci.sys.exec('cat /proc/mounts | awk \'{if($1=="/dev/'.. partition ..'") print $2}\'') - -- if result ~= "" then return result end - - if swaps:match("\n/dev/" .. partition .."%s") then return "swap" end - -- result = luci.sys.exec("cat /proc/swaps | grep /dev/" .. partition) - -- if result ~= "" then return "swap" end - - return is_raid_member(partition) - -end - --- return used, free, usage -local get_partition_usage = function(partition) - if not nixio.fs.access("/dev/"..partition) then return false end - local used, free, usage = df:match("\n/dev/" .. partition .. "%s+%d+%s+(%d+)%s+(%d+)%s+(%d+)%%%s-") - - usage = usage and (usage .. "%") or "-" - used = used and (tonumber(used) * 1024) or 0 - free = free and (tonumber(free) * 1024) or 0 - - return used, free, usage -end - -local get_parted_info = function(device) - if not device then return end - local result = {partitions={}} - local DEVICE_INFO_KEYS = { "path", "size", "type", "logic_sec", "phy_sec", "p_table", "model", "flags" } - local PARTITION_INFO_KEYS = { "number", "sec_start", "sec_end", "size", "fs", "tag_name", "flags" } - local partition_temp - local partitions_temp = {} - local disk_temp - - for line in luci.util.execi(d.command.parted .. " -s -m /dev/" .. device .. " unit s print free", "r") do - if line:find("^/dev/"..device..":.+") then - disk_temp = parse_parted_info(DEVICE_INFO_KEYS, line) - disk_temp.partitions = {} - if disk_temp["size"] then - local length = disk_temp["size"]:gsub("^(%d+)s$", "%1") - local newsize = tostring(tonumber(length)*tonumber(disk_temp["logic_sec"])) - disk_temp["size"] = newsize - end - if disk_temp["p_table"] == "msdos" then - disk_temp["p_table"] = "MBR" - else - disk_temp["p_table"] = disk_temp["p_table"]:upper() - end - elseif line:find("^%d-:.+") then - partition_temp = parse_parted_info(PARTITION_INFO_KEYS, line) - -- use human-readable form instead of sector number - if partition_temp["size"] then - local length = partition_temp["size"]:gsub("^(%d+)s$", "%1") - local newsize = (tonumber(length) * tonumber(disk_temp["logic_sec"])) - partition_temp["size"] = newsize - partition_temp["size_formated"] = byte_format(newsize) - end - partition_temp["number"] = tonumber(partition_temp["number"]) or -1 - if partition_temp["fs"] == "free" then - partition_temp["number"] = -1 - partition_temp["fs"] = "Free Space" - partition_temp["name"] = "-" - elseif device:match("sd") or device:match("sata") then - partition_temp["name"] = device..partition_temp["number"] - elseif device:match("mmcblk") or device:match("md") or device:match("nvme") then - partition_temp["name"] = device.."p"..partition_temp["number"] - end - if partition_temp["number"] > 0 and partition_temp["fs"] == "" and d.command.lsblk then - partition_temp["fs"] = luci.util.exec(d.command.lsblk .. " /dev/"..device.. tostring(partition_temp["number"]) .. " -no fstype"):match("([^%s]+)") or "" - end - partition_temp["fs"] = partition_temp["fs"] == "" and "raw" or partition_temp["fs"] - partition_temp["sec_start"] = partition_temp["sec_start"] and partition_temp["sec_start"]:sub(1,-2) - partition_temp["sec_end"] = partition_temp["sec_end"] and partition_temp["sec_end"]:sub(1,-2) - partition_temp["mount_point"] = partition_temp["name"]~="-" and get_mount_point(partition_temp["name"]) or "-" - if partition_temp["mount_point"]~="-" then - partition_temp["used"], partition_temp["free"], partition_temp["usage"] = get_partition_usage(partition_temp["name"]) - partition_temp["used_formated"] = partition_temp["used"] and byte_format(partition_temp["used"]) or "-" - partition_temp["free_formated"] = partition_temp["free"] and byte_format(partition_temp["free"]) or "-" - else - partition_temp["used"], partition_temp["free"], partition_temp["usage"] = 0,0,"-" - partition_temp["used_formated"] = "-" - partition_temp["free_formated"] = "-" - end - -- if disk_temp["p_table"] == "MBR" and (partition_temp["number"] < 4) and (partition_temp["number"] > 0) then - -- local real_size_sec = tonumber(nixio.fs.readfile("/sys/block/"..device.."/"..partition_temp["name"].."/size")) * tonumber(disk_temp.phy_sec) - -- if real_size_sec ~= partition_temp["size"] then - -- disk_temp["extended_partition_index"] = partition_temp["number"] - -- partition_temp["type"] = "extended" - -- partition_temp["size"] = real_size_sec - -- partition_temp["fs"] = "-" - -- partition_temp["logicals"] = {} - -- else - -- partition_temp["type"] = "primary" - -- end - -- end - - table.insert(partitions_temp, partition_temp) - end - end - if disk_temp and disk_temp["p_table"] == "MBR" then - for i, p in ipairs(partitions_temp) do - if disk_temp["extended_partition_index"] and p["number"] > 4 then - if tonumber(p["sec_end"]) <= tonumber(partitions_temp[disk_temp["extended_partition_index"]]["sec_end"]) and tonumber(p["sec_start"]) >= tonumber(partitions_temp[disk_temp["extended_partition_index"]]["sec_start"]) then - p["type"] = "logical" - table.insert(partitions_temp[disk_temp["extended_partition_index"]]["logicals"], i) - end - elseif (p["number"] < 4) and (p["number"] > 0) then - local s = nixio.fs.readfile("/sys/block/"..device.."/"..p["name"].."/size") - if s then - local real_size_sec = tonumber(s) * tonumber(disk_temp.phy_sec) - -- if size not equal, it's an extended - if real_size_sec ~= p["size"] then - disk_temp["extended_partition_index"] = i - p["type"] = "extended" - p["size"] = real_size_sec - p["fs"] = "-" - p["logicals"] = {} - else - p["type"] = "primary" - end - else - -- if not found in "/sys/block" - p["type"] = "primary" - end - end - end - end - result = disk_temp - result.partitions = partitions_temp - - return result -end - -local mddetail = function(mdpath) - local detail = {} - local path = mdpath:match("^/dev/md%d+$") - if path then - local mdadm = io.popen(d.command.mdadm .. " --detail "..path, "r") - for line in mdadm:lines() do - local key, value = line:match("^%s*(.+) : (.+)") - if key then - detail[key] = value - end - end - mdadm:close() - end - return detail -end - --- return {{device="", mount_points="", fs="", mount_options="", dump="", pass=""}..} -d.get_mount_points = function() - local mount - local res = {} - local h ={"device", "mount_point", "fs", "mount_options", "dump", "pass"} - for mount in proc_mounts:gmatch("[^\n]+") do - local device = mount:match("^([^%s]+)%s+.+") - -- only show /dev/xxx device - if device and device:match("/dev/") then - res[#res+1] = {} - local i = 0 - for v in mount:gmatch("[^%s]+") do - i = i + 1 - res[#res][h[i]] = v - end - end - end - return res -end - -d.get_disk_info = function(device, wakeup) - --[[ return: - { - path, model, sn, size, size_mounted, flags, type, temp, p_table, logic_sec, phy_sec, sec_size, sata_ver, rota_rate, status, health, - partitions = { - 1 = { number, name, sec_start, sec_end, size, size_mounted, fs, tag_name, type, flags, mount_point, usage, used, free, used_formated, free_formated}, - 2 = { number, name, sec_start, sec_end, size, size_mounted, fs, tag_name, type, flags, mount_point, usage, used, free, used_formated, free_formated}, - ... - } - --raid devices only - level, members, members_str - } - --]] - if not device then return end - local disk_info - local smart_info = get_smart_info(device) - - -- check if divice is the member of raid - smart_info["p_table"] = is_raid_member(device..'0') - -- if status is not active(standby), only check smart_info. - -- if only weakup == true, weakup the disk and check parted_info. - if smart_info.status ~= "STANDBY" or wakeup or (smart_info["p_table"] and not smart_info["p_table"]:match("Raid")) or device:match("^md") then - disk_info = get_parted_info(device) - disk_info["sec_size"] = disk_info["logic_sec"] .. "/" .. disk_info["phy_sec"] - disk_info["size_formated"] = byte_format(tonumber(disk_info["size"])) - -- if status is standby, after get part info, the disk is weakuped, then get smart_info again for more informations - if smart_info.status ~= "ACTIVE" then smart_info = get_smart_info(device) end - else - disk_info = {} - end - - for k, v in pairs(smart_info) do - disk_info[k] = v - end - - if disk_info.type and disk_info.type:match("md") then - local raid_info = d.list_raid_devices()[disk_info["path"]:match("/dev/(.+)")] - for k, v in pairs(raid_info) do - disk_info[k] = v - end - end - return disk_info -end - -d.list_raid_devices = function() - local fs = require "nixio.fs" - - local raid_devices = {} - if not fs.access("/proc/mdstat") then return raid_devices end - local mdstat = io.open("/proc/mdstat", "r") - for line in mdstat:lines() do - - -- md1 : active raid1 sdb2[1] sda2[0] - -- md127 : active raid5 sdh1[6] sdg1[4] sdf1[3] sde1[2] sdd1[1] sdc1[0] - local device_info = {} - local mdpath, list = line:match("^(md%d+) : (.+)") - if mdpath then - local members = {} - for member in string.gmatch(list, "%S+") do - member_path = member:match("^(%S+)%[%d+%]") - if member_path then - member = '/dev/'..member_path - end - table.insert(members, member) - end - local active = table.remove(members, 1) - local level = "-" - if active == "active" then - level = table.remove(members, 1) - end - - local size = tonumber(fs.readfile(string.format("/sys/class/block/%s/size", mdpath))) - local ss = tonumber(fs.readfile(string.format("/sys/class/block/%s/queue/logical_block_size", mdpath))) - - device_info["path"] = "/dev/"..mdpath - device_info["size"] = size*ss - device_info["size_formated"] = byte_format(size*ss) - device_info["active"] = active:upper() - device_info["level"] = level - device_info["members"] = members - device_info["members_str"] = table.concat(members, ", ") - - -- Get more info from output of mdadm --detail - local detail = mddetail(device_info["path"]) - device_info["status"] = detail["State"]:upper() - - raid_devices[mdpath] = device_info - end - end - mdstat:close() - - return raid_devices -end - --- Collect Devices information - --[[ return: - { - sda={ - path, model, inuse, size_formated, - partitions={ - { name, inuse, size_formated } - ... - } - } - .. - } - --]] -d.list_devices = function() - local fs = require "nixio.fs" - - -- get all device names (sdX and mmcblkX) - local target_devnames = {} - for dev in fs.dir("/dev") do - if dev:match("^sd[a-z]$") - or dev:match("^mmcblk%d+$") - or dev:match("^sata[a-z]$") - or dev:match("^nvme%d+n%d+$") - then - table.insert(target_devnames, dev) - end - end - - local devices = {} - for i, bname in pairs(target_devnames) do - local device_info = {} - local device = "/dev/" .. bname - local size = tonumber(fs.readfile(string.format("/sys/class/block/%s/size", bname)) or "0") - local ss = tonumber(fs.readfile(string.format("/sys/class/block/%s/queue/logical_block_size", bname)) or "0") - local model = fs.readfile(string.format("/sys/class/block/%s/device/model", bname)) - local partitions = {} - for part in nixio.fs.glob("/sys/block/" .. bname .."/" .. bname .. "*") do - local pname = nixio.fs.basename(part) - local psize = byte_format(tonumber(nixio.fs.readfile(part .. "/size"))*ss) - local mount_point = get_mount_point(pname) - if mount_point then device_info["inuse"] = true end - table.insert(partitions, {name = pname, size_formated = psize, inuse = mount_point}) - end - - device_info["path"] = device - device_info["size_formated"] = byte_format(size*ss) - device_info["model"] = model - device_info["partitions"] = partitions - -- true or false - device_info["inuse"] = device_info["inuse"] or get_mount_point(bname) - - local udevinfo = {} - if luci.sys.exec("which udevadm") ~= "" then - local udevadm = io.popen("udevadm info --query=property --name="..device) - for attr in udevadm:lines() do - local k, v = attr:match("(%S+)=(%S+)") - udevinfo[k] = v - end - udevadm:close() - - device_info["info"] = udevinfo - if udevinfo["ID_MODEL"] then device_info["model"] = udevinfo["ID_MODEL"] end - end - devices[bname] = device_info - end - -- luci.util.perror(luci.util.serialize_json(devices)) - return devices -end - --- get formart cmd -d.get_format_cmd = function() - local AVAILABLE_FMTS = { - ext2 = { cmd = "mkfs.ext2", option = "-F -E lazy_itable_init=1" }, - ext3 = { cmd = "mkfs.ext3", option = "-F -E lazy_itable_init=1" }, - ext4 = { cmd = "mkfs.ext4", option = "-F -E lazy_itable_init=1" }, - fat32 = { cmd = "mkfs.vfat", option = "-F" }, - exfat = { cmd = "mkexfat", option = "-f" }, - hfsplus = { cmd = "mkhfs", option = "-f" }, - ntfs = { cmd = "mkntfs", option = "-f" }, - swap = { cmd = "mkswap", option = "" }, - btrfs = { cmd = "mkfs.btrfs", option = "-f" } - } - result = {} - for fmt, obj in pairs(AVAILABLE_FMTS) do - local cmd = luci.sys.exec("/usr/bin/which " .. obj["cmd"]) - if cmd:match(obj["cmd"]) then - result[fmt] = { cmd = cmd:match("^.+"..obj["cmd"]) ,option = obj["option"] } - end - end - return result -end - -d.create_raid = function(rname, rlevel, rmembers) - local mb = {} - for _, v in ipairs(rmembers) do - mb[v]=v - end - rmembers = {} - for _, v in pairs(mb) do - table.insert(rmembers, v) - end - if type(rname) == "string" then - if rname:match("^md%d-%s+") then - rname = "/dev/"..rname:match("^(md%d-)%s+") - elseif rname:match("^/dev/md%d-%s+") then - rname = "/dev/"..rname:match("^(/dev/md%d-)%s+") - elseif not rname:match("/") then - rname = "/dev/md/".. rname - else - return "ERR: Invalid raid name" - end - else - local mdnum = 0 - for num=1,127 do - local md = io.open("/dev/md"..tostring(num), "r") - if md == nil then - mdnum = num - break - else - io.close(md) - end - end - if mdnum == 0 then return "ERR: Cannot find proper md number" end - rname = "/dev/md"..mdnum - end - - if rlevel == "5" or rlevel == "6" then - if #rmembers < 3 then return "ERR: Not enough members" end - end - if rlevel == "10" then - if #rmembers < 4 then return "ERR: Not enough members" end - end - if #rmembers < 2 then return "ERR: Not enough members" end - local cmd = d.command.mdadm .. " --create "..rname.." --run --assume-clean --homehost=any --level=" .. rlevel .. " --raid-devices=" .. #rmembers .. " " .. table.concat(rmembers, " ") - local res = luci.util.exec(cmd) - return res -end - -d.gen_mdadm_config = function() - if not nixio.fs.access("/etc/config/mdadm") then return end - local uci = require "luci.model.uci" - local x = uci.cursor() - -- delete all array sections - x:foreach("mdadm", "array", function(s) x:delete("mdadm",s[".name"]) end) - local cmd = d.command.mdadm .. " -D -s" - --ARRAY /dev/md1 metadata=1.2 name=any:1 UUID=f998ae14:37621b27:5c49e850:051f6813 - --ARRAY /dev/md3 metadata=1.2 name=any:3 UUID=c068c141:4b4232ca:f48cbf96:67d42feb - for _, v in ipairs(luci.util.execl(cmd)) do - local device, uuid = v:match("^ARRAY%s-([^%s]+)%s-[^%s]-%s-[^%s]-%s-UUID=([^%s]+)%s-") - if device and uuid then - local section_name = x:add("mdadm", "array") - x:set("mdadm", section_name, "device", device) - x:set("mdadm", section_name, "uuid", uuid) - end - end - x:commit("mdadm") - -- enable mdadm - luci.util.exec("/etc/init.d/mdadm enable") -end - --- list btrfs filesystem device --- {uuid={uuid, label, members, size, used}...} -d.list_btrfs_devices = function() - local btrfs_device = {} - if not d.command.btrfs then return btrfs_device end - local line, _uuid - for _, line in ipairs(luci.util.execl(d.command.btrfs .. " filesystem show -d --raw")) - do - local label, uuid = line:match("^Label:%s+([^%s]+)%s+uuid:%s+([^%s]+)") - if label and uuid then - _uuid = uuid - local _label = label:match("^'([^']+)'") - btrfs_device[_uuid] = {label = _label or label, uuid = uuid} - -- table.insert(btrfs_device, {label = label, uuid = uuid}) - end - local used = line:match("Total devices[%w%s]+used%s+(%d+)$") - if used then - btrfs_device[_uuid]["used"] = tonumber(used) - btrfs_device[_uuid]["used_formated"] = byte_format(tonumber(used)) - end - local size, device = line:match("devid[%w.%s]+size%s+(%d+)[%w.%s]+path%s+([^%s]+)$") - if size and device then - btrfs_device[_uuid]["size"] = btrfs_device[_uuid]["size"] and btrfs_device[_uuid]["size"] + tonumber(size) or tonumber(size) - btrfs_device[_uuid]["size_formated"] = byte_format(btrfs_device[_uuid]["size"]) - btrfs_device[_uuid]["members"] = btrfs_device[_uuid]["members"] and btrfs_device[_uuid]["members"]..", "..device or device - end - end - return btrfs_device -end - -d.create_btrfs = function(blabel, blevel, bmembers) - -- mkfs.btrfs -L label -d blevel /dev/sda /dev/sdb - if not d.command.btrfs or type(bmembers) ~= "table" or next(bmembers) == nil then return "ERR no btrfs support or no members" end - local label = blabel and " -L " .. blabel or "" - local cmd = "mkfs.btrfs -f " .. label .. " -d " .. blevel .. " " .. table.concat(bmembers, " ") - return luci.util.exec(cmd) -end - --- get btrfs info --- {uuid, label, members, data_raid_level,metadata_raid_lavel, size, used, size_formated, used_formated, free, free_formated, usage} -d.get_btrfs_info = function(m_point) - local btrfs_info = {} - if not m_point or not d.command.btrfs then return btrfs_info end - local cmd = d.command.btrfs .. " filesystem show --raw " .. m_point - local _, line, uuid, _label, members - for _, line in ipairs(luci.util.execl(cmd)) do - if not uuid and not _label then - _label, uuid = line:match("^Label:%s+([^%s]+)%s+uuid:%s+([^s]+)") - else - local mb = line:match("%s+devid.+path%s+([^%s]+)") - if mb then - members = members and (members .. ", ".. mb) or mb - end - end - end - - if not _label or not uuid then return btrfs_info end - local label = _label:match("^'([^']+)'") - cmd = d.command.btrfs .. " filesystem usage -b " .. m_point - local used, free, data_raid_level, metadata_raid_lavel - for _, line in ipairs(luci.util.execl(cmd)) do - if not used then - used = line:match("^%s+Used:%s+(%d+)") - elseif not free then - free = line:match("^%s+Free %(estimated%):%s+(%d+)") - elseif not data_raid_level then - data_raid_level = line:match("^Data,%s-(%w+)") - elseif not metadata_raid_lavel then - metadata_raid_lavel = line:match("^Metadata,%s-(%w+)") - end - end - if used and free and data_raid_level and metadata_raid_lavel then - used = tonumber(used) - free = tonumber(free) - btrfs_info = { - uuid = uuid, - label = label, - data_raid_level = data_raid_level, - metadata_raid_lavel = metadata_raid_lavel, - used = used, - free = free, - size = used + free, - size_formated = byte_format(used + free), - used_formated = byte_format(used), - free_formated = byte_format(free), - members = members, - usage = string.format("%.2f",(used / (free+used) * 100)) .. "%" - } - end - return btrfs_info -end - --- get btrfs subvolume --- {id={id, gen, top_level, path, snapshots, otime, default_subvolume}...} -d.get_btrfs_subv = function(m_point, snapshot) -local subvolume = {} -if not m_point or not d.command.btrfs then return subvolume end - --- get default subvolume -local cmd = d.command.btrfs .. " subvolume get-default " .. m_point -local res = luci.util.exec(cmd) -local default_subvolume_id = res:match("^ID%s+([^%s]+)") - --- get the root subvolume -if not snapshot then - local _, line, section_snap, _uuid, _otime, _id, _snap - cmd = d.command.btrfs .. " subvolume show ".. m_point - for _, line in ipairs(luci.util.execl(cmd)) do - if not section_snap then - if not _uuid then - _uuid = line:match("^%s-UUID:%s+([^%s]+)") - elseif not _otime then - _otime = line:match("^%s+Creation time:%s+(.+)") - elseif not _id then - _id = line:match("^%s+Subvolume ID:%s+([^%s]+)") - elseif line:match("^%s+(Snapshot%(s%):)") then - section_snap = true - end - else - local snapshot = line:match("^%s+(.+)") - if snapshot then - _snap = _snap and (_snap ..", /".. snapshot) or ("/"..snapshot) - end - end - end - if _uuid and _otime and _id then - subvolume["0".._id] = {id = _id , uuid = _uuid, otime = _otime, snapshots = _snap, path = "/"} - if default_subvolume_id == _id then - subvolume["0".._id].default_subvolume = 1 - end - end -end - --- get subvolume of btrfs -cmd = d.command.btrfs .. " subvolume list -gcu" .. (snapshot and "s " or " ") .. m_point -for _, line in ipairs(luci.util.execl(cmd)) do - -- ID 259 gen 11 top level 258 uuid 26ae0c59-199a-cc4d-bd58-644eb4f65d33 path 1a/2b' - local id, gen, top_level, uuid, path, otime, otime2 - if snapshot then - id, gen, top_level, otime, otime2, uuid, path = line:match("^ID%s+([^%s]+)%s+gen%s+([^%s]+)%s+cgen.-top level%s+([^%s]+)%s+otime%s+([^%s]+)%s+([^%s]+)%s+uuid%s+([^%s]+)%s+path%s+([^%s]+)%s-$") - else - id, gen, top_level, uuid, path = line:match("^ID%s+([^%s]+)%s+gen%s+([^%s]+)%s+cgen.-top level%s+([^%s]+)%s+uuid%s+([^%s]+)%s+path%s+([^%s]+)%s-$") - end - if id and gen and top_level and uuid and path then - subvolume[id] = {id = id, gen = gen, top_level = top_level, otime = (otime and otime or "") .." ".. (otime2 and otime2 or ""), uuid = uuid, path = '/'.. path} - if not snapshot then - -- use btrfs subv show to get snapshots - local show_cmd = d.command.btrfs .. " subvolume show "..m_point.."/"..path - local __, line_show, section_snap - for __, line_show in ipairs(luci.util.execl(show_cmd)) do - if not section_snap then - local create_time = line_show:match("^%s+Creation time:%s+(.+)") - if create_time then - subvolume[id]["otime"] = create_time - elseif line_show:match("^%s+(Snapshot%(s%):)") then - section_snap = "true" - end - else - local snapshot = line_show:match("^%s+(.+)") - subvolume[id]["snapshots"] = subvolume[id]["snapshots"] and (subvolume[id]["snapshots"] .. ", /".. snapshot) or ("/"..snapshot) - end - end - end - end -end -if subvolume[default_subvolume_id] then - subvolume[default_subvolume_id].default_subvolume = 1 -end --- if m_point == "/tmp/.btrfs_tmp" then --- luci.util.exec("umount " .. m_point) --- end -return subvolume -end - -d.format_partition = function(partition, fs) - local partition_name = "/dev/".. partition - if not nixio.fs.access(partition_name) then - return 500, "Partition NOT found!" - end - - local format_cmd = d.get_format_cmd() - if not format_cmd[fs] then - return 500, "Filesystem NOT support!" - end - local cmd = format_cmd[fs].cmd .. " " .. format_cmd[fs].option .. " " .. partition_name - local res = luci.util.exec(cmd .. " 2>&1") - if res and res:lower():match("error+") then - return 500, res - else - return 200, "OK" - end -end - -return d diff --git a/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm b/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm deleted file mode 100755 index 1ad4eca3b..000000000 --- a/luci-app-diskman/luasrc/view/diskman/cbi/disabled_button.htm +++ /dev/null @@ -1,7 +0,0 @@ -<%+cbi/valueheader%> - <% if self:cfgvalue(section) ~= false then %> - " type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> <% if self.view_disabled then %> disabled <% end %>/> - <% else %> - - - <% end %> -<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-diskman/luasrc/view/diskman/cbi/format_button.htm b/luci-app-diskman/luasrc/view/diskman/cbi/format_button.htm deleted file mode 100755 index 18e306e27..000000000 --- a/luci-app-diskman/luasrc/view/diskman/cbi/format_button.htm +++ /dev/null @@ -1,7 +0,0 @@ -<%+cbi/valueheader%> - <% if self:cfgvalue(section) ~= false then %> - " onclick="event.preventDefault();partition_format('<%=self.partitions[section].name%>', '<%=self.format_cmd%>', '<%=self.inputtitle%>');" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> <% if self.view_disabled then %> disabled <% end %>/> - <% else %> - - - <% end %> -<%+cbi/valuefooter%> diff --git a/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm b/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm deleted file mode 100755 index b1b193257..000000000 --- a/luci-app-diskman/luasrc/view/diskman/cbi/inlinebutton.htm +++ /dev/null @@ -1,7 +0,0 @@ -
- <% if self:cfgvalue(section) ~= false then %> - " type="submit"" <% if self.disable then %>disabled <% end %><%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> - <% else %> - - - <% end %> -
diff --git a/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm b/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm deleted file mode 100755 index 69aa65e00..000000000 --- a/luci-app-diskman/luasrc/view/diskman/cbi/xnullsection.htm +++ /dev/null @@ -1,37 +0,0 @@ -
- <% if self.title and #self.title > 0 then -%> - <%=self.title%> - <%- end %> - <% if self.description and #self.description > 0 then -%> -
<%=self.description%>
- <%- end %> -
-
- <% self:render_children(1, scope or {}) %> -
- <% if self.error and self.error[1] then -%> -
-
    <% for _, e in ipairs(self.error[1]) do -%> -
  • - <%- if e == "invalid" then -%> - <%:One or more fields contain invalid values!%> - <%- elseif e == "missing" then -%> - <%:One or more required fields have no value!%> - <%- else -%> - <%=pcdata(e)%> - <%- end -%> -
  • - <%- end %>
-
- <%- end %> -
-
-<%- - if type(self.hidden) == "table" then - for k, v in pairs(self.hidden) do --%> - -<%- - end - end -%> \ No newline at end of file diff --git a/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm b/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm deleted file mode 100755 index a831bfc77..000000000 --- a/luci-app-diskman/luasrc/view/diskman/cbi/xsimpleform.htm +++ /dev/null @@ -1,88 +0,0 @@ -<% if not self.embedded then %> -
> - - - <% - end - - %>
<% - - if self.title and #self.title > 0 then - %>

<%=self.title%>

<% - end - - if self.description and #self.description > 0 then - %>
<%=self.description%>
<% - end - - self:render_children() - - %>
<% - - if self.message then - %>
<%=self.message%>
<% - end - - if self.errmessage then - %>
<%=self.errmessage%>
<% - end - - if not self.embedded then - if type(self.hidden) == "table" then - local k, v - for k, v in pairs(self.hidden) do - %><% - end - end - - local display_back = (self.redirect) - local display_cancel = (self.cancel ~= false and self.on_cancel) - local display_skip = (self.flow and self.flow.skip) - local display_submit = (self.submit ~= false) - local display_reset = (self.reset ~= false) - - if display_back or display_cancel or display_skip or display_submit or display_reset then - %>
<% - - if display_back then - %> <% - end - - if display_cancel then - local label = pcdata(self.cancel or translate("Cancel")) - %> <% - end - - if display_skip then - %> <% - end - - if display_submit then - local label = pcdata(self.submit or translate("Submit")) - %> <% - end - - if display_reset then - local label = pcdata(self.reset or translate("Reset")) - %> <% - end - - %>
<% - end - - %>
<% - end -%> - - diff --git a/luci-app-diskman/luasrc/view/diskman/disk_info.htm b/luci-app-diskman/luasrc/view/diskman/disk_info.htm deleted file mode 100755 index 118acd50d..000000000 --- a/luci-app-diskman/luasrc/view/diskman/disk_info.htm +++ /dev/null @@ -1,108 +0,0 @@ - diff --git a/luci-app-diskman/luasrc/view/diskman/partition_info.htm b/luci-app-diskman/luasrc/view/diskman/partition_info.htm deleted file mode 100755 index 78f5c1bd7..000000000 --- a/luci-app-diskman/luasrc/view/diskman/partition_info.htm +++ /dev/null @@ -1,129 +0,0 @@ - - \ No newline at end of file diff --git a/luci-app-diskman/luasrc/view/diskman/smart_detail.htm b/luci-app-diskman/luasrc/view/diskman/smart_detail.htm deleted file mode 100755 index 56a9139f0..000000000 --- a/luci-app-diskman/luasrc/view/diskman/smart_detail.htm +++ /dev/null @@ -1,79 +0,0 @@ - - - S.M.A.R.T detail of <%=dev%> - - - - -
-
- <%:S.M.A.R.T Attrbutes%>: /dev/<%=dev%> - - - <% if dev:match("nvme") then %> - - <% else %> - - - - - - - - - - <% end %> - - - - -
<%:ID%><%:Attrbute%><%:Flag%><%:Value%><%:Worst%><%:Thresh%><%:Type%><%:Updated%><%:Raw%>

<%:Collecting data...%>
-
-
- - \ No newline at end of file diff --git a/luci-app-diskman/po/zh-cn/diskman.po b/luci-app-diskman/po/zh-cn/diskman.po deleted file mode 100755 index f380fc586..000000000 --- a/luci-app-diskman/po/zh-cn/diskman.po +++ /dev/null @@ -1,239 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8\n" - -msgid "DiskMan" -msgstr "DiskMan 磁盘管理" - -msgid "Manage Disks over LuCI." -msgstr "通过 LuCI 管理磁盘" - -msgid "Rescan Disks" -msgstr "重新扫描磁盘" - -msgid "Disks" -msgstr "磁盘" - -msgid "Path" -msgstr "路径" - -msgid "Serial Number" -msgstr "序列号" - -msgid "Temp" -msgstr "温度" - -msgid "Partition Table" -msgstr "分区表" - -msgid "SATA Version" -msgstr "SATA 版本" - -msgid "Health" -msgstr "健康" - -msgid "File System" -msgstr "文件系统" - -msgid "Mount Options" -msgstr "挂载选项" - -msgid "Mount" -msgstr "挂载" - -msgid "Umount" -msgstr "卸载" - -msgid "Eject" -msgstr "弹出" - -msgid "New" -msgstr "创建" - -msgid "Remove" -msgstr "移除" - -msgid "Format" -msgstr "格式化" - -msgid "Start Sector" -msgstr "起始扇区" - -msgid "End Sector" -msgstr "中止扇区" - -msgid "Usage" -msgstr "用量" - -msgid "Used" -msgstr "已使用" - -msgid "Free Space" -msgstr "空闲空间" - -msgid "Model" -msgstr "型号" - -msgid "Size" -msgstr "容量" - -msgid "Status" -msgstr "状态" - -msgid "Mount Point" -msgstr "挂载点" - -msgid "Sector Size" -msgstr "扇区/物理扇区大小" - -msgid "Rotation Rate" -msgstr "转速" - -msgid "RAID Devices" -msgstr "RAID 设备" - -msgid "RAID mode" -msgstr "RAID 模式" - -msgid "Members" -msgstr "成员" - -msgid "Active" -msgstr "活动" - -msgid "RAID Creation" -msgstr "RAID 创建" - -msgid "Raid Name" -msgstr "RAID 名称" - -msgid "Raid Level" -msgstr "RAID 级别" - -msgid "Raid Member" -msgstr "磁盘阵列成员" - -msgid "Create Raid" -msgstr "创建 RAID" - -msgid "Partition Management" -msgstr "分区管理" - -msgid "Partition Disk over LuCI." -msgstr "通过LuCI分区磁盘。" - -msgid "Device Info" -msgstr "设备信息" - -msgid "Disk Man" -msgstr "磁盘管理" - -msgid "Partitions Info" -msgstr "分区信息" - -msgid "Default 2048 sector alignment, support +size{b,k,m,g,t} in End Sector" -msgstr "默认2048扇区对齐,【中止扇区】支持 +容量{b,k,m,g,t} 格式,例:+500m +10g +1t" - -msgid "Multiple Devices Btrfs Creation" -msgstr "Btrfs 阵列创建" - -msgid "Label" -msgstr "卷标" - -msgid "Btrfs Label" -msgstr "Btrfs 卷标" - -msgid "Btrfs Raid Level" -msgstr "Btrfs Raid 级别" - -msgid "Btrfs Member" -msgstr "Btrfs 整列成员" - -msgid "Create Btrfs" -msgstr "创建 Btrfs" - -msgid "New Snapshot" -msgstr "新建快照" - -msgid "SubVolumes" -msgstr "子卷" - -msgid "Top Level" -msgstr "父ID" - -msgid "Manage Btrfs" -msgstr "Btrfs 管理" - -msgid "Otime" -msgstr "创建时间" - -msgid "Snapshots" -msgstr "快照" - -msgid "Set Default" -msgstr "默认子卷" - -msgid "Source Path" -msgstr "源目录" - -msgid "Readonly" -msgstr "只读" - -msgid "Delete" -msgstr "删除" - -msgid "Create" -msgstr "创建" - -msgid "Destination Path (optional)" -msgstr "目标目录(可选)" - -msgid "Metadata" -msgstr "元数据" - -msgid "Data" -msgstr "数据" - -msgid "Btrfs Info" -msgstr "Btrfs 信息" - -msgid "The source path for create the snapshot" -msgstr "创建快照的源数据目录" - -msgid "The path where you want to store the snapshot" -msgstr "存放快照数据目录" - -msgid "Please input Source Path of snapshot, Source Path must start with '/'" -msgstr "请输入快照源路径,源路径必须以'/'开头" - -msgid "Please input Subvolume Path, Subvolume must start with '/'" -msgstr "请输入子卷路径,子卷路径必须以'/'开头" - -msgid "is in use! please unmount it first!" -msgstr "正在被使用!请先卸载!" - -msgid "Partition NOT found!" -msgstr "分区未找到!" - -msgid "Filesystem NOT support!" -msgstr "文件系统不支持!" - -msgid "Invalid Start Sector!" -msgstr "无效的起始扇区!" - -msgid "Invalid End Sector" -msgstr "无效的终止扇区!" - -msgid "Partition not exists!" -msgstr "分区不存在!" - -msgid "Creation" -msgstr "创建" - -msgid "Please select file system!" -msgstr "请选择文件系统!" - -msgid "Format partation:" -msgstr "格式化分区:" - -msgid "Warnning !! \nTHIS WILL OVERWRITE EXISTING PARTITIONS!! \nModify the partition table?" -msgstr "警告!!\n此操作会覆盖现有分区\n确定修改分区表?" diff --git a/luci-app-diskman/po/zh_Hans b/luci-app-diskman/po/zh_Hans deleted file mode 100755 index 41451e4a1..000000000 --- a/luci-app-diskman/po/zh_Hans +++ /dev/null @@ -1 +0,0 @@ -zh-cn \ No newline at end of file diff --git a/luci-app-dockerman/Makefile b/luci-app-dockerman/Makefile deleted file mode 100755 index 51dfa5c09..000000000 --- a/luci-app-dockerman/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI Support for docker -LUCI_DEPENDS:=@(aarch64||arm||x86_64) \ - +luci-compat \ - +luci-lib-docker \ - +luci-lib-ip \ - +docker \ - +dockerd \ - +ttyd -LUCI_PKGARCH:=all - -PKG_LICENSE:=AGPL-3.0 -PKG_MAINTAINER:=lisaac \ - Florian Eckert - -PKG_VERSION:=v0.5.25 - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-dockerman/depends.lst b/luci-app-dockerman/depends.lst deleted file mode 100755 index 8a62f6a74..000000000 --- a/luci-app-dockerman/depends.lst +++ /dev/null @@ -1 +0,0 @@ -ttyd docker-cli \ No newline at end of file diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/containers.svg b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/containers.svg deleted file mode 100755 index 4165f90bd..000000000 --- a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/containers.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - Docker icon - - diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-icon.png b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-icon.png deleted file mode 100755 index f156dc1c7ce823b64401a62e249a377a52b20518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD~={fiXV7C&U%V9R;)t0gq*U=0MX+ zN`m}?85o(ESyC4w|-+%u4`_J-}sTczTlbWZCV@SoVw>LwB4?74P_~>1@e8=wH z&fU=qckC8l&g%8~Z~JzK84Nd5-}BA*yTAO~_e*zul#cA)^xP@%bNkV}@@1=Sm_nnE zsJyDOVK&^ans!Nao=4-k^E=Evcdue#I_C3e(OiQAVx|XrN*fszgEv38bVX+ZBLk<7 zgTLLX>}*a2RcCnDxd+V)Vr>uTRp^EDZ{YS5zRLWD zX+K+oZ^7&}j0wVDUNLYaA7pxy&DgP{)_cNgRs|`Y0}Vb07X9Dsw#Gcb+lVpm)>U4M z$qW{)40rHDoarZKhfLm@t>etnLD$M)VPGsasI53}8!m{U0}y(IC{&iZ7U@Z(z4w(uZ zdD~j}0zR}v9-Sy-)WBcf^Xq4217k{qqRfJRo(bPOX3BrNq`T>@q1(e(-elb6Mw<&;$T^(=;mp diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-manager.css b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-manager.css deleted file mode 100755 index 911693b62..000000000 --- a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-manager.css +++ /dev/null @@ -1,91 +0,0 @@ -.fb-container { - margin-top: 1rem; -} -.fb-container .cbi-button { - height: 1.8rem; -} -.fb-container .cbi-input-text { - margin-bottom: 1rem; - width: 100%; -} -.fb-container .panel-title { - padding-bottom: 0; - width: 50%; - border-bottom: none; -} -.fb-container .panel-container { - display: flex; - align-items: center; - justify-content: space-between; - padding-bottom: 1rem; - border-bottom: 1px solid #eee; -} -.fb-container .upload-container { - display: none; - margin: 1rem 0; -} -.fb-container .upload-file { - margin-right: 2rem; -} -.fb-container .cbi-value-field { - text-align: left; -} -.fb-container .parent-icon strong { - margin-left: 1rem; -} -.fb-container td[class$="-icon"] { - cursor: pointer; -} -.fb-container .file-icon, .fb-container .folder-icon, .fb-container .link-icon { - position: relative; -} -.fb-container .file-icon:before, .fb-container .folder-icon:before, .fb-container .link-icon:before { - display: inline-block; - width: 1.5rem; - height: 1.5rem; - content: ''; - background-size: contain; - margin: 0 0.5rem 0 1rem; - vertical-align: middle; -} -.fb-container .file-icon:before { - background-image: url(file-icon.png); -} -.fb-container .folder-icon:before { - background-image: url(folder-icon.png); -} -.fb-container .link-icon:before { - background-image: url(link-icon.png); -} -@media screen and (max-width: 480px) { - .fb-container .upload-file { - width: 14.6rem; - } - .fb-container .cbi-value-owner, - .fb-container .cbi-value-perm { - display: none; - } -} - -.cbi-section-table { - width: 100%; -} - -.cbi-section-table-cell { - text-align: right; -} - -.cbi-button-install { -border-color: #c44; - color: #c44; - margin-left: 3px; -} - -.cbi-value-field { - padding: 10px 0; -} - -.parent-icon { - height: 1.8rem; - padding: 10px 0; -} \ No newline at end of file diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/folder-icon.png b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/folder-icon.png deleted file mode 100755 index 1370df3ad554fcb4d11aa0a72510dd3011cb816b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1292 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD~={fpJ5CPlzj!I|_zS2>kviS_E`% ze@T#EFaskKGYcy_2PYRdFCV{vkf@Z5tfH!#x`w8fw!Wc}v8kDbjjg?lo4bdnkDq@~ zNLWNlrlO|7@I&aaqIS-d-oqce)9C$^A|5)y?Oio-m(|)^6tj@ffbcxT$swdA#S9dDM(%YwA z=;`}t7X5o_cb4ab+U_%F*2&+yf4uTu`aSv6Ja0aq(Nkn#*l^0gUv=J|pA)vGDNXH| z5%v0TKlc`43d@{VRt#TOUdn344I z@hKL)O`5@Fmn5gzE%#Z_?rWK(J~!oMUO$Ulc&~%n!wIve^Uc&^UG?bc&k5U^ru=(j z@`QzLrH*H?*MqJt41c#ox+Tos!|->br&GfhO@k9=UK}j*vdPWQ;8$FBYF>a>4u(+{}*QfsHlKk>Zp>C@i+ z=-vG8o4>hkyxc=p^WV?EPtm_nYx(`x^Fv|LOMcFc{wo~4#ynGFUisp>jo<(Kx0>Jm zv2ORj?3$<7m1}nIe$U6#pOIMcz^`O^KR5$71pQ;2AX!`B8su&V67Y2Ob6Mw<&;$S{ CYKQCq diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/images.svg b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/images.svg deleted file mode 100755 index 90ca5a1c7..000000000 --- a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/images.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/link-icon.png b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/link-icon.png deleted file mode 100755 index 03cc82cdfabae20c1036959e6244ba5039f74697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1622 zcmV-c2C4apP) zTWB0r7{`CvG(@YF+Ik_0m)2IR7C|eeQV{DEMU;wAE9isZi=a^9kCznM9+=gj%O9~|iA?Ch8G|LvKX zvojMgeDf4=0GI-r5w@eiYrtSt1E87hgb!HSz5)jOD;Wlz+y%TJx`-UC0475hkrF!y z|EbQ~jx;J63Y}aZx_|<#Gy(i^GIRk&FaiAWLFfXCUp~Y|grgsLkMIX~ z;?`HLNi`mIEI~P-w`uS~5@_sDlIxvK}}VL6M_I9?R1z#|E36NA7Z}R<1N{Sh4(!8SZE_Zv$+?YKISw53yv=Fgxz?YfS}b~!eD<6M zUIvzgC^i9NnF#<`1RT!sqAzf}3!@y@68?A#fUP-Rup1cgJrW8T0e&Wu8Q@D{=g)An zg;9=J!fyf$;||)obvywqt6(s+5mWe0fM_pZ#`C~v zpbp_T8^|u;oGv&BT8Vzz&#)Uq{8MH4XMJzb1n|o+)rEhkwO#LbAWQZYKCXyKonflm z=l{g{FW-EBi)aFPpjY8%_>{l|C`qrw&+sLI2~dJi;b-`ezyv5r=qGj$KYod<9td;+`)+|mA@Ccs=$3co8R zz=fy^A54ID)P)ZwK!(cj!2|%s;e!dFI(*PAfco%3uK*T)3ylI;_-$wtpvv$^sag1- zOMoFP{5fb5z`~yg4FXvB3y``17Je5}7Qn(6kg5O{zK|3Ju<&z`ngAAlPErye_V5=2 zdw{79+n)kH0xl}~9=SFI|p1p)eSSG!gf{{8p~KT1*%U@6r+$1wTuAq@fk!ri&!6BXe@8Ui$d&A4Cm>;pC7 zLmC1Ai~;vjUIJC&LplOLc?r~o4`~Si#U)S~KBOlAiUmAeTUO_>isu&|L!c z;X~R2!2A+e_$^Ww0M1J=*82N5Sor^=<(EK?0c&wz$9jL}ex1=U17tL@@aLdO0HXsY zfO1R#<(L4P>u0=T5&T2kj}++9rF zkmTW&Ey!+=+&13^jILY^9HaXf|B6f!uUrnC6BKs_+0Bi{T;4$TA=?qEz)yt*{s1fq zRAXJ)jQlqAdji$S!@>faz+UXMP|9P#zsR3K(DUg(qYwDLOM&fe9Jn(`rS)I{compN zKBilPRNBTS@;x?vm_@O**oj05{{=dgd% - - - - - - - - - - - diff --git a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/tar.min.js b/luci-app-dockerman/htdocs/luci-static/resources/dockerman/tar.min.js deleted file mode 100755 index d9c06667f..000000000 --- a/luci-app-dockerman/htdocs/luci-static/resources/dockerman/tar.min.js +++ /dev/null @@ -1,185 +0,0 @@ -// https://github.com/thiscouldbebetter/TarFileExplorer -class TarFileTypeFlag -{constructor(value,name) -{this.value=value;this.id="_"+this.value;this.name=name;} -static _instances;static Instances() -{if(TarFileTypeFlag._instances==null) -{TarFileTypeFlag._instances=new TarFileTypeFlag_Instances();} -return TarFileTypeFlag._instances;}} -class TarFileTypeFlag_Instances -{constructor() -{this.Normal=new TarFileTypeFlag("0","Normal");this.HardLink=new TarFileTypeFlag("1","Hard Link");this.SymbolicLink=new TarFileTypeFlag("2","Symbolic Link");this.CharacterSpecial=new TarFileTypeFlag("3","Character Special");this.BlockSpecial=new TarFileTypeFlag("4","Block Special");this.Directory=new TarFileTypeFlag("5","Directory");this.FIFO=new TarFileTypeFlag("6","FIFO");this.ContiguousFile=new TarFileTypeFlag("7","Contiguous File");this.LongFilePath=new TarFileTypeFlag("L","././@LongLink");this._All=[this.Normal,this.HardLink,this.SymbolicLink,this.CharacterSpecial,this.BlockSpecial,this.Directory,this.FIFO,this.ContiguousFile,this.LongFilePath,];for(var i=0;ia+=String.fromCharCode(b),"");entryNext.header.fileName=entryNext.header.fileName.replace(/\0/g,"");entries.splice(i,1);i--;}}} -downloadAs(fileNameToSaveAs) -{return FileHelper.saveBytesAsFile -(this.toBytes(),fileNameToSaveAs)} -entriesForDirectories() -{return this.entries.filter(x=>x.header.typeFlag.name==TarFileTypeFlag.Instances().Directory);} -toBytes() -{this.toBytes_PrependLongPathEntriesAsNeeded();var fileAsBytes=[];var entriesAsByteArrays=this.entries.map(x=>x.toBytes());this.consolidateLongPathEntries();for(var i=0;imaxLength) -{var entryFileNameAsBytes=entryFileName.split("").map(x=>x.charCodeAt(0));var entryContainingLongPathToPrepend=TarFileEntry.fileNew -(typeFlagLongPath.name,entryFileNameAsBytes);entryContainingLongPathToPrepend.header.typeFlag=typeFlagLongPath;entryContainingLongPathToPrepend.header.timeModifiedInUnixFormat=entryHeader.timeModifiedInUnixFormat;entryContainingLongPathToPrepend.header.checksumCalculate();entryHeader.fileName=entryFileName.substr(0,maxLength)+String.fromCharCode(0);entries.splice(i,0,entryContainingLongPathToPrepend);i++;}}} -toString() -{var newline="\n";var returnValue="[TarFile]"+newline;for(var i=0;i{var fileLoadedAsBinaryString=fileLoadedEvent.target.result;var fileLoadedAsBytes=ByteHelper.stringUTF8ToBytes(fileLoadedAsBinaryString);callback(fileToLoad.name,fileLoadedAsBytes);} -fileReader.readAsBinaryString(fileToLoad);} -static loadFileAsText(fileToLoad,callback) -{var fileReader=new FileReader();fileReader.onload=(fileLoadedEvent)=>{var textFromFileLoaded=fileLoadedEvent.target.result;callback(fileToLoad.name,textFromFileLoaded);};fileReader.readAsText(fileToLoad);} -static saveBytesAsFile(bytesToWrite,fileNameToSaveAs) -{var bytesToWriteAsArrayBuffer=new ArrayBuffer(bytesToWrite.length);var bytesToWriteAsUIntArray=new Uint8Array(bytesToWriteAsArrayBuffer);for(var i=0;i - - - - - diff --git a/luci-app-dockerman/luasrc/controller/dockerman.lua b/luci-app-dockerman/luasrc/controller/dockerman.lua deleted file mode 100755 index 7aeed56e1..000000000 --- a/luci-app-dockerman/luasrc/controller/dockerman.lua +++ /dev/null @@ -1,614 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" --- local uci = (require "luci.model.uci").cursor() - -module("luci.controller.dockerman",package.seeall) - -function index() - entry({"admin", "docker"}, - alias("admin", "docker", "config"), - _("Docker"), - 40).acl_depends = { "luci-app-dockerman" } - - entry({"admin", "docker", "config"},cbi("dockerman/configuration"),_("Configuration"), 8).leaf=true - - -- local uci = (require "luci.model.uci").cursor() - -- if uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - -- local host = uci:get("dockerd", "dockerman", "remote_host") - -- local port = uci:get("dockerd", "dockerman", "remote_port") - -- if not host or not port then - -- return - -- end - -- else - -- local socket = uci:get("dockerd", "dockerman", "socket_path") or "/var/run/docker.sock" - -- if socket and not nixio.fs.access(socket) then - -- return - -- end - -- end - - -- if (require "luci.model.docker").new():_ping().code ~= 200 then - -- return - -- end - - entry({"admin", "docker", "overview"}, form("dockerman/overview"),_("Overview"), 2).leaf=true - entry({"admin", "docker", "containers"}, form("dockerman/containers"), _("Containers"), 3).leaf=true - entry({"admin", "docker", "images"}, form("dockerman/images"), _("Images"), 4).leaf=true - entry({"admin", "docker", "networks"}, form("dockerman/networks"), _("Networks"), 5).leaf=true - entry({"admin", "docker", "volumes"}, form("dockerman/volumes"), _("Volumes"), 6).leaf=true - entry({"admin", "docker", "events"}, call("action_events"), _("Events"), 7) - - entry({"admin", "docker", "newcontainer"}, form("dockerman/newcontainer")).leaf=true - entry({"admin", "docker", "newnetwork"}, form("dockerman/newnetwork")).leaf=true - entry({"admin", "docker", "container"}, form("dockerman/container")).leaf=true - - entry({"admin", "docker", "container_stats"}, call("action_get_container_stats")).leaf=true - entry({"admin", "docker", "containers_stats"}, call("action_get_containers_stats")).leaf=true - entry({"admin", "docker", "get_system_df"}, call("action_get_system_df")).leaf=true - entry({"admin", "docker", "container_get_archive"}, call("download_archive")).leaf=true - entry({"admin", "docker", "container_put_archive"}, call("upload_archive")).leaf=true - entry({"admin", "docker", "container_list_file"}, call("list_file")).leaf=true - entry({"admin", "docker", "container_remove_file"}, call("remove_file")).leaf=true - entry({"admin", "docker", "container_rename_file"}, call("rename_file")).leaf=true - entry({"admin", "docker", "container_export"}, call("export_container")).leaf=true - entry({"admin", "docker", "images_save"}, call("save_images")).leaf=true - entry({"admin", "docker", "images_load"}, call("load_images")).leaf=true - entry({"admin", "docker", "images_import"}, call("import_images")).leaf=true - entry({"admin", "docker", "images_get_tags"}, call("get_image_tags")).leaf=true - entry({"admin", "docker", "images_tag"}, call("tag_image")).leaf=true - entry({"admin", "docker", "images_untag"}, call("untag_image")).leaf=true - entry({"admin", "docker", "confirm"}, call("action_confirm")).leaf=true -end - -function action_get_system_df() - local res = docker.new():df() - luci.http.status(res.code, res.message) - luci.http.prepare_content("application/json") - luci.http.write_json(res.body) -end - -function scandir(id, directory) - local cmd_docker = luci.util.exec("command -v docker"):match("^.+docker") or nil - if not cmd_docker or cmd_docker:match("^%s+$") then - return - end - local i, t, popen = 0, {}, io.popen - local uci = (require "luci.model.uci").cursor() - local remote = uci:get_bool("dockerd", "dockerman", "remote_endpoint") - local socket_path = not remote and uci:get("dockerd", "dockerman", "socket_path") or nil - local host = remote and uci:get("dockerd", "dockerman", "remote_host") or nil - local port = remote and uci:get("dockerd", "dockerman", "remote_port") or nil - if remote and host and port then - hosts = "tcp://" .. host .. ':'.. port - elseif socket_path then - hosts = "unix://" .. socket_path - else - return - end - local pfile = popen(cmd_docker .. ' -H "'.. hosts ..'" exec ' ..id .." ls -lh \""..directory.."\" | egrep -v '^total'") - for fileinfo in pfile:lines() do - i = i + 1 - t[i] = fileinfo - end - pfile:close() - return t -end - -function list_response(id, path, success) - luci.http.prepare_content("application/json") - local result - if success then - local rv = scandir(id, path) - result = { - ec = 0, - data = rv - } - else - result = { - ec = 1 - } - end - luci.http.write_json(result) -end - -function list_file(id) - local path = luci.http.formvalue("path") - list_response(id, path, true) -end - -function rename_file(id) - local filepath = luci.http.formvalue("filepath") - local newpath = luci.http.formvalue("newpath") - local cmd_docker = luci.util.exec("command -v docker"):match("^.+docker") or nil - if not cmd_docker or cmd_docker:match("^%s+$") then - return - end - local uci = (require "luci.model.uci").cursor() - local remote = uci:get_bool("dockerd", "dockerman", "remote_endpoint") - local socket_path = not remote and uci:get("dockerd", "dockerman", "socket_path") or nil - local host = remote and uci:get("dockerd", "dockerman", "remote_host") or nil - local port = remote and uci:get("dockerd", "dockerman", "remote_port") or nil - if remote and host and port then - hosts = "tcp://" .. host .. ':'.. port - elseif socket_path then - hosts = "unix://" .. socket_path - else - return - end - local success = os.execute(cmd_docker .. ' -H "'.. hosts ..'" exec '.. id ..' mv "'..filepath..'" "'..newpath..'"') - list_response(nixio.fs.dirname(filepath), success) -end - -function remove_file(id) - local path = luci.http.formvalue("path") - local isdir = luci.http.formvalue("isdir") - local cmd_docker = luci.util.exec("command -v docker"):match("^.+docker") or nil - if not cmd_docker or cmd_docker:match("^%s+$") then - return - end - local uci = (require "luci.model.uci").cursor() - local remote = uci:get_bool("dockerd", "dockerman", "remote_endpoint") - local socket_path = not remote and uci:get("dockerd", "dockerman", "socket_path") or nil - local host = remote and uci:get("dockerd", "dockerman", "remote_host") or nil - local port = remote and uci:get("dockerd", "dockerman", "remote_port") or nil - if remote and host and port then - hosts = "tcp://" .. host .. ':'.. port - elseif socket_path then - hosts = "unix://" .. socket_path - else - return - end - path = path:gsub("<>", "/") - path = path:gsub(" ", "\ ") - local success - if isdir then - success = os.execute(cmd_docker .. ' -H "'.. hosts ..'" exec '.. id ..' rm -r "'..path..'"') - else - success = os.remove(path) - end - list_response(nixio.fs.dirname(path), success) -end - -function action_events() - local logs = "" - local query ={} - - local dk = docker.new() - query["until"] = os.time() - local events = dk:events({query = query}) - - if events.code == 200 then - for _, v in ipairs(events.body) do - local date = "unknown" - if v and v.time then - date = os.date("%Y-%m-%d %H:%M:%S", v.time) - end - - local name = v.Actor.Attributes.name or "unknown" - local action = v.Action or "unknown" - - if v and v.Type == "container" then - local id = v.Actor.ID or "unknown" - logs = logs .. string.format("[%s] %s %s Container ID: %s Container Name: %s\n", date, v.Type, action, id, name) - elseif v.Type == "network" then - local container = v.Actor.Attributes.container or "unknown" - local network = v.Actor.Attributes.type or "unknown" - logs = logs .. string.format("[%s] %s %s Container ID: %s Network Name: %s Network type: %s\n", date, v.Type, action, container, name, network) - elseif v.Type == "image" then - local id = v.Actor.ID or "unknown" - logs = logs .. string.format("[%s] %s %s Image: %s Image name: %s\n", date, v.Type, action, id, name) - end - end - end - - luci.template.render("dockerman/logs", {self={syslog = logs, title="Events"}}) -end - -local calculate_cpu_percent = function(d) - if type(d) ~= "table" then - return - end - - local cpu_count = tonumber(d["cpu_stats"]["online_cpus"]) - local cpu_percent = 0.0 - local cpu_delta = tonumber(d["cpu_stats"]["cpu_usage"]["total_usage"]) - tonumber(d["precpu_stats"]["cpu_usage"]["total_usage"]) - local system_delta = tonumber(d["cpu_stats"]["system_cpu_usage"]) -- tonumber(d["precpu_stats"]["system_cpu_usage"]) - if system_delta > 0.0 then - cpu_percent = string.format("%.2f", cpu_delta / system_delta * 100.0 * cpu_count) - end - - return cpu_percent -end - -local get_memory = function(d) - if type(d) ~= "table" then - return - end - - -- local limit = string.format("%.2f", tonumber(d["memory_stats"]["limit"]) / 1024 / 1024) - -- local usage = string.format("%.2f", (tonumber(d["memory_stats"]["usage"]) - tonumber(d["memory_stats"]["stats"]["total_cache"])) / 1024 / 1024) - -- return usage .. "MB / " .. limit.. "MB" - - local limit =tonumber(d["memory_stats"]["limit"]) - local usage = tonumber(d["memory_stats"]["usage"]) - -- - tonumber(d["memory_stats"]["stats"]["total_cache"]) - - return usage, limit -end - -local get_rx_tx = function(d) - if type(d) ~="table" then - return - end - - local data = {} - if type(d["networks"]) == "table" then - for e, v in pairs(d["networks"]) do - data[e] = { - bw_tx = tonumber(v.tx_bytes), - bw_rx = tonumber(v.rx_bytes) - } - end - end - - return data -end - -local function get_stat(container_id) - if container_id then - local dk = docker.new() - local response = dk.containers:inspect({id = container_id}) - if response.code == 200 and response.body.State.Running then - response = dk.containers:stats({id = container_id, query = {stream = false, ["one-shot"] = true}}) - if response.code == 200 then - local container_stats = response.body - local cpu_percent = calculate_cpu_percent(container_stats) - local mem_useage, mem_limit = get_memory(container_stats) - local bw_rxtx = get_rx_tx(container_stats) - return response.code, response.body.message, { - cpu_percent = cpu_percent, - memory = { - mem_useage = mem_useage, - mem_limit = mem_limit - }, - bw_rxtx = bw_rxtx - } - else - return response.code, response.body.message - end - else - if response.code == 200 then - return 500, "container "..container_id.." not running" - else - return response.code, response.body.message - end - end - else - return 404, "No container name or id" - end -end -function action_get_container_stats(container_id) - local code, msg, res = get_stat(container_id) - luci.http.status(code, msg) - luci.http.prepare_content("application/json") - luci.http.write_json(res) -end - -function action_get_containers_stats() - local res = luci.http.formvalue(containers) or "" - local stats = {} - res = luci.jsonc.parse(res.containers) - if res and type(res) == "table" then - for i, v in ipairs(res) do - _,_,stats[v] = get_stat(v) - end - end - luci.http.status(200, "OK") - luci.http.prepare_content("application/json") - luci.http.write_json(stats) -end - -function action_confirm() - local data = docker:read_status() - if data then - data = data:gsub("\n","
"):gsub(" "," ") - code = 202 - msg = data - else - code = 200 - msg = "finish" - data = "finish" - end - - luci.http.status(code, msg) - luci.http.prepare_content("application/json") - luci.http.write_json({info = data}) -end - -function export_container(id) - local dk = docker.new() - local first - - local cb = function(res, chunk) - if res.code == 200 then - if not first then - first = true - luci.http.header('Content-Disposition', 'inline; filename="'.. id ..'.tar"') - luci.http.header('Content-Type', 'application\/x-tar') - end - luci.ltn12.pump.all(chunk, luci.http.write) - else - if not first then - first = true - luci.http.prepare_content("text/plain") - end - luci.ltn12.pump.all(chunk, luci.http.write) - end - end - - local res = dk.containers:export({id = id}, cb) -end - -function download_archive() - local id = luci.http.formvalue("id") - local path = luci.http.formvalue("path") - local filename = luci.http.formvalue("filename") or "archive" - local dk = docker.new() - local first - - local cb = function(res, chunk) - if res and res.code and res.code == 200 then - if not first then - first = true - luci.http.header('Content-Disposition', 'inline; filename="'.. filename .. '.tar"') - luci.http.header('Content-Type', 'application\/x-tar') - end - luci.ltn12.pump.all(chunk, luci.http.write) - else - if not first then - first = true - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("text/plain") - end - luci.ltn12.pump.all(chunk, luci.http.write) - end - end - - local res = dk.containers:get_archive({ - id = id, - query = { - path = luci.http.urlencode(path) - } - }, cb) -end - -function upload_archive(container_id) - local path = luci.http.formvalue("upload-path") - local dk = docker.new() - local ltn12 = require "luci.ltn12" - - local rec_send = function(sinkout) - luci.http.setfilehandler(function (meta, chunk, eof) - if chunk then - ltn12.pump.step(ltn12.source.string(chunk), sinkout) - end - end) - end - - local res = dk.containers:put_archive({ - id = container_id, - query = { - path = luci.http.urlencode(path) - }, - body = rec_send - }) - - local msg = res and res.message or res.body and res.body.message or nil - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("application/json") - luci.http.write_json({message = msg or "unknow"}) -end - --- function save_images() --- local names = luci.http.formvalue("names") --- local dk = docker.new() --- local first - --- local cb = function(res, chunk) --- if res.code == 200 then --- if not first then --- first = true --- luci.http.status(res.code, res.message) --- luci.http.header('Content-Disposition', 'inline; filename="'.. "images" ..'.tar"') --- luci.http.header('Content-Type', 'application\/x-tar') --- end --- luci.ltn12.pump.all(chunk, luci.http.write) --- else --- if not first then --- first = true --- luci.http.prepare_content("text/plain") --- end --- luci.ltn12.pump.all(chunk, luci.http.write) --- end --- end - --- docker:write_status("Images: saving" .. " " .. names .. "...") --- local res = dk.images:get({ --- query = { --- names = luci.http.urlencode(names) --- } --- }, cb) --- docker:clear_status() - --- local msg = res and res.body and res.body.message or nil --- luci.http.status(res.code, msg) --- luci.http.prepare_content("application/json") --- luci.http.write_json({message = msg}) --- end - -function load_images() - local archive = luci.http.formvalue("upload-archive") - local dk = docker.new() - local ltn12 = require "luci.ltn12" - - local rec_send = function(sinkout) - luci.http.setfilehandler(function (meta, chunk, eof) - if chunk then - ltn12.pump.step(ltn12.source.string(chunk), sinkout) - end - end) - end - - docker:write_status("Images: loading...") - local res = dk.images:load({body = rec_send}) - local msg = res and res.body and ( res.body.message or res.body.stream or res.body.error ) or nil - if res and res.code == 200 and msg and msg:match("Loaded image ID") then - docker:clear_status() - else - docker:append_status("code:" .. (res and res.code or "500") .." ".. (msg or "unknow")) - end - - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("application/json") - luci.http.write_json({message = msg or "unknow"}) -end - -function import_images() - local src = luci.http.formvalue("src") - local itag = luci.http.formvalue("tag") - local dk = docker.new() - local ltn12 = require "luci.ltn12" - - local rec_send = function(sinkout) - luci.http.setfilehandler(function (meta, chunk, eof) - if chunk then - ltn12.pump.step(ltn12.source.string(chunk), sinkout) - end - end) - end - - docker:write_status("Images: importing".. " ".. itag .."...\n") - local repo = itag and itag:match("^([^:]+)") - local tag = itag and itag:match("^[^:]-:([^:]+)") - local res = dk.images:create({ - query = { - fromSrc = luci.http.urlencode(src or "-"), - repo = repo or nil, - tag = tag or nil - }, - body = not src and rec_send or nil - }, docker.import_image_show_status_cb) - - local msg = res and res.body and ( res.body.message )or nil - if not msg and #res.body == 0 then - msg = res.body.status or res.body.error - elseif not msg and #res.body >= 1 then - msg = res.body[#res.body].status or res.body[#res.body].error - end - - if res.code == 200 and msg and msg:match("sha256:") then - docker:clear_status() - else - docker:append_status("code:" .. (res and res.code or "500") .." ".. (msg or "unknow")) - end - - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("application/json") - luci.http.write_json({message = msg or "unknow"}) -end - -function get_image_tags(image_id) - if not image_id then - luci.http.status(400, "no image id") - luci.http.prepare_content("application/json") - luci.http.write_json({message = "no image id"}) - return - end - - local dk = docker.new() - local res = dk.images:inspect({ - id = image_id - }) - local msg = res and res.body and res.body.message or nil - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("application/json") - - if res.code == 200 then - local tags = res.body.RepoTags - luci.http.write_json({tags = tags}) - else - local msg = res and res.body and res.body.message or nil - luci.http.write_json({message = msg or "unknow"}) - end -end - -function tag_image(image_id) - local src = luci.http.formvalue("tag") - local image_id = image_id or luci.http.formvalue("id") - - if type(src) ~= "string" or not image_id then - luci.http.status(400, "no image id or tag") - luci.http.prepare_content("application/json") - luci.http.write_json({message = "no image id or tag"}) - return - end - - local repo = src:match("^([^:]+)") - local tag = src:match("^[^:]-:([^:]+)") - local dk = docker.new() - local res = dk.images:tag({ - id = image_id, - query={ - repo=repo, - tag=tag - } - }) - local msg = res and res.body and res.body.message or nil - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("application/json") - - if res.code == 201 then - local tags = res.body.RepoTags - luci.http.write_json({tags = tags}) - else - local msg = res and res.body and res.body.message or nil - luci.http.write_json({message = msg or "unknow"}) - end -end - -function untag_image(tag) - local tag = tag or luci.http.formvalue("tag") - - if not tag then - luci.http.status(400, "no tag name") - luci.http.prepare_content("application/json") - luci.http.write_json({message = "no tag name"}) - return - end - - local dk = docker.new() - local res = dk.images:inspect({name = tag}) - - if res.code == 200 then - local tags = res.body.RepoTags - if #tags > 1 then - local r = dk.images:remove({name = tag}) - local msg = r and r.body and r.body.message or nil - luci.http.status(r.code, msg) - luci.http.prepare_content("application/json") - luci.http.write_json({message = msg}) - else - luci.http.status(500, "Cannot remove the last tag") - luci.http.prepare_content("application/json") - luci.http.write_json({message = "Cannot remove the last tag"}) - end - else - local msg = res and res.body and res.body.message or nil - luci.http.status(res and res.code or 500, msg or "unknow") - luci.http.prepare_content("application/json") - luci.http.write_json({message = msg or "unknow"}) - end -end diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua deleted file mode 100755 index f62650fe5..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua +++ /dev/null @@ -1,152 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2021 Florian Eckert -Copyright 2021 lisaac -]]-- - -local uci = (require "luci.model.uci").cursor() - -local m, s, o - -m = Map("dockerd", - translate("Docker - Configuration"), - translate("DockerMan is a simple docker manager client for LuCI")) - -if nixio.fs.access("/usr/bin/dockerd") and not m.uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - s = m:section(NamedSection, "globals", "section", translate("Docker Daemon settings")) - - o = s:option(Flag, "auto_start", translate("Auto start")) - o.rmempty = false - o.write = function(self, section, value) - if value == "1" then - luci.util.exec("/etc/init.d/dockerd enable") - else - luci.util.exec("/etc/init.d/dockerd disable") - end - m.uci:set("dockerd", "globals", "auto_start", value) - end - - o = s:option(Value, "data_root", - translate("Docker Root Dir")) - o.placeholder = "/opt/docker/" - o:depends("remote_endpoint", 0) - - o = s:option(Value, "bip", - translate("Default bridge"), - translate("Configure the default bridge network")) - o.placeholder = "172.17.0.1/16" - o.datatype = "ipaddr" - o:depends("remote_endpoint", 0) - - o = s:option(DynamicList, "registry_mirrors", - translate("Registry Mirrors"), - translate("It replaces the daemon registry mirrors with a new set of registry mirrors")) - o:value("https://hub-mirror.c.163.com", "https://hub-mirror.c.163.com") - o:depends("remote_endpoint", 0) - o.forcewrite = true - - o = s:option(ListValue, "log_level", - translate("Log Level"), - translate('Set the logging level')) - o:value("debug", translate("Debug")) - o:value("", translate("Info")) -- This is the default debug level from the deamon is optin is not set - o:value("warn", translate("Warning")) - o:value("error", translate("Error")) - o:value("fatal", translate("Fatal")) - o.rmempty = true - o:depends("remote_endpoint", 0) - - o = s:option(DynamicList, "hosts", - translate("Client connection"), - translate('Specifies where the Docker daemon will listen for client connections (default: unix:///var/run/docker.sock)')) - o:value("unix:///var/run/docker.sock", "unix:///var/run/docker.sock") - o:value("tcp://0.0.0.0:2375", "tcp://0.0.0.0:2375") - o.rmempty = true - o:depends("remote_endpoint", 0) -end - -s = m:section(NamedSection, "dockerman", "section", translate("DockerMan settings")) -s:tab("ac", translate("Access Control")) -s:tab("dockerman", translate("DockerMan")) - -o = s:taboption("dockerman", Flag, "remote_endpoint", - translate("Remote Endpoint"), - translate("Connect to remote docker endpoint")) -o.rmempty = false -o.validate = function(self, value, sid) - local res = luci.http.formvaluetable("cbid.dockerd") - if res["dockerman.remote_endpoint"] == "1" then - if res["dockerman.remote_port"] and res["dockerman.remote_port"] ~= "" and res["dockerman.remote_host"] and res["dockerman.remote_host"] ~= "" then - return 1 - else - return nil, translate("Please input the PORT or HOST IP of remote docker instance!") - end - else - if not res["dockerman.socket_path"] then - return nil, translate("Please input the SOCKET PATH of docker daemon!") - end - end - return 0 -end - -o = s:taboption("dockerman", Value, "socket_path", - translate("Docker Socket Path")) -o.default = "/var/run/docker.sock" -o.placeholder = "/var/run/docker.sock" -o:depends("remote_endpoint", 0) - -o = s:taboption("dockerman", Value, "remote_host", - translate("Remote Host"), - translate("Host or IP Address for the connection to a remote docker instance")) -o.datatype = "host" -o.placeholder = "10.1.1.2" -o:depends("remote_endpoint", 1) - -o = s:taboption("dockerman", Value, "remote_port", - translate("Remote Port")) -o.placeholder = "2375" -o.datatype = "port" -o:depends("remote_endpoint", 1) - --- o = s:taboption("dockerman", Value, "status_path", translate("Action Status Tempfile Path"), translate("Where you want to save the docker status file")) --- o = s:taboption("dockerman", Flag, "debug", translate("Enable Debug"), translate("For debug, It shows all docker API actions of luci-app-dockerman in Debug Tempfile Path")) --- o.enabled="true" --- o.disabled="false" --- o = s:taboption("dockerman", Value, "debug_path", translate("Debug Tempfile Path"), translate("Where you want to save the debug tempfile")) - -if nixio.fs.access("/usr/bin/dockerd") and not m.uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - o = s:taboption("ac", DynamicList, "ac_allowed_interface", translate("Allowed access interfaces"), translate("Which interface(s) can access containers under the bridge network, fill-in Interface Name")) - local interfaces = luci.sys and luci.sys.net and luci.sys.net.devices() or {} - for i, v in ipairs(interfaces) do - o:value(v, v) - end - o = s:taboption("ac", DynamicList, "ac_allowed_ports", translate("Ports allowed to be accessed"), translate("Which Port(s) can be accessed, it's not restricted by the Allowed Access interfaces configuration. Use this configuration with caution!")) - o.placeholder = "8080/tcp" - local docker = require "luci.model.docker" - local containers, res, lost_state - local dk = docker.new() - if dk:_ping().code ~= 200 then - lost_state = true - else - lost_state = false - res = dk.containers:list() - if res and res.code and res.code < 300 then - containers = res.body - end - end - - -- allowed_container.placeholder = "container name_or_id" - if containers then - for i, v in ipairs(containers) do - if v.State == "running" and v.Ports then - for _, port in ipairs(v.Ports) do - if port.PublicPort and port.IP and not string.find(port.IP,":") then - o:value(port.PublicPort.."/"..port.Type, v.Names[1]:sub(2) .. " | " .. port.PublicPort .. " | " .. port.Type) - end - end - end - end - end -end - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua deleted file mode 100755 index 20220ad8f..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua +++ /dev/null @@ -1,810 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -require "luci.util" - -local docker = require "luci.model.docker" -local dk = docker.new() - -container_id = arg[1] -local action = arg[2] or "info" - -local m, s, o -local images, networks, container_info, res - -if not container_id then - return -end - -res = dk.containers:inspect({id = container_id}) -if res.code < 300 then - container_info = res.body -else - return -end - -local get_ports = function(d) - local data - - if d.HostConfig and d.HostConfig.PortBindings then - for inter, out in pairs(d.HostConfig.PortBindings) do - data = (data and (data .. "
") or "") .. out[1]["HostPort"] .. ":" .. inter - end - end - - return data -end - -local get_env = function(d) - local data - - if d.Config and d.Config.Env then - for _,v in ipairs(d.Config.Env) do - data = (data and (data .. "
") or "") .. v - end - end - - return data -end - -local get_command = function(d) - local data - - if d.Config and d.Config.Cmd then - for _,v in ipairs(d.Config.Cmd) do - data = (data and (data .. " ") or "") .. v - end - end - - return data -end - -local get_mounts = function(d) - local data - - if d.Mounts then - for _,v in ipairs(d.Mounts) do - local v_sorce_d, v_dest_d - local v_sorce = "" - local v_dest = "" - for v_sorce_d in v["Source"]:gmatch('[^/]+') do - if v_sorce_d and #v_sorce_d > 12 then - v_sorce = v_sorce .. "/" .. v_sorce_d:sub(1,12) .. "..." - else - v_sorce = v_sorce .."/".. v_sorce_d - end - end - for v_dest_d in v["Destination"]:gmatch('[^/]+') do - if v_dest_d and #v_dest_d > 12 then - v_dest = v_dest .. "/" .. v_dest_d:sub(1,12) .. "..." - else - v_dest = v_dest .."/".. v_dest_d - end - end - data = (data and (data .. "
") or "") .. v_sorce .. ":" .. v["Destination"] .. (v["Mode"] ~= "" and (":" .. v["Mode"]) or "") - end - end - - return data -end - -local get_device = function(d) - local data - - if d.HostConfig and d.HostConfig.Devices then - for _,v in ipairs(d.HostConfig.Devices) do - data = (data and (data .. "
") or "") .. v["PathOnHost"] .. ":" .. v["PathInContainer"] .. (v["CgroupPermissions"] ~= "" and (":" .. v["CgroupPermissions"]) or "") - end - end - - return data -end - -local get_links = function(d) - local data - - if d.HostConfig and d.HostConfig.Links then - for _,v in ipairs(d.HostConfig.Links) do - data = (data and (data .. "
") or "") .. v - end - end - - return data -end - -local get_tmpfs = function(d) - local data - - if d.HostConfig and d.HostConfig.Tmpfs then - for k, v in pairs(d.HostConfig.Tmpfs) do - data = (data and (data .. "
") or "") .. k .. (v~="" and ":" or "")..v - end - end - - return data -end - -local get_dns = function(d) - local data - - if d.HostConfig and d.HostConfig.Dns then - for _, v in ipairs(d.HostConfig.Dns) do - data = (data and (data .. "
") or "") .. v - end - end - - return data -end - -local get_sysctl = function(d) - local data - - if d.HostConfig and d.HostConfig.Sysctls then - for k, v in pairs(d.HostConfig.Sysctls) do - data = (data and (data .. "
") or "") .. k..":"..v - end - end - - return data -end - -local get_networks = function(d) - local data={} - - if d.NetworkSettings and d.NetworkSettings.Networks and type(d.NetworkSettings.Networks) == "table" then - for k,v in pairs(d.NetworkSettings.Networks) do - data[k] = v.IPAddress or "" - end - end - - return data -end - - -local start_stop_remove = function(m, cmd) - local res - - docker:clear_status() - docker:append_status("Containers: " .. cmd .. " " .. container_id .. "...") - - if cmd ~= "upgrade" then - res = dk.containers[cmd](dk, {id = container_id}) - else - res = dk.containers_upgrade(dk, {id = container_id}) - end - - if res and res.code >= 300 then - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) - luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id)) - else - docker:clear_status() - if cmd ~= "remove" and cmd ~= "upgrade" then - luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id)) - else - luci.http.redirect(luci.dispatcher.build_url("admin/docker/containers")) - end - end -end - -m=SimpleForm("docker", - translatef("Docker - Container (%s)", container_info.Name:sub(2)), - translate("On this page, the selected container can be managed.")) -m.redirect = luci.dispatcher.build_url("admin/docker/containers") - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err=docker:read_status() -s.err=s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(Table,{{}}) -s.notitle=true -s.rowcolors=false -s.template = "cbi/nullsection" - -o = s:option(Button, "_start") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Start") -o.inputstyle = "apply" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"start") -end - -o = s:option(Button, "_restart") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Restart") -o.inputstyle = "reload" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"restart") -end - -o = s:option(Button, "_stop") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Stop") -o.inputstyle = "reset" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"stop") -end - -o = s:option(Button, "_kill") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Kill") -o.inputstyle = "reset" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"kill") -end - -o = s:option(Button, "_export") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Export") -o.inputstyle = "apply" -o.forcewrite = true -o.write = function(self, section) - luci.http.redirect(luci.dispatcher.build_url("admin/docker/container_export/"..container_id)) -end - -o = s:option(Button, "_upgrade") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Upgrade") -o.inputstyle = "reload" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"upgrade") -end - -o = s:option(Button, "_duplicate") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Duplicate/Edit") -o.inputstyle = "add" -o.forcewrite = true -o.write = function(self, section) - luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer/duplicate/"..container_id)) -end - -o = s:option(Button, "_remove") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle=translate("Remove") -o.inputstyle = "remove" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"remove") -end - -s = m:section(SimpleSection) -s.template = "dockerman/container" - -if action == "info" then - res = dk.networks:list() - if res.code < 300 then - networks = res.body - else - return - end - m.submit = false - m.reset = false - table_info = { - ["01name"] = { - _key = translate("Name"), - _value = container_info.Name:sub(2) or "-", - _button=translate("Update") - }, - ["02id"] = { - _key = translate("ID"), - _value = container_info.Id or "-" - }, - ["03image"] = { - _key = translate("Image"), - _value = container_info.Config.Image .. "
" .. container_info.Image - }, - ["04status"] = { - _key = translate("Status"), - _value = container_info.State and container_info.State.Status or "-" - }, - ["05created"] = { - _key = translate("Created"), - _value = container_info.Created or "-" - }, - } - - if container_info.State.Status == "running" then - table_info["06start"] = { - _key = translate("Start Time"), - _value = container_info.State and container_info.State.StartedAt or "-" - } - else - table_info["06start"] = { - _key = translate("Finish Time"), - _value = container_info.State and container_info.State.FinishedAt or "-" - } - end - - table_info["07healthy"] = { - _key = translate("Healthy"), - _value = container_info.State and container_info.State.Health and container_info.State.Health.Status or "-" - } - table_info["08restart"] = { - _key = translate("Restart Policy"), - _value = container_info.HostConfig and container_info.HostConfig.RestartPolicy and container_info.HostConfig.RestartPolicy.Name or "-", - _button=translate("Update") - } - table_info["081user"] = { - _key = translate("User"), - _value = container_info.Config and (container_info.Config.User ~="" and container_info.Config.User or "-") or "-" - } - table_info["09mount"] = { - _key = translate("Mount/Volume"), - _value = get_mounts(container_info) or "-" - } - table_info["10cmd"] = { - _key = translate("Command"), - _value = get_command(container_info) or "-" - } - table_info["11env"] = { - _key = translate("Env"), - _value = get_env(container_info) or "-" - } - table_info["12ports"] = { - _key = translate("Ports"), - _value = get_ports(container_info) or "-" - } - table_info["13links"] = { - _key = translate("Links"), - _value = get_links(container_info) or "-" - } - table_info["14device"] = { - _key = translate("Device"), - _value = get_device(container_info) or "-" - } - table_info["15tmpfs"] = { - _key = translate("Tmpfs"), - _value = get_tmpfs(container_info) or "-" - } - table_info["16dns"] = { - _key = translate("DNS"), - _value = get_dns(container_info) or "-" - } - table_info["17sysctl"] = { - _key = translate("Sysctl"), - _value = get_sysctl(container_info) or "-" - } - - info_networks = get_networks(container_info) - list_networks = {} - for _, v in ipairs (networks) do - if v and v.Name then - local parent = v.Options and v.Options.parent or nil - local ip = v.IPAM and v.IPAM.Config and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil - ipv6 = v.IPAM and v.IPAM.Config and v.IPAM.Config[2] and v.IPAM.Config[2].Subnet or nil - local network_name = v.Name .. " | " .. v.Driver .. (parent and (" | " .. parent) or "") .. (ip and (" | " .. ip) or "").. (ipv6 and (" | " .. ipv6) or "") - list_networks[v.Name] = network_name - end - end - - if type(info_networks)== "table" then - for k,v in pairs(info_networks) do - table_info["14network"..k] = { - _key = translate("Network"), - _value = k.. (v~="" and (" | ".. v) or ""), - _button=translate("Disconnect") - } - list_networks[k]=nil - end - end - - table_info["15connect"] = { - _key = translate("Connect Network"), - _value = list_networks ,_opts = "", - _button=translate("Connect") - } - - s = m:section(Table,table_info) - s.nodescr=true - s.formvalue=function(self, section) - return table_info - end - - o = s:option(DummyValue, "_key", translate("Info")) - o.width = "20%" - - o = s:option(ListValue, "_value") - o.render = function(self, section, scope) - if table_info[section]._key == translate("Name") then - self:reset_values() - self.template = "cbi/value" - self.size = 30 - self.keylist = {} - self.vallist = {} - self.default=table_info[section]._value - Value.render(self, section, scope) - elseif table_info[section]._key == translate("Restart Policy") then - self.template = "cbi/lvalue" - self:reset_values() - self.size = nil - self:value("no", "No") - self:value("unless-stopped", "Unless stopped") - self:value("always", "Always") - self:value("on-failure", "On failure") - self.default=table_info[section]._value - ListValue.render(self, section, scope) - elseif table_info[section]._key == translate("Connect Network") then - self.template = "cbi/lvalue" - self:reset_values() - self.size = nil - for k,v in pairs(list_networks) do - if k ~= "host" then - self:value(k,v) - end - end - self.default=table_info[section]._value - ListValue.render(self, section, scope) - else - self:reset_values() - self.rawhtml=true - self.template = "cbi/dvalue" - self.default=table_info[section]._value - DummyValue.render(self, section, scope) - end - end - o.forcewrite = true - o.write = function(self, section, value) - table_info[section]._value=value - end - o.validate = function(self, value) - return value - end - - o = s:option(Value, "_opts") - o.forcewrite = true - o.write = function(self, section, value) - table_info[section]._opts=value - end - o.validate = function(self, value) - return value - end - o.render = function(self, section, scope) - if table_info[section]._key==translate("Connect Network") then - self.template = "cbi/value" - self.keylist = {} - self.vallist = {} - self.placeholder = "10.1.1.254" - self.datatype = "ip4addr" - self.default=table_info[section]._opts - Value.render(self, section, scope) - else - self.rawhtml=true - self.template = "cbi/dvalue" - self.default=table_info[section]._opts - DummyValue.render(self, section, scope) - end - end - - o = s:option(Button, "_button") - o.forcewrite = true - o.render = function(self, section, scope) - if table_info[section]._button and table_info[section]._value ~= nil then - self.inputtitle=table_info[section]._button - self.template = "cbi/button" - self.inputstyle = "edit" - Button.render(self, section, scope) - else - self.template = "cbi/dvalue" - self.default="" - DummyValue.render(self, section, scope) - end - end - o.write = function(self, section, value) - local res - - docker:clear_status() - - if section == "01name" then - docker:append_status("Containers: rename " .. container_id .. "...") - local new_name = table_info[section]._value - res = dk.containers:rename({ - id = container_id, - query = { - name=new_name - } - }) - elseif section == "08restart" then - docker:append_status("Containers: update " .. container_id .. "...") - local new_restart = table_info[section]._value - res = dk.containers:update({ - id = container_id, - body = { - RestartPolicy = { - Name = new_restart - } - } - }) - elseif table_info[section]._key == translate("Network") then - local _,_,leave_network - - _, _, leave_network = table_info[section]._value:find("(.-) | .+") - leave_network = leave_network or table_info[section]._value - docker:append_status("Network: disconnect " .. leave_network .. container_id .. "...") - res = dk.networks:disconnect({ - name = leave_network, - body = { - Container = container_id - } - }) - elseif section == "15connect" then - local connect_network = table_info[section]._value - local network_opiton - if connect_network ~= "none" - and connect_network ~= "bridge" - and connect_network ~= "host" then - - network_opiton = table_info[section]._opts ~= "" and { - IPAMConfig={ - IPv4Address=table_info[section]._opts - } - } or nil - end - docker:append_status("Network: connect " .. connect_network .. container_id .. "...") - res = dk.networks:connect({ - name = connect_network, - body = { - Container = container_id, - EndpointConfig= network_opiton - } - }) - end - - if res and res.code > 300 then - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) - else - docker:clear_status() - end - luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id.."/info")) - end -elseif action == "resources" then - s = m:section(SimpleSection) - o = s:option( Value, "cpus", - translate("CPUs"), - translate("Number of CPUs. Number is a fractional number. 0.000 means no limit.")) - o.placeholder = "1.5" - o.rmempty = true - o.datatype="ufloat" - o.default = container_info.HostConfig.NanoCpus / (10^9) - - o = s:option(Value, "cpushares", - translate("CPU Shares Weight"), - translate("CPU shares relative weight, if 0 is set, the system will ignore the value and use the default of 1024.")) - o.placeholder = "1024" - o.rmempty = true - o.datatype="uinteger" - o.default = container_info.HostConfig.CpuShares - - o = s:option(Value, "memory", - translate("Memory"), - translate("Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M.")) - o.placeholder = "128m" - o.rmempty = true - o.default = container_info.HostConfig.Memory ~=0 and ((container_info.HostConfig.Memory / 1024 /1024) .. "M") or 0 - - o = s:option(Value, "blkioweight", - translate("Block IO Weight"), - translate("Block IO weight (relative weight) accepts a weight value between 10 and 1000.")) - o.placeholder = "500" - o.rmempty = true - o.datatype="uinteger" - o.default = container_info.HostConfig.BlkioWeight - - m.handle = function(self, state, data) - if state == FORM_VALID then - local memory = data.memory - if memory and memory ~= 0 then - _,_,n,unit = memory:find("([%d%.]+)([%l%u]+)") - if n then - unit = unit and unit:sub(1,1):upper() or "B" - if unit == "M" then - memory = tonumber(n) * 1024 * 1024 - elseif unit == "G" then - memory = tonumber(n) * 1024 * 1024 * 1024 - elseif unit == "K" then - memory = tonumber(n) * 1024 - else - memory = tonumber(n) - end - end - end - - request_body = { - BlkioWeight = tonumber(data.blkioweight), - NanoCPUs = tonumber(data.cpus)*10^9, - Memory = tonumber(memory), - CpuShares = tonumber(data.cpushares) - } - - docker:write_status("Containers: update " .. container_id .. "...") - local res = dk.containers:update({id = container_id, body = request_body}) - if res and res.code >= 300 then - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) - else - docker:clear_status() - end - luci.http.redirect(luci.dispatcher.build_url("admin/docker/container/"..container_id.."/resources")) - end - end - -elseif action == "file" then - m.submit = false - m.reset = false - s= m:section(SimpleSection) - s.template = "dockerman/container_file_manager" - s.container = container_id - m.redirect = nil -elseif action == "inspect" then - s = m:section(SimpleSection) - s.syslog = luci.jsonc.stringify(container_info, true) - s.title = translate("Container Inspect") - s.template = "dockerman/logs" - m.submit = false - m.reset = false -elseif action == "logs" then - local logs = "" - local query ={ - stdout = 1, - stderr = 1, - tail = 1000 - } - - s = m:section(SimpleSection) - - logs = dk.containers:logs({id = container_id, query = query}) - if logs.code == 200 then - s.syslog=logs.body - else - s.syslog="Get Logs ERROR\n"..logs.code..": "..logs.body - end - - s.title=translate("Container Logs") - s.template = "dockerman/logs" - m.submit = false - m.reset = false -elseif action == "console" then - m.submit = false - m.reset = false - local cmd_docker = luci.util.exec("command -v docker"):match("^.+docker") or nil - local cmd_ttyd = luci.util.exec("command -v ttyd"):match("^.+ttyd") or nil - - if cmd_docker and cmd_ttyd and container_info.State.Status == "running" then - local cmd = "/bin/sh" - local uid - - s = m:section(SimpleSection) - - o = s:option(Value, "command", translate("Command")) - o:value("/bin/sh", "/bin/sh") - o:value("/bin/ash", "/bin/ash") - o:value("/bin/bash", "/bin/bash") - o.default = "/bin/sh" - o.forcewrite = true - o.write = function(self, section, value) - cmd = value - end - - o = s:option(Value, "uid", translate("UID")) - o.forcewrite = true - o.write = function(self, section, value) - uid = value - end - - o = s:option(Button, "connect") - o.render = function(self, section, scope) - self.inputstyle = "add" - self.title = " " - self.inputtitle = translate("Connect") - Button.render(self, section, scope) - end - o.write = function(self, section) - local cmd_docker = luci.util.exec("command -v docker"):match("^.+docker") or nil - local cmd_ttyd = luci.util.exec("command -v ttyd"):match("^.+ttyd") or nil - - if not cmd_docker or not cmd_ttyd or cmd_docker:match("^%s+$") or cmd_ttyd:match("^%s+$") then - return - end - local uci = (require "luci.model.uci").cursor() - - local ttyd_ssl = uci:get("ttyd", "@ttyd[0]", "ssl") - local ttyd_ssl_key = uci:get("ttyd", "@ttyd[0]", "ssl_key") - local ttyd_ssl_cert = uci:get("ttyd", "@ttyd[0]", "ssl_cert") - - if ttyd_ssl == "1" and ttyd_ssl_cert and ttyd_ssl_key then - cmd_ttyd = string.format('%s -S -C %s -K %s', cmd_ttyd, ttyd_ssl_cert, ttyd_ssl_key) - end - - local pid = luci.util.trim(luci.util.exec("netstat -lnpt | grep :7682 | grep ttyd | tr -s ' ' | cut -d ' ' -f7 | cut -d'/' -f1")) - if pid and pid ~= "" then - luci.util.exec("kill -9 " .. pid) - end - - local hosts - local remote = uci:get_bool("dockerd", "dockerman", "remote_endpoint") or false - local host = nil - local port = nil - local socket = nil - - if remote then - host = uci:get("dockerd", "dockerman", "remote_host") or nil - port = uci:get("dockerd", "dockerman", "remote_port") or nil - else - socket = uci:get("dockerd", "dockerman", "socket_path") or "/var/run/docker.sock" - end - - if remote and host and port then - hosts = "tcp://" .. host .. ':'.. port - elseif socket then - hosts = "unix://" .. socket - else - return - end - - if uid and uid ~= "" then - uid = "-u " .. uid - else - uid = "" - end - - local start_cmd = string.format('%s -d 2 --once -p 7682 %s -H "%s" exec -it %s %s %s&', cmd_ttyd, cmd_docker, hosts, uid, container_id, cmd) - - os.execute(start_cmd) - - o = s:option(DummyValue, "console") - o.container_id = container_id - o.template = "dockerman/container_console" - end - end -elseif action == "stats" then - local response = dk.containers:top({id = container_id, query = {ps_args="-aux"}}) - local container_top - - if response.code == 200 then - container_top=response.body - else - response = dk.containers:top({id = container_id}) - if response.code == 200 then - container_top=response.body - end - end - - if type(container_top) == "table" then - s = m:section(SimpleSection) - s.container_id = container_id - s.template = "dockerman/container_stats" - table_stats = { - cpu={ - key=translate("CPU Useage"), - value='-' - }, - memory={ - key=translate("Memory Useage"), - value='-' - } - } - - container_top = response.body - s = m:section(Table, table_stats, translate("Stats")) - s:option(DummyValue, "key", translate("Stats")).width="33%" - s:option(DummyValue, "value") - top_section = m:section(Table, container_top.Processes, translate("TOP")) - for i, v in ipairs(container_top.Titles) do - top_section:option(DummyValue, i, translate(v)) - end - end - - m.submit = false - m.reset = false -end - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua deleted file mode 100755 index 47f634f8b..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua +++ /dev/null @@ -1,284 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local http = require "luci.http" -local docker = require "luci.model.docker" - -local m, s, o -local images, networks, containers, res, lost_state -local urlencode = luci.http.protocol and luci.http.protocol.urlencode or luci.util.urlencode -local dk = docker.new() - -if dk:_ping().code ~= 200 then - lost_state = true -else - res = dk.images:list() - if res and res.code and res.code < 300 then - images = res.body - end - - res = dk.networks:list() - if res and res.code and res.code < 300 then - networks = res.body - end - - res = dk.containers:list({ - query = { - all = true - } - }) - if res and res.code and res.code < 300 then - containers = res.body - end -end - -function get_containers() - local data = {} - if type(containers) ~= "table" then - return nil - end - - for i, v in ipairs(containers) do - local index = (10^12 - v.Created) .. "_id_" .. v.Id - - data[index]={} - data[index]["_selected"] = 0 - data[index]["_id"] = v.Id:sub(1,12) - -- data[index]["name"] = v.Names[1]:sub(2) - data[index]["_status"] = v.Status - - if v.Status:find("^Up") then - data[index]["_name"] = ""..v.Names[1]:sub(2).."" - data[index]["_status"] = "".. data[index]["_status"] .. "" .. "


" - else - data[index]["_name"] = ""..v.Names[1]:sub(2).."" - data[index]["_status"] = ''.. data[index]["_status"] .. "" - end - - if (type(v.NetworkSettings) == "table" and type(v.NetworkSettings.Networks) == "table") then - for networkname, netconfig in pairs(v.NetworkSettings.Networks) do - data[index]["_network"] = (data[index]["_network"] ~= nil and (data[index]["_network"] .." | ") or "").. networkname .. (netconfig.IPAddress ~= "" and (": " .. netconfig.IPAddress) or "") - end - end - - -- networkmode = v.HostConfig.NetworkMode ~= "default" and v.HostConfig.NetworkMode or "bridge" - -- data[index]["_network"] = v.NetworkSettings.Networks[networkmode].IPAddress or nil - -- local _, _, image = v.Image:find("^sha256:(.+)") - -- if image ~= nil then - -- image=image:sub(1,12) - -- end - - if v.Ports and next(v.Ports) ~= nil then - data[index]["_ports"] = nil - local ip = require "luci.ip" - for _,v2 in ipairs(v.Ports) do - -- display ipv4 only - if ip.new(v2.IP or "0.0.0.0"):is4() then - data[index]["_ports"] = (data[index]["_ports"] and (data[index]["_ports"] .. ", ") or "") - .. ((v2.PublicPort and v2.Type and v2.Type == "tcp") and ('') or "") - .. (v2.PublicPort and (v2.PublicPort .. ":") or "") .. (v2.PrivatePort and (v2.PrivatePort .."/") or "") .. (v2.Type and v2.Type or "") - .. ((v2.PublicPort and v2.Type and v2.Type == "tcp")and "" or "") - end - end - end - - for ii,iv in ipairs(images) do - if iv.Id == v.ImageID then - data[index]["_image"] = iv.RepoTags and iv.RepoTags[1] or (iv.RepoDigests[1]:gsub("(.-)@.+", "%1") .. ":<none>") - end - end - data[index]["_id_name"] = ''.. data[index]["_name"] .. "
ID: " .. data[index]["_id"] - .. "

Image: " .. (data[index]["_image"] or "<none>") - .. "
" - - if type(v.Mounts) == "table" and next(v.Mounts) then - for _, v2 in pairs(v.Mounts) do - if v2.Type ~= "volume" then - local v_sorce_d, v_dest_d - local v_sorce = "" - local v_dest = "" - for v_sorce_d in v2["Source"]:gmatch('[^/]+') do - if v_sorce_d and #v_sorce_d > 12 then - v_sorce = v_sorce .. "/" .. v_sorce_d:sub(1,8) .. ".." - else - v_sorce = v_sorce .."/".. v_sorce_d - end - end - for v_dest_d in v2["Destination"]:gmatch('[^/]+') do - if v_dest_d and #v_dest_d > 12 then - v_dest = v_dest .. "/" .. v_dest_d:sub(1,8) .. ".." - else - v_dest = v_dest .."/".. v_dest_d - end - end - data[index]["_mounts"] = (data[index]["_mounts"] and (data[index]["_mounts"] .. "
") or "") .. '' .. v_sorce .. "→" .. v_dest..'' - end - end - end - - data[index]["_image_id"] = v.ImageID:sub(8,20) - data[index]["_command"] = v.Command - end - return data -end - -local container_list = not lost_state and get_containers() or {} - -m = SimpleForm("docker", - translate("Docker - Containers"), - translate("This page displays all containers that have been created on the connected docker host.")) -m.submit=false -m.reset=false -m:append(Template("dockerman/containers_running_stats")) - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err=docker:read_status() -s.err=s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(Table, container_list, translate("Containers")) -s.nodescr=true -s.config="containers" - -o = s:option(Flag, "_selected","") -o.disabled = 0 -o.enabled = 1 -o.default = 0 -o.width = "1%" -o.write=function(self, section, value) - container_list[section]._selected = value -end - --- o = s:option(DummyValue, "_id", translate("ID")) --- o.width="10%" - --- o = s:option(DummyValue, "_name", translate("Container Name")) --- o.rawhtml = true - -o = s:option(DummyValue, "_id_name", translate("Container Info")) -o.rawhtml = true -o.width="15%" - -o = s:option(DummyValue, "_status", translate("Status")) -o.width="15%" -o.rawhtml=true - -o = s:option(DummyValue, "_network", translate("Network")) -o.width="10%" - -o = s:option(DummyValue, "_ports", translate("Ports")) -o.width="5%" -o.rawhtml = true -o = s:option(DummyValue, "_mounts", translate("Mounts")) -o.width="25%" -o.rawhtml = true - --- o = s:option(DummyValue, "_image", translate("Image")) --- o.width="8%" - -o = s:option(DummyValue, "_command", translate("Command")) -o.width="15%" - -local start_stop_remove = function(m, cmd) - local container_selected = {} - -- 遍历table中sectionid - for k in pairs(container_list) do - -- 得到选中项的名字 - if container_list[k]._selected == 1 then - container_selected[#container_selected + 1] = container_list[k]["_id"] - end - end - if #container_selected > 0 then - local success = true - - docker:clear_status() - for _, cont in ipairs(container_selected) do - docker:append_status("Containers: " .. cmd .. " " .. cont .. "...") - local res = dk.containers[cmd](dk, {id = cont}) - if res and res.code and res.code >= 300 then - success = false - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "\n") - else - docker:append_status("done\n") - end - end - - if success then - docker:clear_status() - end - - luci.http.redirect(luci.dispatcher.build_url("admin/docker/containers")) - end -end - -s = m:section(Table,{{}}) -s.notitle=true -s.rowcolors=false -s.template="cbi/nullsection" - -o = s:option(Button, "_new") -o.inputtitle = translate("Add") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "add" -o.forcewrite = true -o.write = function(self, section) - luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer")) -end -o.disable = lost_state - -o = s:option(Button, "_start") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle = translate("Start") -o.inputstyle = "apply" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"start") -end -o.disable = lost_state - -o = s:option(Button, "_restart") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle = translate("Restart") -o.inputstyle = "reload" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"restart") -end -o.disable = lost_state - -o = s:option(Button, "_stop") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle = translate("Stop") -o.inputstyle = "reset" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"stop") -end -o.disable = lost_state - -o = s:option(Button, "_kill") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle = translate("Kill") -o.inputstyle = "reset" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m,"kill") -end -o.disable = lost_state - -o = s:option(Button, "_remove") -o.template = "dockerman/cbi/inlinebutton" -o.inputtitle = translate("Remove") -o.inputstyle = "remove" -o.forcewrite = true -o.write = function(self, section) - start_stop_remove(m, "remove") -end -o.disable = lost_state - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua deleted file mode 100755 index c3d3eab0d..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua +++ /dev/null @@ -1,284 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" -local dk = docker.new() - -local containers, images, res, lost_state -local m, s, o - -if dk:_ping().code ~= 200 then - lost_state = true -else - res = dk.images:list() - if res and res.code and res.code < 300 then - images = res.body - end - - res = dk.containers:list({ query = { all = true } }) - if res and res.code and res.code < 300 then - containers = res.body - end -end - -function get_images() - local data = {} - - for i, v in ipairs(images) do - local index = v.Created .. v.Id - - data[index]={} - data[index]["_selected"] = 0 - data[index]["id"] = v.Id:sub(8) - data[index]["_id"] = '' .. v.Id:sub(8,20) .. '' - - if v.RepoTags and next(v.RepoTags)~=nil then - for i, v1 in ipairs(v.RepoTags) do - data[index]["_tags"] =(data[index]["_tags"] and ( data[index]["_tags"] .. "
" )or "") .. ((v1:match("") or (#v.RepoTags == 1)) and v1 or ('' .. v1 .. '')) - - if not data[index]["tag"] then - data[index]["tag"] = v1 - end - end - else - data[index]["_tags"] = v.RepoDigests[1] and v.RepoDigests[1]:match("^(.-)@.+") - data[index]["_tags"] = (data[index]["_tags"] and data[index]["_tags"] or "" ).. ":" - end - - data[index]["_tags"] = data[index]["_tags"]:gsub("","<none>") - for ci,cv in ipairs(containers) do - if v.Id == cv.ImageID then - data[index]["_containers"] = (data[index]["_containers"] and (data[index]["_containers"] .. " | ") or "").. - ''.. cv.Names[1]:sub(2).."" - end - end - - data[index]["_size"] = string.format("%.2f", tostring(v.Size/1024/1024)).."MB" - data[index]["_created"] = os.date("%Y/%m/%d %H:%M:%S",v.Created) - end - - return data -end - -local image_list = not lost_state and get_images() or {} - -m = SimpleForm("docker", - translate("Docker - Images"), - translate("On this page all images are displayed that are available on the system and with which a container can be created.")) -m.submit=false -m.reset=false - -local pull_value={ - _image_tag_name="", - _registry="index.docker.io" -} - -s = m:section(SimpleSection, - translate("Pull Image"), - translate("By entering a valid image name with the corresponding version, the docker image can be downloaded from the configured registry.")) -s.template="cbi/nullsection" - -o = s:option(Value, "_image_tag_name") -o.template = "dockerman/cbi/inlinevalue" -o.placeholder="lisaac/luci:latest" -o.write = function(self, section, value) - local hastag = value:find(":") - - if not hastag then - value = value .. ":latest" - end - pull_value["_image_tag_name"] = value -end - -o = s:option(Button, "_pull") -o.inputtitle= translate("Pull") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "add" -o.disable = lost_state -o.write = function(self, section) - local tag = pull_value["_image_tag_name"] - local json_stringify = luci.jsonc and luci.jsonc.stringify - - if tag and tag ~= "" then - docker:write_status("Images: " .. "pulling" .. " " .. tag .. "...\n") - local res = dk.images:create({query = {fromImage=tag}}, docker.pull_image_show_status_cb) - - if res and res.code and res.code == 200 and (res.body[#res.body] and not res.body[#res.body].error and res.body[#res.body].status and (res.body[#res.body].status == "Status: Downloaded newer image for ".. tag)) then - docker:clear_status() - else - docker:append_status("code:" .. res.code.." ".. (res.body[#res.body] and res.body[#res.body].error or (res.body.message or res.message)).. "\n") - end - else - docker:append_status("code: 400 please input the name of image name!") - end - - luci.http.redirect(luci.dispatcher.build_url("admin/docker/images")) -end - -s = m:section(SimpleSection, - translate("Import Image"), - translate("When pressing the Import button, both a local image can be loaded onto the system and a valid image tar can be downloaded from remote.")) - -o = s:option(DummyValue, "_image_import") -o.template = "dockerman/images_import" -o.disable = lost_state - -s = m:section(Table, image_list, translate("Images overview")) - -o = s:option(Flag, "_selected","") -o.disabled = 0 -o.enabled = 1 -o.default = 0 -o.write = function(self, section, value) - image_list[section]._selected = value -end - -o = s:option(DummyValue, "_id", translate("ID")) -o.rawhtml = true - -o = s:option(DummyValue, "_tags", translate("RepoTags")) -o.rawhtml = true - -o = s:option(DummyValue, "_containers", translate("Containers")) -o.rawhtml = true - -o = s:option(DummyValue, "_size", translate("Size")) - -o = s:option(DummyValue, "_created", translate("Created")) - -local remove_action = function(force) - local image_selected = {} - - for k in pairs(image_list) do - if image_list[k]._selected == 1 then - image_selected[#image_selected+1] = (image_list[k]["_tags"]:match("
") or image_list[k]["_tags"]:match("<none>")) and image_list[k].id or image_list[k].tag - end - end - - if next(image_selected) ~= nil then - local success = true - - docker:clear_status() - for _, img in ipairs(image_selected) do - local query - docker:append_status("Images: " .. "remove" .. " " .. img .. "...") - - if force then - query = {force = true} - end - - local msg = dk.images:remove({ - id = img, - query = query - }) - if msg and msg.code ~= 200 then - docker:append_status("code:" .. msg.code.." ".. (msg.body.message and msg.body.message or msg.message).. "\n") - success = false - else - docker:append_status("done\n") - end - end - - if success then - docker:clear_status() - end - - luci.http.redirect(luci.dispatcher.build_url("admin/docker/images")) - end -end - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err = docker:read_status() -s.err = s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(Table,{{}}) -s.notitle=true -s.rowcolors=false -s.template="cbi/nullsection" - -o = s:option(Button, "remove") -o.inputtitle= translate("Remove") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "remove" -o.forcewrite = true -o.write = function(self, section) - remove_action() -end -o.disable = lost_state - -o = s:option(Button, "forceremove") -o.inputtitle= translate("Force Remove") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "remove" -o.forcewrite = true -o.write = function(self, section) - remove_action(true) -end -o.disable = lost_state - -o = s:option(Button, "save") -o.inputtitle= translate("Save") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "edit" -o.disable = lost_state -o.forcewrite = true -o.write = function (self, section) - local image_selected = {} - - for k in pairs(image_list) do - if image_list[k]._selected == 1 then - image_selected[#image_selected + 1] = image_list[k].id - end - end - - if next(image_selected) ~= nil then - local names, first, show_name - - for _, img in ipairs(image_selected) do - names = names and (names .. "&names=".. img) or img - end - if #image_selected > 1 then - show_name = "images" - else - show_name = image_selected[1] - end - local cb = function(res, chunk) - if res and res.code and res.code == 200 then - if not first then - first = true - luci.http.header('Content-Disposition', 'inline; filename="'.. show_name .. '.tar"') - luci.http.header('Content-Type', 'application\/x-tar') - end - luci.ltn12.pump.all(chunk, luci.http.write) - else - if not first then - first = true - luci.http.prepare_content("text/plain") - end - luci.ltn12.pump.all(chunk, luci.http.write) - end - end - - docker:write_status("Images: " .. "save" .. " " .. table.concat(image_selected, "\n") .. "...") - local msg = dk.images:get({query = {names = names}}, cb) - if msg and msg.code and msg.code ~= 200 then - docker:append_status("code:" .. msg.code.." ".. (msg.body.message and msg.body.message or msg.message).. "\n") - else - docker:clear_status() - end - end -end - -o = s:option(Button, "load") -o.inputtitle= translate("Load") -o.template = "dockerman/images_load" -o.inputstyle = "add" -o.disable = lost_state - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua deleted file mode 100755 index 37702c783..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua +++ /dev/null @@ -1,159 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" - -local m, s, o -local networks, dk, res, lost_state - -dk = docker.new() - -if dk:_ping().code ~= 200 then - lost_state = true -else - res = dk.networks:list() - if res and res.code and res.code < 300 then - networks = res.body - end -end - -local get_networks = function () - local data = {} - - if type(networks) ~= "table" then - return nil - end - - for i, v in ipairs(networks) do - local index = v.Created .. v.Id - - data[index]={} - data[index]["_selected"] = 0 - data[index]["_id"] = v.Id:sub(1,12) - data[index]["_name"] = v.Name - data[index]["_driver"] = v.Driver - - if v.Driver == "bridge" then - data[index]["_interface"] = v.Options["com.docker.network.bridge.name"] - elseif v.Driver == "macvlan" then - data[index]["_interface"] = v.Options.parent - end - - data[index]["_subnet"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil - data[index]["_gateway"] = v.IPAM and v.IPAM.Config[1] and v.IPAM.Config[1].Gateway or nil - end - - return data -end - -local network_list = not lost_state and get_networks() or {} - -m = SimpleForm("docker", - translate("Docker - Networks"), - translate("This page displays all docker networks that have been created on the connected docker host.")) -m.submit=false -m.reset=false - -s = m:section(Table, network_list, translate("Networks overview")) -s.nodescr=true - -o = s:option(Flag, "_selected","") -o.template = "dockerman/cbi/xfvalue" -o.disabled = 0 -o.enabled = 1 -o.default = 0 -o.render = function(self, section, scope) - self.disable = 0 - if network_list[section]["_name"] == "bridge" or network_list[section]["_name"] == "none" or network_list[section]["_name"] == "host" then - self.disable = 1 - end - Flag.render(self, section, scope) -end -o.write = function(self, section, value) - network_list[section]._selected = value -end - -o = s:option(DummyValue, "_id", translate("ID")) - -o = s:option(DummyValue, "_name", translate("Network Name")) - -o = s:option(DummyValue, "_driver", translate("Driver")) - -o = s:option(DummyValue, "_interface", translate("Parent Interface")) - -o = s:option(DummyValue, "_subnet", translate("Subnet")) - -o = s:option(DummyValue, "_gateway", translate("Gateway")) - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err = docker:read_status() -s.err = s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(Table,{{}}) -s.notitle=true -s.rowcolors=false -s.template="cbi/nullsection" - -o = s:option(Button, "_new") -o.inputtitle= translate("New") -o.template = "dockerman/cbi/inlinebutton" -o.notitle=true -o.inputstyle = "add" -o.forcewrite = true -o.disable = lost_state -o.write = function(self, section) - luci.http.redirect(luci.dispatcher.build_url("admin/docker/newnetwork")) -end - -o = s:option(Button, "_remove") -o.inputtitle= translate("Remove") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "remove" -o.forcewrite = true -o.disable = lost_state -o.write = function(self, section) - local network_selected = {} - local network_name_selected = {} - local network_driver_selected = {} - - for k in pairs(network_list) do - if network_list[k]._selected == 1 then - network_selected[#network_selected + 1] = network_list[k]._id - network_name_selected[#network_name_selected + 1] = network_list[k]._name - network_driver_selected[#network_driver_selected + 1] = network_list[k]._driver - end - end - - if next(network_selected) ~= nil then - local success = true - docker:clear_status() - - for ii, net in ipairs(network_selected) do - docker:append_status("Networks: " .. "remove" .. " " .. net .. "...") - local res = dk.networks["remove"](dk, {id = net}) - - if res and res.code and res.code >= 300 then - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "\n") - success = false - else - docker:append_status("done\n") - if network_driver_selected[ii] == "macvlan" then - docker.remove_macvlan_interface(network_name_selected[ii]) - end - end - end - - if success then - docker:clear_status() - end - luci.http.redirect(luci.dispatcher.build_url("admin/docker/networks")) - end -end - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua deleted file mode 100755 index bfd1bf2a1..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua +++ /dev/null @@ -1,923 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" - -local m, s, o - -local dk = docker.new() - -local cmd_line = table.concat(arg, '/') -local images, networks -local create_body = {} - -if dk:_ping().code ~= 200 then - lost_state = true - images = {} - networks = {} -else - images = dk.images:list().body - networks = dk.networks:list().body -end - -local is_quot_complete = function(str) - local num = 0, w - require "math" - - if not str then - return true - end - - local num = 0, w - for w in str:gmatch("\"") do - num = num + 1 - end - - if math.fmod(num, 2) ~= 0 then - return false - end - - num = 0 - for w in str:gmatch("\'") do - num = num + 1 - end - - if math.fmod(num, 2) ~= 0 then - return false - end - - return true -end - -function contains(list, x) - for _, v in pairs(list) do - if v == x then - return true - end - end - return false -end - -local resolve_cli = function(cmd_line) - local config = { - advance = 1 - } - - local key_no_val = { - 't', - 'd', - 'i', - 'tty', - 'rm', - 'read_only', - 'interactive', - 'init', - 'help', - 'detach', - 'privileged', - 'P', - 'publish_all', - } - - local key_with_val = { - 'sysctl', - 'add_host', - 'a', - 'attach', - 'blkio_weight_device', - 'cap_add', - 'cap_drop', - 'device', - 'device_cgroup_rule', - 'device_read_bps', - 'device_read_iops', - 'device_write_bps', - 'device_write_iops', - 'dns', - 'dns_option', - 'dns_search', - 'e', - 'env', - 'env_file', - 'expose', - 'group_add', - 'l', - 'label', - 'label_file', - 'link', - 'link_local_ip', - 'log_driver', - 'log_opt', - 'network_alias', - 'p', - 'publish', - 'security_opt', - 'storage_opt', - 'tmpfs', - 'v', - 'volume', - 'volumes_from', - 'blkio_weight', - 'cgroup_parent', - 'cidfile', - 'cpu_period', - 'cpu_quota', - 'cpu_rt_period', - 'cpu_rt_runtime', - 'c', - 'cpu_shares', - 'cpus', - 'cpuset_cpus', - 'cpuset_mems', - 'detach_keys', - 'disable_content_trust', - 'domainname', - 'entrypoint', - 'gpus', - 'health_cmd', - 'health_interval', - 'health_retries', - 'health_start_period', - 'health_timeout', - 'h', - 'hostname', - 'ip', - 'ip6', - 'ipc', - 'isolation', - 'kernel_memory', - 'mac_address', - 'm', - 'memory', - 'memory_reservation', - 'memory_swap', - 'memory_swappiness', - 'mount', - 'name', - 'network', - 'no_healthcheck', - 'oom_kill_disable', - 'oom_score_adj', - 'pid', - 'pids_limit', - 'restart', - 'runtime', - 'shm_size', - 'sig_proxy', - 'stop_signal', - 'stop_timeout', - 'ulimit', - 'u', - 'user', - 'userns', - 'uts', - 'volume_driver', - 'w', - 'workdir' - } - - local key_abb = { - net='network', - a='attach', - c='cpu-shares', - d='detach', - e='env', - h='hostname', - i='interactive', - l='label', - m='memory', - p='publish', - P='publish_all', - t='tty', - u='user', - v='volume', - w='workdir' - } - - local key_with_list = { - 'sysctl', - 'add_host', - 'a', - 'attach', - 'blkio_weight_device', - 'cap_add', - 'cap_drop', - 'device', - 'device_cgroup_rule', - 'device_read_bps', - 'device_read_iops', - 'device_write_bps', - 'device_write_iops', - 'dns', - 'dns_optiondns_search', - 'e', - 'env', - 'env_file', - 'expose', - 'group_add', - 'l', - 'label', - 'label_file', - 'link', - 'link_local_ip', - 'log_opt', - 'network_alias', - 'p', - 'publish', - 'security_opt', - 'storage_opt', - 'tmpfs', - 'v', - 'volume', - 'volumes_from', - } - - local key = nil - local _key = nil - local val = nil - local is_cmd = false - - cmd_line = cmd_line:match("^DOCKERCLI%s+(.+)") - for w in cmd_line:gmatch("[^%s]+") do - if w =='\\' then - elseif not key and not _key and not is_cmd then - --key=val - key, val = w:match("^%-%-([%lP%-]-)=(.+)") - if not key then - --key val - key = w:match("^%-%-([%lP%-]+)") - if not key then - -- -v val - key = w:match("^%-([%lP%-]+)") - if key then - -- for -dit - if key:match("i") or key:match("t") or key:match("d") then - if key:match("i") then - config[key_abb["i"]] = true - key:gsub("i", "") - end - if key:match("t") then - config[key_abb["t"]] = true - key:gsub("t", "") - end - if key:match("d") then - config[key_abb["d"]] = true - key:gsub("d", "") - end - if key:match("P") then - config[key_abb["P"]] = true - key:gsub("P", "") - end - if key == "" then - key = nil - end - end - end - end - end - if key then - key = key:gsub("-","_") - key = key_abb[key] or key - if contains(key_no_val, key) then - config[key] = true - val = nil - key = nil - elseif contains(key_with_val, key) then - -- if key == "cap_add" then config.privileged = true end - else - key = nil - val = nil - end - else - config.image = w - key = nil - val = nil - is_cmd = true - end - elseif (key or _key) and not is_cmd then - if key == "mount" then - -- we need resolve mount options here - -- type=bind,source=/source,target=/app - local _type = w:match("^type=([^,]+),") or "bind" - local source = (_type ~= "tmpfs") and (w:match("source=([^,]+),") or w:match("src=([^,]+),")) or "" - local target = w:match(",target=([^,]+)") or w:match(",dst=([^,]+)") or w:match(",destination=([^,]+)") or "" - local ro = w:match(",readonly") and "ro" or nil - - if source and target then - if _type ~= "tmpfs" then - local bind_propagation = (_type == "bind") and w:match(",bind%-propagation=([^,]+)") or nil - val = source..":"..target .. ((ro or bind_propagation) and (":" .. (ro and ro or "") .. (((ro and bind_propagation) and "," or "") .. (bind_propagation and bind_propagation or ""))or "")) - else - local tmpfs_mode = w:match(",tmpfs%-mode=([^,]+)") or nil - local tmpfs_size = w:match(",tmpfs%-size=([^,]+)") or nil - key = "tmpfs" - val = target .. ((tmpfs_mode or tmpfs_size) and (":" .. (tmpfs_mode and ("mode=" .. tmpfs_mode) or "") .. ((tmpfs_mode and tmpfs_size) and "," or "") .. (tmpfs_size and ("size=".. tmpfs_size) or "")) or "") - if not config[key] then - config[key] = {} - end - table.insert( config[key], val ) - key = nil - val = nil - end - end - else - val = w - end - elseif is_cmd then - config["command"] = (config["command"] and (config["command"] .. " " )or "") .. w - end - if (key or _key) and val then - key = _key or key - if contains(key_with_list, key) then - if not config[key] then - config[key] = {} - end - if _key then - config[key][#config[key]] = config[key][#config[key]] .. " " .. w - else - table.insert( config[key], val ) - end - if is_quot_complete(config[key][#config[key]]) then - config[key][#config[key]] = config[key][#config[key]]:gsub("[\"\']", "") - _key = nil - else - _key = key - end - else - config[key] = (config[key] and (config[key] .. " ") or "") .. val - if is_quot_complete(config[key]) then - config[key] = config[key]:gsub("[\"\']", "") - _key = nil - else - _key = key - end - end - key = nil - val = nil - end - end - - return config -end - -local default_config = {} - -if cmd_line and cmd_line:match("^DOCKERCLI.+") then - default_config = resolve_cli(cmd_line) -elseif cmd_line and cmd_line:match("^duplicate/[^/]+$") then - local container_id = cmd_line:match("^duplicate/(.+)") - create_body = dk:containers_duplicate_config({id = container_id}) or {} - if not create_body.HostConfig then - create_body.HostConfig = {} - end - - if next(create_body) ~= nil then - default_config.name = nil - default_config.image = create_body.Image - default_config.hostname = create_body.Hostname - default_config.tty = create_body.Tty and true or false - default_config.interactive = create_body.OpenStdin and true or false - default_config.privileged = create_body.HostConfig.Privileged and true or false - default_config.restart = create_body.HostConfig.RestartPolicy and create_body.HostConfig.RestartPolicy.name or nil - -- default_config.network = create_body.HostConfig.NetworkMode == "default" and "bridge" or create_body.HostConfig.NetworkMode - -- if container has leave original network, and add new network, .HostConfig.NetworkMode is INcorrect, so using first child of .NetworkingConfig.EndpointsConfig - default_config.network = create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and next(create_body.NetworkingConfig.EndpointsConfig) or nil - default_config.ip = default_config.network and default_config.network ~= "bridge" and default_config.network ~= "host" and default_config.network ~= "null" and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig and create_body.NetworkingConfig.EndpointsConfig[default_config.network].IPAMConfig.IPv4Address or nil - default_config.link = create_body.HostConfig.Links - default_config.env = create_body.Env - default_config.dns = create_body.HostConfig.Dns - default_config.volume = create_body.HostConfig.Binds - default_config.cap_add = create_body.HostConfig.CapAdd - default_config.publish_all = create_body.HostConfig.PublishAllPorts - - if create_body.HostConfig.Sysctls and type(create_body.HostConfig.Sysctls) == "table" then - default_config.sysctl = {} - for k, v in pairs(create_body.HostConfig.Sysctls) do - table.insert( default_config.sysctl, k.."="..v ) - end - end - if create_body.HostConfig.LogConfig then - if create_body.HostConfig.LogConfig.Config and type(create_body.HostConfig.LogConfig.Config) == "table" then - default_config.log_opt = {} - for k, v in pairs(create_body.HostConfig.LogConfig.Config) do - table.insert( default_config.log_opt, k.."="..v ) - end - end - default_config.log_driver = create_body.HostConfig.LogConfig.Type or nil - end - - if create_body.HostConfig.PortBindings and type(create_body.HostConfig.PortBindings) == "table" then - default_config.publish = {} - for k, v in pairs(create_body.HostConfig.PortBindings) do - for x, y in ipairs(v) do - table.insert( default_config.publish, y.HostPort..":"..k:match("^(%d+)/.+").."/"..k:match("^%d+/(.+)") ) - end - end - end - - default_config.user = create_body.User or nil - default_config.command = create_body.Cmd and type(create_body.Cmd) == "table" and table.concat(create_body.Cmd, " ") or nil - default_config.advance = 1 - default_config.cpus = create_body.HostConfig.NanoCPUs - default_config.cpu_shares = create_body.HostConfig.CpuShares - default_config.memory = create_body.HostConfig.Memory - default_config.blkio_weight = create_body.HostConfig.BlkioWeight - - if create_body.HostConfig.Devices and type(create_body.HostConfig.Devices) == "table" then - default_config.device = {} - for _, v in ipairs(create_body.HostConfig.Devices) do - table.insert( default_config.device, v.PathOnHost..":"..v.PathInContainer..(v.CgroupPermissions ~= "" and (":" .. v.CgroupPermissions) or "") ) - end - end - - if create_body.HostConfig.Tmpfs and type(create_body.HostConfig.Tmpfs) == "table" then - default_config.tmpfs = {} - for k, v in pairs(create_body.HostConfig.Tmpfs) do - table.insert( default_config.tmpfs, k .. (v~="" and ":" or "")..v ) - end - end - end -end - -m = SimpleForm("docker", translate("Docker - Containers")) -m.redirect = luci.dispatcher.build_url("admin", "docker", "containers") -if lost_state then - m.submit=false - m.reset=false -end - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err=docker:read_status() -s.err=s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(SimpleSection, translate("Create new docker container")) -s.addremove = true -s.anonymous = true - -o = s:option(DummyValue,"cmd_line", translate("Resolve CLI")) -o.rawhtml = true -o.template = "dockerman/newcontainer_resolve" - -o = s:option(Value, "name", translate("Container Name")) -o.rmempty = true -o.default = default_config.name or nil - -o = s:option(Flag, "interactive", translate("Interactive (-i)")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = default_config.interactive and 1 or 0 - -o = s:option(Flag, "tty", translate("TTY (-t)")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = default_config.tty and 1 or 0 - -o = s:option(Value, "image", translate("Docker Image")) -o.rmempty = true -o.default = default_config.image or nil -for _, v in ipairs (images) do - if v.RepoTags then - o:value(v.RepoTags[1], v.RepoTags[1]) - end -end - -o = s:option(Flag, "_force_pull", translate("Always pull image first")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = 0 - -o = s:option(Flag, "privileged", translate("Privileged")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = default_config.privileged and 1 or 0 - -o = s:option(ListValue, "restart", translate("Restart Policy")) -o.rmempty = true -o:value("no", "No") -o:value("unless-stopped", "Unless stopped") -o:value("always", "Always") -o:value("on-failure", "On failure") -o.default = default_config.restart or "unless-stopped" - -local d_network = s:option(ListValue, "network", translate("Networks")) -d_network.rmempty = true -d_network.default = default_config.network or "bridge" - -local d_ip = s:option(Value, "ip", translate("IPv4 Address")) -d_ip.datatype="ip4addr" -d_ip:depends("network", "nil") -d_ip.default = default_config.ip or nil - -o = s:option(DynamicList, "link", translate("Links with other containers")) -o.placeholder = "container_name:alias" -o.rmempty = true -o:depends("network", "bridge") -o.default = default_config.link or nil - -o = s:option(DynamicList, "dns", translate("Set custom DNS servers")) -o.placeholder = "8.8.8.8" -o.rmempty = true -o.default = default_config.dns or nil - -o = s:option(Value, "user", - translate("User(-u)"), - translate("The user that commands are run as inside the container.(format: name|uid[:group|gid])")) -o.placeholder = "1000:1000" -o.rmempty = true -o.default = default_config.user or nil - -o = s:option(DynamicList, "env", - translate("Environmental Variable(-e)"), - translate("Set environment variables to inside the container")) -o.placeholder = "TZ=Asia/Shanghai" -o.rmempty = true -o.default = default_config.env or nil - -o = s:option(DynamicList, "volume", - translate("Bind Mount(-v)"), - translate("Bind mount a volume")) -o.placeholder = "/media:/media:slave" -o.rmempty = true -o.default = default_config.volume or nil - -local d_publish = s:option(DynamicList, "publish", - translate("Exposed Ports(-p)"), - translate("Publish container's port(s) to the host")) -d_publish.placeholder = "2200:22/tcp" -d_publish.rmempty = true -d_publish.default = default_config.publish or nil - -o = s:option(Value, "command", translate("Run command")) -o.placeholder = "/bin/sh init.sh" -o.rmempty = true -o.default = default_config.command or nil - -o = s:option(Flag, "advance", translate("Advance")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = default_config.advance or 0 - -o = s:option(Value, "hostname", - translate("Host Name"), - translate("The hostname to use for the container")) -o.rmempty = true -o.default = default_config.hostname or nil -o:depends("advance", 1) - -o = s:option(Flag, "publish_all", - translate("Exposed All Ports(-P)"), - translate("Allocates an ephemeral host port for all of a container's exposed ports")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = default_config.publish_all and 1 or 0 -o:depends("advance", 1) - -o = s:option(DynamicList, "device", - translate("Device(--device)"), - translate("Add host device to the container")) -o.placeholder = "/dev/sda:/dev/xvdc:rwm" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.device or nil - -o = s:option(DynamicList, "tmpfs", - translate("Tmpfs(--tmpfs)"), - translate("Mount tmpfs directory")) -o.placeholder = "/run:rw,noexec,nosuid,size=65536k" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.tmpfs or nil - -o = s:option(DynamicList, "sysctl", - translate("Sysctl(--sysctl)"), - translate("Sysctls (kernel parameters) options")) -o.placeholder = "net.ipv4.ip_forward=1" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.sysctl or nil - -o = s:option(DynamicList, "cap_add", - translate("CAP-ADD(--cap-add)"), - translate("A list of kernel capabilities to add to the container")) -o.placeholder = "NET_ADMIN" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.cap_add or nil - -o = s:option(Value, "cpus", - translate("CPUs"), - translate("Number of CPUs. Number is a fractional number. 0.000 means no limit")) -o.placeholder = "1.5" -o.rmempty = true -o:depends("advance", 1) -o.datatype="ufloat" -o.default = default_config.cpus or nil - -o = s:option(Value, "cpu_shares", - translate("CPU Shares Weight"), - translate("CPU shares relative weight, if 0 is set, the system will ignore the value and use the default of 1024")) -o.placeholder = "1024" -o.rmempty = true -o:depends("advance", 1) -o.datatype="uinteger" -o.default = default_config.cpu_shares or nil - -o = s:option(Value, "memory", - translate("Memory"), - translate("Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M")) -o.placeholder = "128m" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.memory or nil - -o = s:option(Value, "blkio_weight", - translate("Block IO Weight"), - translate("Block IO weight (relative weight) accepts a weight value between 10 and 1000")) -o.placeholder = "500" -o.rmempty = true -o:depends("advance", 1) -o.datatype="uinteger" -o.default = default_config.blkio_weight or nil - -o = s:option(Value, "log_driver", - translate("Logging driver"), - translate("The logging driver for the container")) -o.placeholder = "json-file" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.log_driver or nil - -o = s:option(DynamicList, "log_opt", - translate("Log driver options"), - translate("The logging configuration for this container")) -o.placeholder = "max-size=1m" -o.rmempty = true -o:depends("advance", 1) -o.default = default_config.log_opt or nil - -for _, v in ipairs (networks) do - if v.Name then - local parent = v.Options and v.Options.parent or nil - local ip = v.IPAM and v.IPAM.Config and v.IPAM.Config[1] and v.IPAM.Config[1].Subnet or nil - ipv6 = v.IPAM and v.IPAM.Config and v.IPAM.Config[2] and v.IPAM.Config[2].Subnet or nil - local network_name = v.Name .. " | " .. v.Driver .. (parent and (" | " .. parent) or "") .. (ip and (" | " .. ip) or "").. (ipv6 and (" | " .. ipv6) or "") - d_network:value(v.Name, network_name) - - if v.Name ~= "none" and v.Name ~= "bridge" and v.Name ~= "host" then - d_ip:depends("network", v.Name) - end - - if v.Driver == "bridge" then - d_publish:depends("network", v.Name) - end - end -end - -m.handle = function(self, state, data) - if state ~= FORM_VALID then - return - end - - local tmp - local name = data.name or ("luci_" .. os.date("%Y%m%d%H%M%S")) - local hostname = data.hostname - local tty = type(data.tty) == "number" and (data.tty == 1 and true or false) or default_config.tty or false - local publish_all = type(data.publish_all) == "number" and (data.publish_all == 1 and true or false) or default_config.publish_all or false - local interactive = type(data.interactive) == "number" and (data.interactive == 1 and true or false) or default_config.interactive or false - local image = data.image - local user = data.user - - if image and not image:match(".-:.+") then - image = image .. ":latest" - end - - local privileged = type(data.privileged) == "number" and (data.privileged == 1 and true or false) or default_config.privileged or false - local restart = data.restart - local env = data.env - local dns = data.dns - local cap_add = data.cap_add - local sysctl = {} - local log_driver = data.log_driver - - tmp = data.sysctl - if type(tmp) == "table" then - for i, v in ipairs(tmp) do - local k,v1 = v:match("(.-)=(.+)") - if k and v1 then - sysctl[k]=v1 - end - end - end - - local log_opt = {} - tmp = data.log_opt - if type(tmp) == "table" then - for i, v in ipairs(tmp) do - local k,v1 = v:match("(.-)=(.+)") - if k and v1 then - log_opt[k]=v1 - end - end - end - - local network = data.network - local ip = (network ~= "bridge" and network ~= "host" and network ~= "none") and data.ip or nil - local volume = data.volume - local memory = data.memory or nil - local cpu_shares = data.cpu_shares or nil - local cpus = data.cpus or nil - local blkio_weight = data.blkio_weight or nil - - local portbindings = {} - local exposedports = {} - - local tmpfs = {} - tmp = data.tmpfs - if type(tmp) == "table" then - for i, v in ipairs(tmp)do - local k= v:match("([^:]+)") - local v1 = v:match(".-:([^:]+)") or "" - if k then - tmpfs[k]=v1 - end - end - end - - local device = {} - tmp = data.device - if type(tmp) == "table" then - for i, v in ipairs(tmp) do - local t = {} - local _,_, h, c, p = v:find("(.-):(.-):(.+)") - if h and c then - t['PathOnHost'] = h - t['PathInContainer'] = c - t['CgroupPermissions'] = p or "rwm" - else - local _,_, h, c = v:find("(.-):(.+)") - if h and c then - t['PathOnHost'] = h - t['PathInContainer'] = c - t['CgroupPermissions'] = "rwm" - else - t['PathOnHost'] = v - t['PathInContainer'] = v - t['CgroupPermissions'] = "rwm" - end - end - - if next(t) ~= nil then - table.insert( device, t ) - end - end - end - - tmp = data.publish or {} - for i, v in ipairs(tmp) do - for v1 ,v2 in string.gmatch(v, "(%d+):([^%s]+)") do - local _,_,p= v2:find("^%d+/(%w+)") - if p == nil then - v2=v2..'/tcp' - end - portbindings[v2] = {{HostPort=v1}} - exposedports[v2] = {HostPort=v1} - end - end - - local link = data.link - tmp = data.command - local command = {} - if tmp ~= nil then - for v in string.gmatch(tmp, "[^%s]+") do - command[#command+1] = v - end - end - - if memory and memory ~= 0 then - _,_,n,unit = memory:find("([%d%.]+)([%l%u]+)") - if n then - unit = unit and unit:sub(1,1):upper() or "B" - if unit == "M" then - memory = tonumber(n) * 1024 * 1024 - elseif unit == "G" then - memory = tonumber(n) * 1024 * 1024 * 1024 - elseif unit == "K" then - memory = tonumber(n) * 1024 - else - memory = tonumber(n) - end - end - end - - create_body.Hostname = network ~= "host" and (hostname or name) or nil - create_body.Tty = tty and true or false - create_body.OpenStdin = interactive and true or false - create_body.User = user - create_body.Cmd = command - create_body.Env = env - create_body.Image = image - create_body.ExposedPorts = exposedports - create_body.HostConfig = create_body.HostConfig or {} - create_body.HostConfig.Dns = dns - create_body.HostConfig.Binds = volume - create_body.HostConfig.RestartPolicy = { Name = restart, MaximumRetryCount = 0 } - create_body.HostConfig.Privileged = privileged and true or false - create_body.HostConfig.PortBindings = portbindings - create_body.HostConfig.Memory = memory and tonumber(memory) - create_body.HostConfig.CpuShares = cpu_shares and tonumber(cpu_shares) - create_body.HostConfig.NanoCPUs = cpus and tonumber(cpus) * 10 ^ 9 - create_body.HostConfig.BlkioWeight = blkio_weight and tonumber(blkio_weight) - create_body.HostConfig.PublishAllPorts = publish_all - - if create_body.HostConfig.NetworkMode ~= network then - create_body.NetworkingConfig = nil - end - - create_body.HostConfig.NetworkMode = network - - if ip then - if create_body.NetworkingConfig and create_body.NetworkingConfig.EndpointsConfig and type(create_body.NetworkingConfig.EndpointsConfig) == "table" then - for k, v in pairs (create_body.NetworkingConfig.EndpointsConfig) do - if k == network and v.IPAMConfig and v.IPAMConfig.IPv4Address then - v.IPAMConfig.IPv4Address = ip - else - create_body.NetworkingConfig.EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } - end - break - end - else - create_body.NetworkingConfig = { EndpointsConfig = { [network] = { IPAMConfig = { IPv4Address = ip } } } } - end - elseif not create_body.NetworkingConfig then - create_body.NetworkingConfig = nil - end - - create_body["HostConfig"]["Tmpfs"] = tmpfs - create_body["HostConfig"]["Devices"] = device - create_body["HostConfig"]["Sysctls"] = sysctl - create_body["HostConfig"]["CapAdd"] = cap_add - create_body["HostConfig"]["LogConfig"] = { - Config = log_opt, - Type = log_driver - } - - if network == "bridge" then - create_body["HostConfig"]["Links"] = link - end - - local pull_image = function(image) - local json_stringify = luci.jsonc and luci.jsonc.stringify - docker:append_status("Images: " .. "pulling" .. " " .. image .. "...\n") - local res = dk.images:create({query = {fromImage=image}}, docker.pull_image_show_status_cb) - if res and res.code and res.code == 200 and (res.body[#res.body] and not res.body[#res.body].error and res.body[#res.body].status and (res.body[#res.body].status == "Status: Downloaded newer image for ".. image or res.body[#res.body].status == "Status: Image is up to date for ".. image)) then - docker:append_status("done\n") - else - res.code = (res.code == 200) and 500 or res.code - docker:append_status("code:" .. res.code.." ".. (res.body[#res.body] and res.body[#res.body].error or (res.body.message or res.message)).. "\n") - luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer")) - end - end - - docker:clear_status() - local exist_image = false - - if image then - for _, v in ipairs (images) do - if v.RepoTags and v.RepoTags[1] == image then - exist_image = true - break - end - end - if not exist_image then - pull_image(image) - elseif data._force_pull == 1 then - pull_image(image) - end - end - - create_body = docker.clear_empty_tables(create_body) - - docker:append_status("Container: " .. "create" .. " " .. name .. "...") - local res = dk.containers:create({name = name, body = create_body}) - if res and res.code and res.code == 201 then - docker:clear_status() - luci.http.redirect(luci.dispatcher.build_url("admin/docker/containers")) - else - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message)) - luci.http.redirect(luci.dispatcher.build_url("admin/docker/newcontainer")) - end -end - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua deleted file mode 100755 index c87678b85..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua +++ /dev/null @@ -1,258 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" - -local m, s, o - -local dk = docker.new() -if dk:_ping().code ~= 200 then - lost_state = true -end - -m = SimpleForm("docker", translate("Docker - Network")) -m.redirect = luci.dispatcher.build_url("admin", "docker", "networks") -if lost_state then - m.submit=false - m.reset=false -end - - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err=docker:read_status() -s.err=s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(SimpleSection, translate("Create new docker network")) -s.addremove = true -s.anonymous = true - -o = s:option(Value, "name", - translate("Network Name"), - translate("Name of the network that can be selected during container creation")) -o.rmempty = true - -o = s:option(ListValue, "driver", translate("Driver")) -o.rmempty = true -o:value("bridge", translate("Bridge device")) -o:value("macvlan", translate("MAC VLAN")) -o:value("ipvlan", translate("IP VLAN")) -o:value("overlay", translate("Overlay network")) - -o = s:option(Value, "parent", translate("Base device")) -o.rmempty = true -o:depends("driver", "macvlan") -local interfaces = luci.sys and luci.sys.net and luci.sys.net.devices() or {} -for _, v in ipairs(interfaces) do - o:value(v, v) -end -o.default="br-lan" -o.placeholder="br-lan" - -o = s:option(ListValue, "macvlan_mode", translate("Mode")) -o.rmempty = true -o:depends("driver", "macvlan") -o.default="bridge" -o:value("bridge", translate("Bridge (Support direct communication between MAC VLANs)")) -o:value("private", translate("Private (Prevent communication between MAC VLANs)")) -o:value("vepa", translate("VEPA (Virtual Ethernet Port Aggregator)")) -o:value("passthru", translate("Pass-through (Mirror physical device to single MAC VLAN)")) - -o = s:option(ListValue, "ipvlan_mode", translate("Ipvlan Mode")) -o.rmempty = true -o:depends("driver", "ipvlan") -o.default="l3" -o:value("l2", translate("L2 bridge")) -o:value("l3", translate("L3 bridge")) - -o = s:option(Flag, "ingress", - translate("Ingress"), - translate("Ingress network is the network which provides the routing-mesh in swarm mode")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = 0 -o:depends("driver", "overlay") - -o = s:option(DynamicList, "options", translate("Options")) -o.rmempty = true -o.placeholder="com.docker.network.driver.mtu=1500" - -o = s:option(Flag, "internal", translate("Internal"), translate("Restrict external access to the network")) -o.rmempty = true -o:depends("driver", "overlay") -o.disabled = 0 -o.enabled = 1 -o.default = 0 - -if nixio.fs.access("/etc/config/network") and nixio.fs.access("/etc/config/firewall")then - o = s:option(Flag, "op_macvlan", translate("Create macvlan interface"), translate("Auto create macvlan interface in Openwrt")) - o:depends("driver", "macvlan") - o.disabled = 0 - o.enabled = 1 - o.default = 1 -end - -o = s:option(Value, "subnet", translate("Subnet")) -o.rmempty = true -o.placeholder="10.1.0.0/16" -o.datatype="ip4addr" - -o = s:option(Value, "gateway", translate("Gateway")) -o.rmempty = true -o.placeholder="10.1.1.1" -o.datatype="ip4addr" - -o = s:option(Value, "ip_range", translate("IP range")) -o.rmempty = true -o.placeholder="10.1.1.0/24" -o.datatype="ip4addr" - -o = s:option(DynamicList, "aux_address", translate("Exclude IPs")) -o.rmempty = true -o.placeholder="my-route=10.1.1.1" - -o = s:option(Flag, "ipv6", translate("Enable IPv6")) -o.rmempty = true -o.disabled = 0 -o.enabled = 1 -o.default = 0 - -o = s:option(Value, "subnet6", translate("IPv6 Subnet")) -o.rmempty = true -o.placeholder="fe80::/10" -o.datatype="ip6addr" -o:depends("ipv6", 1) - -o = s:option(Value, "gateway6", translate("IPv6 Gateway")) -o.rmempty = true -o.placeholder="fe80::1" -o.datatype="ip6addr" -o:depends("ipv6", 1) - -m.handle = function(self, state, data) - if state == FORM_VALID then - local name = data.name - local driver = data.driver - - local internal = data.internal == 1 and true or false - - local subnet = data.subnet - local gateway = data.gateway - local ip_range = data.ip_range - - local aux_address = {} - local tmp = data.aux_address or {} - for i,v in ipairs(tmp) do - _,_,k1,v1 = v:find("(.-)=(.+)") - aux_address[k1] = v1 - end - - local options = {} - tmp = data.options or {} - for i,v in ipairs(tmp) do - _,_,k1,v1 = v:find("(.-)=(.+)") - options[k1] = v1 - end - - local ipv6 = data.ipv6 == 1 and true or false - - local create_body = { - Name = name, - Driver = driver, - EnableIPv6 = ipv6, - IPAM = { - Driver= "default" - }, - Internal = internal - } - - if subnet or gateway or ip_range then - create_body["IPAM"]["Config"] = { - { - Subnet = subnet, - Gateway = gateway, - IPRange = ip_range, - AuxAddress = aux_address, - AuxiliaryAddresses = aux_address - } - } - end - - if driver == "macvlan" then - create_body["Options"] = { - macvlan_mode = data.macvlan_mode, - parent = data.parent - } - elseif driver == "ipvlan" then - create_body["Options"] = { - ipvlan_mode = data.ipvlan_mode - } - elseif driver == "overlay" then - create_body["Ingress"] = data.ingerss == 1 and true or false - end - - if ipv6 and data.subnet6 and data.subnet6 then - if type(create_body["IPAM"]["Config"]) ~= "table" then - create_body["IPAM"]["Config"] = {} - end - local index = #create_body["IPAM"]["Config"] - create_body["IPAM"]["Config"][index+1] = { - Subnet = data.subnet6, - Gateway = data.gateway6 - } - end - - if next(options) ~= nil then - create_body["Options"] = create_body["Options"] or {} - for k, v in pairs(options) do - create_body["Options"][k] = v - end - end - - create_body = docker.clear_empty_tables(create_body) - docker:write_status("Network: " .. "create" .. " " .. create_body.Name .. "...") - - local res = dk.networks:create({ - body = create_body - }) - - if res and res.code == 201 then - docker:write_status("Network: " .. "create macvlan interface...") - res = dk.networks:inspect({ - name = create_body.Name - }) - - if driver == "macvlan" and - data.op_macvlan ~= 0 and - res and - res.code and - res.code == 200 and - res.body and - res.body.IPAM and - res.body.IPAM.Config and - res.body.IPAM.Config[1] and - res.body.IPAM.Config[1].Gateway and - res.body.IPAM.Config[1].Subnet then - - docker.create_macvlan_interface(data.name, - data.parent, - res.body.IPAM.Config[1].Gateway, - res.body.IPAM.Config[1].Subnet) - end - - docker:clear_status() - luci.http.redirect(luci.dispatcher.build_url("admin/docker/networks")) - else - docker:append_status("code:" .. res.code.." ".. (res.body.message and res.body.message or res.message).. "\n") - luci.http.redirect(luci.dispatcher.build_url("admin/docker/newnetwork")) - end - end -end - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua deleted file mode 100755 index c91f349ce..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua +++ /dev/null @@ -1,151 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" -local uci = (require "luci.model.uci").cursor() - -local m, s, o, lost_state -local dk = docker.new() - -if dk:_ping().code ~= 200 then - lost_state = true -end - -m = SimpleForm("dockerd", - translate("Docker - Overview"), - translate("An overview with the relevant data is displayed here with which the LuCI docker client is connected.") -.. - " " .. - [[]] .. - translate("Github") .. - [[]]) -m.submit=false -m.reset=false - -local docker_info_table = {} --- docker_info_table['0OperatingSystem'] = {_key=translate("Operating System"),_value='-'} --- docker_info_table['1Architecture'] = {_key=translate("Architecture"),_value='-'} --- docker_info_table['2KernelVersion'] = {_key=translate("Kernel Version"),_value='-'} -docker_info_table['3ServerVersion'] = {_key=translate("Docker Version"),_value='-'} -docker_info_table['4ApiVersion'] = {_key=translate("Api Version"),_value='-'} -docker_info_table['5NCPU'] = {_key=translate("CPUs"),_value='-'} -docker_info_table['6MemTotal'] = {_key=translate("Total Memory"),_value='-'} -docker_info_table['7DockerRootDir'] = {_key=translate("Docker Root Dir"),_value='-'} -docker_info_table['8IndexServerAddress'] = {_key=translate("Index Server Address"),_value='-'} -docker_info_table['9RegistryMirrors'] = {_key=translate("Registry Mirrors"),_value='-'} - -if nixio.fs.access("/usr/bin/dockerd") and not uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - s = m:section(SimpleSection) - s.template = "dockerman/apply_widget" - s.err=docker:read_status() - s.err=s.err and s.err:gsub("\n","
"):gsub(" "," ") - if s.err then - docker:clear_status() - end - s = m:section(Table,{{}}) - s.notitle=true - s.rowcolors=false - s.template = "cbi/nullsection" - - o = s:option(Button, "_start") - o.template = "dockerman/cbi/inlinebutton" - o.inputtitle = lost_state and translate("Start") or translate("Stop") - o.inputstyle = lost_state and "add" or "remove" - o.forcewrite = true - o.write = function(self, section) - docker:clear_status() - - if lost_state then - docker:append_status("Docker daemon: starting") - luci.util.exec("/etc/init.d/dockerd start") - luci.util.exec("sleep 5") - luci.util.exec("/etc/init.d/dockerman start") - - else - docker:append_status("Docker daemon: stopping") - luci.util.exec("/etc/init.d/dockerd stop") - end - docker:clear_status() - luci.http.redirect(luci.dispatcher.build_url("admin/docker/overview")) - end - - o = s:option(Button, "_restart") - o.template = "dockerman/cbi/inlinebutton" - o.inputtitle = translate("Restart") - o.inputstyle = "reload" - o.forcewrite = true - o.write = function(self, section) - docker:clear_status() - docker:append_status("Docker daemon: restarting") - luci.util.exec("/etc/init.d/dockerd restart") - luci.util.exec("sleep 5") - luci.util.exec("/etc/init.d/dockerman start") - docker:clear_status() - luci.http.redirect(luci.dispatcher.build_url("admin/docker/overview")) - end -end - -s = m:section(Table, docker_info_table) -s:option(DummyValue, "_key", translate("Info")) -s:option(DummyValue, "_value") - -s = m:section(SimpleSection) -s.template = "dockerman/overview" - -s.containers_running = '-' -s.images_used = '-' -s.containers_total = '-' -s.images_total = '-' -s.networks_total = '-' -s.volumes_total = '-' - --- local socket = luci.model.uci.cursor():get("dockerd", "dockerman", "socket_path") -if not lost_state then - local containers_list = dk.containers:list({query = {all=true}}).body - local images_list = dk.images:list().body - local vol = dk.volumes:list() - local volumes_list = vol and vol.body and vol.body.Volumes or {} - local networks_list = dk.networks:list().body or {} - local docker_info = dk:info() - - -- docker_info_table['0OperatingSystem']._value = docker_info.body.OperatingSystem - -- docker_info_table['1Architecture']._value = docker_info.body.Architecture - -- docker_info_table['2KernelVersion']._value = docker_info.body.KernelVersion - docker_info_table['3ServerVersion']._value = docker_info.body.ServerVersion - docker_info_table['4ApiVersion']._value = docker_info.headers["Api-Version"] - docker_info_table['5NCPU']._value = tostring(docker_info.body.NCPU) - docker_info_table['6MemTotal']._value = docker.byte_format(docker_info.body.MemTotal) - if docker_info.body.DockerRootDir then - local statvfs = nixio.fs.statvfs(docker_info.body.DockerRootDir) - local size = statvfs and (statvfs.bavail * statvfs.bsize) or 0 - docker_info_table['7DockerRootDir']._value = docker_info.body.DockerRootDir .. " (" .. tostring(docker.byte_format(size)) .. " " .. translate("Available") .. ")" - end - - docker_info_table['8IndexServerAddress']._value = docker_info.body.IndexServerAddress - for i, v in ipairs(docker_info.body.RegistryConfig.Mirrors) do - docker_info_table['9RegistryMirrors']._value = docker_info_table['9RegistryMirrors']._value == "-" and v or (docker_info_table['9RegistryMirrors']._value .. ", " .. v) - end - - s.images_used = 0 - for i, v in ipairs(images_list) do - for ci,cv in ipairs(containers_list) do - if v.Id == cv.ImageID then - s.images_used = s.images_used + 1 - break - end - end - end - - s.containers_running = tostring(docker_info.body.ContainersRunning) - s.images_used = tostring(s.images_used) - s.containers_total = tostring(docker_info.body.Containers) - s.images_total = tostring(#images_list) - s.networks_total = tostring(#networks_list) - s.volumes_total = tostring(#volumes_list) -else - docker_info_table['3ServerVersion']._value = translate("Can NOT connect to docker daemon, please check!!") -end - -return m diff --git a/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua b/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua deleted file mode 100755 index 43e6bda3a..000000000 --- a/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua +++ /dev/null @@ -1,142 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.model.docker" -local dk = docker.new() - -local m, s, o - -local res, containers, volumes, lost_state - -function get_volumes() - local data = {} - for i, v in ipairs(volumes) do - local index = v.Name - data[index]={} - data[index]["_selected"] = 0 - data[index]["_nameraw"] = v.Name - data[index]["_name"] = v.Name:sub(1,12) - - for ci,cv in ipairs(containers) do - if cv.Mounts and type(cv.Mounts) ~= "table" then - break - end - for vi, vv in ipairs(cv.Mounts) do - if v.Name == vv.Name then - data[index]["_containers"] = (data[index]["_containers"] and (data[index]["_containers"] .. " | ") or "").. - ''.. cv.Names[1]:sub(2)..'' - end - end - end - data[index]["_driver"] = v.Driver - data[index]["_mountpoint"] = nil - - for v1 in v.Mountpoint:gmatch('[^/]+') do - if v1 == index then - data[index]["_mountpoint"] = data[index]["_mountpoint"] .."/" .. v1:sub(1,12) .. "..." - else - data[index]["_mountpoint"] = (data[index]["_mountpoint"] and data[index]["_mountpoint"] or "").."/".. v1 - end - end - data[index]["_created"] = v.CreatedAt - data[index]["_size"] = "-" - end - - return data -end -if dk:_ping().code ~= 200 then - lost_state = true -else - res = dk.volumes:list() - if res and res.code and res.code <300 then - volumes = res.body.Volumes - end - - res = dk.containers:list({ - query = { - all=true - } - }) - if res and res.code and res.code <300 then - containers = res.body - end -end - -local volume_list = not lost_state and get_volumes() or {} - -m = SimpleForm("docker", translate("Docker - Volumes")) -m.submit=false -m.reset=false -m:append(Template("dockerman/volume_size")) - -s = m:section(Table, volume_list, translate("Volumes overview")) - -o = s:option(Flag, "_selected","") -o.disabled = 0 -o.enabled = 1 -o.default = 0 -o.write = function(self, section, value) - volume_list[section]._selected = value -end - -o = s:option(DummyValue, "_name", translate("Name")) -o = s:option(DummyValue, "_driver", translate("Driver")) -o = s:option(DummyValue, "_containers", translate("Containers")) -o.rawhtml = true -o = s:option(DummyValue, "_mountpoint", translate("Mount Point")) -o = s:option(DummyValue, "_size", translate("Size")) -o.rawhtml = true -o = s:option(DummyValue, "_created", translate("Created")) - -s = m:section(SimpleSection) -s.template = "dockerman/apply_widget" -s.err=docker:read_status() -s.err=s.err and s.err:gsub("\n","
"):gsub(" "," ") -if s.err then - docker:clear_status() -end - -s = m:section(Table,{{}}) -s.notitle=true -s.rowcolors=false -s.template="cbi/nullsection" - -o = s:option(Button, "remove") -o.inputtitle= translate("Remove") -o.template = "dockerman/cbi/inlinebutton" -o.inputstyle = "remove" -o.forcewrite = true -o.disable = lost_state -o.write = function(self, section) - local volume_selected = {} - - for k in pairs(volume_list) do - if volume_list[k]._selected == 1 then - volume_selected[#volume_selected+1] = k - end - end - - if next(volume_selected) ~= nil then - local success = true - docker:clear_status() - for _,vol in ipairs(volume_selected) do - docker:append_status("Volumes: " .. "remove" .. " " .. vol .. "...") - local msg = dk.volumes["remove"](dk, {id = vol}) - if msg and msg.code and msg.code ~= 204 then - docker:append_status("code:" .. msg.code.." ".. (msg.body.message and msg.body.message or msg.message).. "\n") - success = false - else - docker:append_status("done\n") - end - end - - if success then - docker:clear_status() - end - luci.http.redirect(luci.dispatcher.build_url("admin/docker/volumes")) - end -end - -return m diff --git a/luci-app-dockerman/luasrc/model/docker.lua b/luci-app-dockerman/luasrc/model/docker.lua deleted file mode 100755 index 2a902912a..000000000 --- a/luci-app-dockerman/luasrc/model/docker.lua +++ /dev/null @@ -1,507 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface -Copyright 2019 lisaac -]]-- - -local docker = require "luci.docker" -local fs = require "nixio.fs" -local uci = (require "luci.model.uci").cursor() - -local _docker = {} -_docker.options = {} - ---pull image and return iamge id -local update_image = function(self, image_name) - local json_stringify = luci.jsonc and luci.jsonc.stringify - _docker:append_status("Images: " .. "pulling" .. " " .. image_name .. "...\n") - local res = self.images:create({query = {fromImage=image_name}}, _docker.pull_image_show_status_cb) - - if res and res.code and res.code == 200 and (#res.body > 0 and not res.body[#res.body].error and res.body[#res.body].status and (res.body[#res.body].status == "Status: Downloaded newer image for ".. image_name)) then - _docker:append_status("done\n") - else - res.body.message = res.body[#res.body] and res.body[#res.body].error or (res.body.message or res.message) - end - - new_image_id = self.images:inspect({name = image_name}).body.Id - return new_image_id, res -end - -local table_equal = function(t1, t2) - if not t1 then - return true - end - - if not t2 then - return false - end - - if #t1 ~= #t2 then - return false - end - - for i, v in ipairs(t1) do - if t1[i] ~= t2[i] then - return false - end - end - - return true -end - -local table_subtract = function(t1, t2) - if not t1 or next(t1) == nil then - return nil - end - - if not t2 or next(t2) == nil then - return t1 - end - - local res = {} - for _, v1 in ipairs(t1) do - local found = false - for _, v2 in ipairs(t2) do - if v1 == v2 then - found= true - break - end - end - if not found then - table.insert(res, v1) - end - end - - return next(res) == nil and nil or res -end - -local map_subtract = function(t1, t2) - if not t1 or next(t1) == nil then - return nil - end - - if not t2 or next(t2) == nil then - return t1 - end - - local res = {} - for k1, v1 in pairs(t1) do - local found = false - for k2, v2 in ipairs(t2) do - if k1 == k2 and luci.util.serialize_data(v1) == luci.util.serialize_data(v2) then - found= true - break - end - end - - if not found then - res[k1] = v1 - end - end - - return next(res) ~= nil and res or nil -end - -_docker.clear_empty_tables = function ( t ) - local k, v - - if next(t) == nil then - t = nil - else - for k, v in pairs(t) do - if type(v) == 'table' then - t[k] = _docker.clear_empty_tables(v) - if t[k] and next(t[k]) == nil then - t[k] = nil - end - end - end - end - - return t -end - -local get_config = function(container_config, image_config) - local config = container_config.Config - local old_host_config = container_config.HostConfig - local old_network_setting = container_config.NetworkSettings.Networks or {} - - if config.WorkingDir == image_config.WorkingDir then - config.WorkingDir = "" - end - - if config.User == image_config.User then - config.User = "" - end - - if table_equal(config.Cmd, image_config.Cmd) then - config.Cmd = nil - end - - if table_equal(config.Entrypoint, image_config.Entrypoint) then - config.Entrypoint = nil - end - - if table_equal(config.ExposedPorts, image_config.ExposedPorts) then - config.ExposedPorts = nil - end - - config.Env = table_subtract(config.Env, image_config.Env) - config.Labels = table_subtract(config.Labels, image_config.Labels) - config.Volumes = map_subtract(config.Volumes, image_config.Volumes) - - if old_host_config.PortBindings and next(old_host_config.PortBindings) ~= nil then - config.ExposedPorts = {} - for p, v in pairs(old_host_config.PortBindings) do - config.ExposedPorts[p] = { HostPort=v[1] and v[1].HostPort } - end - end - - local network_setting = {} - local multi_network = false - local extra_network = {} - - for k, v in pairs(old_network_setting) do - if multi_network then - extra_network[k] = v - else - network_setting[k] = v - end - multi_network = true - end - - local host_config = old_host_config - host_config.Mounts = {} - for i, v in ipairs(container_config.Mounts) do - if v.Type == "volume" then - table.insert(host_config.Mounts, { - Type = v.Type, - Target = v.Destination, - Source = v.Source:match("([^/]+)\/_data"), - BindOptions = (v.Type == "bind") and {Propagation = v.Propagation} or nil, - ReadOnly = not v.RW - }) - end - end - - local create_body = config - create_body["HostConfig"] = host_config - create_body["NetworkingConfig"] = {EndpointsConfig = network_setting} - create_body = _docker.clear_empty_tables(create_body) or {} - extra_network = _docker.clear_empty_tables(extra_network) or {} - - return create_body, extra_network -end - -local upgrade = function(self, request) - _docker:clear_status() - - local container_info = self.containers:inspect({id = request.id}) - - if container_info.code > 300 and type(container_info.body) == "table" then - return container_info - end - - local image_name = container_info.body.Config.Image - if not image_name:match(".-:.+") then - image_name = image_name .. ":latest" - end - - local old_image_id = container_info.body.Image - local container_name = container_info.body.Name:sub(2) - - local image_id, res = update_image(self, image_name) - if res and res.code and res.code ~= 200 then - return res - end - - if image_id == old_image_id then - return {code = 305, body = {message = "Already up to date"}} - end - - local t = os.date("%Y%m%d%H%M%S") - _docker:append_status("Container: rename" .. " " .. container_name .. " to ".. container_name .. "_old_".. t .. "...") - res = self.containers:rename({name = container_name, query = { name = container_name .. "_old_" ..t }}) - if res and res.code and res.code < 300 then - _docker:append_status("done\n") - else - return res - end - - local image_config = self.images:inspect({id = old_image_id}).body.Config - local create_body, extra_network = get_config(container_info.body, image_config) - - -- create new container - _docker:append_status("Container: Create" .. " " .. container_name .. "...") - create_body = _docker.clear_empty_tables(create_body) - res = self.containers:create({name = container_name, body = create_body}) - if res and res.code and res.code > 300 then - return res - end - _docker:append_status("done\n") - - -- extra networks need to network connect action - for k, v in pairs(extra_network) do - _docker:append_status("Networks: Connect" .. " " .. container_name .. "...") - res = self.networks:connect({id = k, body = {Container = container_name, EndpointConfig = v}}) - if res and res.code and res.code > 300 then - return res - end - _docker:append_status("done\n") - end - - _docker:append_status("Container: " .. "Stop" .. " " .. container_name .. "_old_".. t .. "...") - res = self.containers:stop({name = container_name .. "_old_" ..t }) - if res and res.code and res.code < 305 then - _docker:append_status("done\n") - else - return res - end - - _docker:append_status("Container: " .. "Start" .. " " .. container_name .. "...") - res = self.containers:start({name = container_name}) - if res and res.code and res.code < 305 then - _docker:append_status("done\n") - else - return res - end - - _docker:clear_status() - return res -end - -local duplicate_config = function (self, request) - local container_info = self.containers:inspect({id = request.id}) - if container_info.code > 300 and type(container_info.body) == "table" then - return nil - end - - local old_image_id = container_info.body.Image - local image_config = self.images:inspect({id = old_image_id}).body.Config - - return get_config(container_info.body, image_config) -end - -_docker.new = function() - local host = nil - local port = nil - local socket_path = nil - local debug_path = nil - - if uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - host = uci:get("dockerd", "dockerman", "remote_host") or nil - port = uci:get("dockerd", "dockerman", "remote_port") or nil - else - socket_path = uci:get("dockerd", "dockerman", "socket_path") or "/var/run/docker.sock" - end - - local debug = uci:get_bool("dockerd", "dockerman", "debug") - if debug then - debug_path = uci:get("dockerd", "dockerman", "debug_path") or "/tmp/.docker_debug" - end - - local status_path = uci:get("dockerd", "dockerman", "status_path") or "/tmp/.docker_action_status" - - _docker.options = { - host = host, - port = port, - socket_path = socket_path, - debug = debug, - debug_path = debug_path, - status_path = status_path - } - - local _new = docker.new(_docker.options) - _new.containers_upgrade = upgrade - _new.containers_duplicate_config = duplicate_config - - return _new -end - -_docker.options.status_path = uci:get("dockerd", "dockerman", "status_path") or "/tmp/.docker_action_status" - -_docker.append_status=function(self,val) - if not val then - return - end - local file_docker_action_status=io.open(self.options.status_path, "a+") - file_docker_action_status:write(val) - file_docker_action_status:close() -end - -_docker.write_status=function(self,val) - if not val then - return - end - local file_docker_action_status=io.open(self.options.status_path, "w+") - file_docker_action_status:write(val) - file_docker_action_status:close() -end - -_docker.read_status=function(self) - return fs.readfile(self.options.status_path) -end - -_docker.clear_status=function(self) - fs.remove(self.options.status_path) -end - -local status_cb = function(res, source, handler) - res.body = res.body or {} - while true do - local chunk = source() - if chunk then - --standard output to res.body - table.insert(res.body, chunk) - handler(chunk) - else - return - end - end -end - ---{"status":"Pulling from library\/debian","id":"latest"} ---{"status":"Pulling fs layer","progressDetail":[],"id":"50e431f79093"} ---{"status":"Downloading","progressDetail":{"total":50381971,"current":2029978},"id":"50e431f79093","progress":"[==> ] 2.03MB\/50.38MB"} ---{"status":"Download complete","progressDetail":[],"id":"50e431f79093"} ---{"status":"Extracting","progressDetail":{"total":50381971,"current":17301504},"id":"50e431f79093","progress":"[=================> ] 17.3MB\/50.38MB"} ---{"status":"Pull complete","progressDetail":[],"id":"50e431f79093"} ---{"status":"Digest: sha256:a63d0b2ecbd723da612abf0a8bdb594ee78f18f691d7dc652ac305a490c9b71a"} ---{"status":"Status: Downloaded newer image for debian:latest"} -_docker.pull_image_show_status_cb = function(res, source) - return status_cb(res, source, function(chunk) - local json_parse = luci.jsonc.parse - local step = json_parse(chunk) - if type(step) == "table" then - local buf = _docker:read_status() - local num = 0 - local str = '\t' .. (step.id and (step.id .. ": ") or "") .. (step.status and step.status or "") .. (step.progress and (" " .. step.progress) or "").."\n" - if step.id then - buf, num = buf:gsub("\t"..step.id .. ": .-\n", str) - end - if num == 0 then - buf = buf .. str - end - _docker:write_status(buf) - end - end) -end - ---{"status":"Downloading from https://downloads.openwrt.org/releases/19.07.0/targets/x86/64/openwrt-19.07.0-x86-64-generic-rootfs.tar.gz"} ---{"status":"Importing","progressDetail":{"current":1572391,"total":3821714},"progress":"[====================\u003e ] 1.572MB/3.822MB"} ---{"status":"sha256:d5304b58e2d8cc0a2fd640c05cec1bd4d1229a604ac0dd2909f13b2b47a29285"} -_docker.import_image_show_status_cb = function(res, source) - return status_cb(res, source, function(chunk) - local json_parse = luci.jsonc.parse - local step = json_parse(chunk) - if type(step) == "table" then - local buf = _docker:read_status() - local num = 0 - local str = '\t' .. (step.status and step.status or "") .. (step.progress and (" " .. step.progress) or "").."\n" - if step.status then - buf, num = buf:gsub("\t"..step.status .. " .-\n", str) - end - if num == 0 then - buf = buf .. str - end - _docker:write_status(buf) - end - end) -end - -_docker.create_macvlan_interface = function(name, device, gateway, subnet) - if not fs.access("/etc/config/network") or not fs.access("/etc/config/firewall") then - return - end - - if uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - return - end - - local ip = require "luci.ip" - local if_name = "docker_"..name - local dev_name = "macvlan_"..name - local net_mask = tostring(ip.new(subnet):mask()) - local lan_interfaces - - -- add macvlan device - uci:delete("network", dev_name) - uci:set("network", dev_name, "device") - uci:set("network", dev_name, "name", dev_name) - uci:set("network", dev_name, "ifname", device) - uci:set("network", dev_name, "type", "macvlan") - uci:set("network", dev_name, "mode", "bridge") - - -- add macvlan interface - uci:delete("network", if_name) - uci:set("network", if_name, "interface") - uci:set("network", if_name, "proto", "static") - uci:set("network", if_name, "ifname", dev_name) - uci:set("network", if_name, "ipaddr", gateway) - uci:set("network", if_name, "netmask", net_mask) - uci:foreach("firewall", "zone", function(s) - if s.name == "lan" then - local interfaces - if type(s.network) == "table" then - interfaces = table.concat(s.network, " ") - uci:delete("firewall", s[".name"], "network") - else - interfaces = s.network and s.network or "" - end - interfaces = interfaces .. " " .. if_name - interfaces = interfaces:gsub("%s+", " ") - uci:set("firewall", s[".name"], "network", interfaces) - end - end) - - uci:commit("firewall") - uci:commit("network") - - os.execute("ifup " .. if_name) -end - -_docker.remove_macvlan_interface = function(name) - if not fs.access("/etc/config/network") or not fs.access("/etc/config/firewall") then - return - end - - if uci:get_bool("dockerd", "dockerman", "remote_endpoint") then - return - end - - local if_name = "docker_"..name - local dev_name = "macvlan_"..name - uci:foreach("firewall", "zone", function(s) - if s.name == "lan" then - local interfaces - if type(s.network) == "table" then - interfaces = table.concat(s.network, " ") - else - interfaces = s.network and s.network or "" - end - interfaces = interfaces and interfaces:gsub(if_name, "") - interfaces = interfaces and interfaces:gsub("%s+", " ") - uci:set("firewall", s[".name"], "network", interfaces) - end - end) - - uci:delete("network", dev_name) - uci:delete("network", if_name) - uci:commit("network") - uci:commit("firewall") - - os.execute("ip link del " .. if_name) -end - -_docker.byte_format = function (byte) - if not byte then return 'NaN' end - local suff = {"B", "KB", "MB", "GB", "TB"} - for i=1, 5 do - if byte > 1024 and i < 5 then - byte = byte / 1024 - else - return string.format("%.2f %s", byte, suff[i]) - end - end -end - -return _docker diff --git a/luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm b/luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm deleted file mode 100755 index f96b2d72a..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm +++ /dev/null @@ -1,147 +0,0 @@ - - - diff --git a/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinebutton.htm b/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinebutton.htm deleted file mode 100755 index a061a6dba..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinebutton.htm +++ /dev/null @@ -1,7 +0,0 @@ -
- <% if self:cfgvalue(section) ~= false then %> - " type="submit"" <% if self.disable then %>disabled <% end %><%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> - <% else %> - - - <% end %> -
diff --git a/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm b/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm deleted file mode 100755 index e4b0cf7a0..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm +++ /dev/null @@ -1,33 +0,0 @@ -
- - <%- if self.password then -%> - /> - <%- end -%> - 0, "data-choices", { self.keylist, self.vallist }) - %> /> - <%- if self.password then -%> -
- <% end %> -
diff --git a/luci-app-dockerman/luasrc/view/dockerman/cbi/namedsection.htm b/luci-app-dockerman/luasrc/view/dockerman/cbi/namedsection.htm deleted file mode 100755 index 244d2c10a..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/cbi/namedsection.htm +++ /dev/null @@ -1,9 +0,0 @@ -<% if self:cfgvalue(self.section) then section = self.section %> -
- <%+cbi/tabmenu%> -
- <%+cbi/ucisection%> -
-
-<% end %> - diff --git a/luci-app-dockerman/luasrc/view/dockerman/cbi/xfvalue.htm b/luci-app-dockerman/luasrc/view/dockerman/cbi/xfvalue.htm deleted file mode 100755 index 04f7bc2ee..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/cbi/xfvalue.htm +++ /dev/null @@ -1,10 +0,0 @@ -<%+cbi/valueheader%> - /> - disabled <% end %><%= - attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) .. - ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked") - %> /> - > -<%+cbi/valuefooter%> diff --git a/luci-app-dockerman/luasrc/view/dockerman/container.htm b/luci-app-dockerman/luasrc/view/dockerman/container.htm deleted file mode 100755 index 9f05d9d58..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/container.htm +++ /dev/null @@ -1,28 +0,0 @@ -
- - - diff --git a/luci-app-dockerman/luasrc/view/dockerman/container_console.htm b/luci-app-dockerman/luasrc/view/dockerman/container_console.htm deleted file mode 100755 index 1a4dc2a6b..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/container_console.htm +++ /dev/null @@ -1,6 +0,0 @@ -
- -
- diff --git a/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm b/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm deleted file mode 100755 index 2e0650d9d..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm +++ /dev/null @@ -1,332 +0,0 @@ - -
- -
- - -
-
-
- - diff --git a/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm b/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm deleted file mode 100755 index bbcd633e7..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm +++ /dev/null @@ -1,81 +0,0 @@ - diff --git a/luci-app-dockerman/luasrc/view/dockerman/containers_running_stats.htm b/luci-app-dockerman/luasrc/view/dockerman/containers_running_stats.htm deleted file mode 100755 index d88e28be9..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/containers_running_stats.htm +++ /dev/null @@ -1,91 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-dockerman/luasrc/view/dockerman/images_import.htm b/luci-app-dockerman/luasrc/view/dockerman/images_import.htm deleted file mode 100755 index 0ad6e0fce..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/images_import.htm +++ /dev/null @@ -1,104 +0,0 @@ - - -
- disabled <% end %>/> - -
- - diff --git a/luci-app-dockerman/luasrc/view/dockerman/images_load.htm b/luci-app-dockerman/luasrc/view/dockerman/images_load.htm deleted file mode 100755 index b201510ac..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/images_load.htm +++ /dev/null @@ -1,40 +0,0 @@ -
- disabled <% end %>/> - -
- diff --git a/luci-app-dockerman/luasrc/view/dockerman/logs.htm b/luci-app-dockerman/luasrc/view/dockerman/logs.htm deleted file mode 100755 index 6cd2cb095..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/logs.htm +++ /dev/null @@ -1,13 +0,0 @@ -<% if self.title == "Events" then %> -<%+header%> -

<%:Docker - Events%>

-
-

<%:Events%>

-<% end %> -
- -
-<% if self.title == "Events" then %> -
-<%+footer%> -<% end %> diff --git a/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm b/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm deleted file mode 100755 index 338fd59d5..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm +++ /dev/null @@ -1,102 +0,0 @@ - - - -<%+cbi/valueheader%> - - - -<%+cbi/valuefooter%> diff --git a/luci-app-dockerman/luasrc/view/dockerman/overview.htm b/luci-app-dockerman/luasrc/view/dockerman/overview.htm deleted file mode 100755 index e491fc512..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/overview.htm +++ /dev/null @@ -1,197 +0,0 @@ - - -
-
-
-
-
- -
-
-
-

<%:Containers%>

-

- <%- if self.containers_total ~= "-" then -%><%- end -%> - <%=self.containers_running%> - /<%=self.containers_total%> - <%- if self.containers_total ~= "-" then -%><%- end -%> -

-
-
-
-
-
-
-
- -
-
-
-

<%:Images%>

-

- <%- if self.images_total ~= "-" then -%><%- end -%> - <%=self.images_used%> - /<%=self.images_total%> - <%- if self.images_total ~= "-" then -%><%- end -%> -

-
-
-
-
-
-
-
- -
-
-
-

<%:Networks%>

-

- <%- if self.networks_total ~= "-" then -%><%- end -%> - <%=self.networks_total%> - - <%- if self.networks_total ~= "-" then -%><%- end -%> -

-
-
-
-
-
-
-
- -
-
-
-

<%:Volumes%>

-

- <%- if self.volumes_total ~= "-" then -%><%- end -%> - <%=self.volumes_total%> - - <%- if self.volumes_total ~= "-" then -%><%- end -%> -

-
-
-
-
diff --git a/luci-app-dockerman/luasrc/view/dockerman/volume_size.htm b/luci-app-dockerman/luasrc/view/dockerman/volume_size.htm deleted file mode 100755 index dc024734b..000000000 --- a/luci-app-dockerman/luasrc/view/dockerman/volume_size.htm +++ /dev/null @@ -1,21 +0,0 @@ - \ No newline at end of file diff --git a/luci-app-dockerman/po/templates/dockerman.pot b/luci-app-dockerman/po/templates/dockerman.pot deleted file mode 100755 index 0d6a5de98..000000000 --- a/luci-app-dockerman/po/templates/dockerman.pot +++ /dev/null @@ -1,1002 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:619 -msgid "A list of kernel capabilities to add to the container" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:69 -msgid "Access Control" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:223 -msgid "Add" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:595 -msgid "Add host device to the container" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:571 -msgid "Advance" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:586 -msgid "Allocates an ephemeral host port for all of a container's exposed ports" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:118 -msgid "Allowed access interfaces" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:498 -msgid "Always pull image first" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:29 -msgid "" -"An overview with the relevant data is displayed here with which the LuCI " -"docker client is connected." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:43 -msgid "Api Version" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:94 -msgid "Auto create macvlan interface in Openwrt" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:18 -msgid "Auto start" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:134 -msgid "Available" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:47 -msgid "Base device" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:553 -msgid "Bind Mount(-v)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:554 -msgid "Bind mount a volume" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:596 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:652 -msgid "Block IO Weight" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:653 -msgid "" -"Block IO weight (relative weight) accepts a weight value between 10 and 1000" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:597 -msgid "" -"Block IO weight (relative weight) accepts a weight value between 10 and 1000." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:61 -msgid "Bridge (Support direct communication between MAC VLANs)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:42 -msgid "Bridge device" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:84 -msgid "" -"By entering a valid image name with the corresponding version, the docker " -"image can be downloaded from the configured registry." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:618 -msgid "CAP-ADD(--cap-add)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:581 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:635 -msgid "CPU Shares Weight" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:779 -msgid "CPU Useage" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:636 -msgid "" -"CPU shares relative weight, if 0 is set, the system will ignore the value " -"and use the default of 1024" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:582 -msgid "" -"CPU shares relative weight, if 0 is set, the system will ignore the value " -"and use the default of 1024." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:573 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:626 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:44 -msgid "CPUs" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:159 -msgid "Can NOT connect to docker daemon, please check!!" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:91 -msgid "Cancel" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:60 -msgid "Client connection" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:347 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:687 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:182 -msgid "Command" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:100 -msgid "Command line" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:72 -msgid "Command line Error" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:17 -msgid "Configuration" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:36 -msgid "Configure the default bridge network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:405 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:707 -msgid "Connect" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:403 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:437 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:473 -msgid "Connect Network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:74 -msgid "Connect to remote docker endpoint" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:7 -msgid "Console" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:161 -msgid "Container Info" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:650 -msgid "Container Inspect" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:671 -msgid "Container Logs" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:473 -msgid "Container Name" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:92 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:58 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:29 -msgid "Container detail" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:38 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:142 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:148 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:87 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:133 -msgid "Containers" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:94 -msgid "Create macvlan interface" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:465 -msgid "Create new docker container" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:31 -msgid "Create new docker network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:312 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:153 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:92 -msgid "Created" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:33 -msgid "DELETING" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:371 -msgid "DNS" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:51 -msgid "Debug" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:35 -msgid "Default bridge" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:363 -msgid "Device" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:594 -msgid "Device(--device)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:396 -msgid "Disconnect" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:14 -msgid "Docker" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:12 -msgid "Docker - Configuration" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:192 -msgid "Docker - Container (%s)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:128 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:450 -msgid "Docker - Containers" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/logs.htm:3 -msgid "Docker - Events" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:72 -msgid "Docker - Images" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:15 -msgid "Docker - Network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:54 -msgid "Docker - Networks" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:28 -msgid "Docker - Overview" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:69 -msgid "Docker - Volumes" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:16 -msgid "Docker Daemon settings" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:489 -msgid "Docker Image" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:30 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:46 -msgid "Docker Root Dir" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:93 -msgid "Docker Socket Path" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:42 -msgid "Docker Version" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm:91 -msgid "Docker actions done." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:70 -msgid "DockerMan" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:13 -msgid "DockerMan is a simple docker manager client for LuCI" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:68 -msgid "DockerMan settings" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:172 -msgid "Download" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:82 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:40 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:85 -msgid "Driver" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:265 -msgid "Duplicate/Edit" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:120 -msgid "Enable IPv6" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:351 -msgid "Env" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:546 -msgid "Environmental Variable(-e)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:54 -msgid "Error" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:42 -#: applications/luci-app-dockerman/luasrc/view/dockerman/logs.htm:5 -msgid "Events" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:116 -msgid "Exclude IPs" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:247 -msgid "Export" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:585 -msgid "Exposed All Ports(-P)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:560 -msgid "Exposed Ports(-p)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:55 -msgid "Fatal" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:6 -msgid "File" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:324 -msgid "Finish Time" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:220 -msgid "Force Remove" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:88 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:106 -msgid "Gateway" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:33 -msgid "Github" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm:4 -msgid "Go to relevant configuration page" -msgstr "" - -#: applications/luci-app-dockerman/root/usr/share/rpcd/acl.d/luci-app-dockerman.json:3 -msgid "Grant UCI access for luci-app-dockerman" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:330 -msgid "Healthy" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:578 -msgid "Host Name" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:100 -msgid "Host or IP Address for the connection to a remote docker instance" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:300 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:142 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:78 -msgid "ID" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:44 -msgid "IP VLAN" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:111 -msgid "IP range" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:522 -msgid "IPv4 Address" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:132 -msgid "IPv6 Gateway" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:126 -msgid "IPv6 Subnet" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:304 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:54 -msgid "Image" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:39 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:151 -msgid "Images" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:132 -msgid "Images overview" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:4 -msgid "Import" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:125 -msgid "Import Image" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:47 -msgid "Index Server Address" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:52 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:414 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:102 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:3 -msgid "Info" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:74 -msgid "Ingress" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:75 -msgid "" -"Ingress network is the network which provides the routing-mesh in swarm mode" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:8 -msgid "Inspect" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:477 -msgid "Interactive (-i)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:86 -msgid "Internal" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:66 -msgid "Ipvlan Mode" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:43 -msgid "" -"It replaces the daemon registry mirrors with a new set of registry mirrors" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:238 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:264 -msgid "Kill" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:70 -msgid "L2 bridge" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:71 -msgid "L3 bridge" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:359 -msgid "Links" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:527 -msgid "Links with other containers" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:283 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_load.htm:2 -msgid "Load" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:49 -msgid "Log Level" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:661 -msgid "Log driver options" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:9 -msgid "Logs" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:43 -msgid "MAC VLAN" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:589 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:644 -msgid "Memory" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:783 -msgid "Memory Useage" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:645 -msgid "" -"Memory limit (format: []). Number is a positive integer. Unit " -"can be one of b, k, m, or g. Minimum is 4M" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:590 -msgid "" -"Memory limit (format: []). Number is a positive integer. Unit " -"can be one of b, k, m, or g. Minimum is 4M." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:57 -msgid "Mode" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:90 -msgid "Mount Point" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:603 -msgid "Mount tmpfs directory" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:343 -msgid "Mount/Volume" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:175 -msgid "Mounts" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:295 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:419 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:83 -msgid "Name" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:37 -msgid "Name of the network that can be selected during container creation" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:394 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:528 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:169 -msgid "Network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:80 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:36 -msgid "Network Name" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:40 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:518 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:169 -msgid "Networks" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:59 -msgid "Networks overview" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:104 -msgid "New" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:39 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:54 -msgid "New tag" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:627 -msgid "Number of CPUs. Number is a fractional number. 0.000 means no limit" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:574 -msgid "Number of CPUs. Number is a fractional number. 0.000 means no limit." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:73 -msgid "" -"On this page all images are displayed that are available on the system and " -"with which a container can be created." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:193 -msgid "On this page, the selected container can be managed." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:82 -msgid "Options" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:45 -msgid "Overlay network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:37 -msgid "Overview" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:33 -msgid "PLEASE CONFIRM" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:84 -msgid "Parent Interface" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:64 -msgid "Pass-through (Mirror physical device to single MAC VLAN)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:54 -msgid "Please input new tag" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:270 -msgid "Please input the PATH and select the file !" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:82 -msgid "Please input the PORT or HOST IP of remote docker instance!" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:86 -msgid "Please input the SOCKET PATH of docker daemon!" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:91 -msgid "Plese input command line:" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:355 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:172 -msgid "Ports" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:124 -msgid "Ports allowed to be accessed" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:62 -msgid "Private (Prevent communication between MAC VLANs)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:504 -msgid "Privileged" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:561 -msgid "Publish container's port(s) to the host" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:100 -msgid "Pull" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:83 -msgid "Pull Image" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:42 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:48 -msgid "Registry Mirrors" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:73 -msgid "Remote Endpoint" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:99 -msgid "Remote Host" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:106 -msgid "Remote Port" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:274 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:274 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:210 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:115 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:108 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:173 -msgid "Remove" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:43 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:82 -msgid "Remove tag" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:171 -msgid "Rename" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:145 -msgid "RepoTags" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:469 -msgid "Resolve CLI" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:4 -msgid "Resources" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:220 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:244 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:87 -msgid "Restart" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:334 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:427 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:510 -msgid "Restart Policy" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:86 -msgid "Restrict external access to the network" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm:31 -msgid "Reveal/hide password" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:566 -msgid "Run command" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:230 -msgid "Save" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:533 -msgid "Set custom DNS servers" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:547 -msgid "Set environment variables to inside the container" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:50 -msgid "Set the logging level" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:151 -msgid "Size" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:61 -msgid "" -"Specifies where the Docker daemon will listen for client connections " -"(default: unix:///var/run/docker.sock)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:211 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:234 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:65 -msgid "Start" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:319 -msgid "Start Time" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:789 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:790 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:5 -msgid "Stats" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:308 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:165 -msgid "Status" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:229 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:254 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:65 -msgid "Stop" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:91 -msgid "Submit" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:86 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:101 -msgid "Subnet" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:375 -msgid "Sysctl" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:610 -msgid "Sysctl(--sysctl)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:611 -msgid "Sysctls (kernel parameters) options" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:792 -msgid "TOP" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:483 -msgid "TTY (-t)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm:56 -msgid "TX/RX" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:579 -msgid "The hostname to use for the container" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:662 -msgid "The logging configuration for this container" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:540 -msgid "" -"The user that commands are run as inside the container.(format: name|uid[:" -"group|gid])" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:129 -msgid "" -"This page displays all containers that have been created on the connected " -"docker host." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:55 -msgid "" -"This page displays all docker networks that have been created on the " -"connected docker host." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:367 -msgid "Tmpfs" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:602 -msgid "Tmpfs(--tmpfs)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:45 -msgid "Total Memory" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:697 -msgid "UID" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:297 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:336 -msgid "Update" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:256 -msgid "Upgrade" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:7 -msgid "Upload" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:303 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:304 -msgid "Upload Error" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:294 -msgid "Upload Success" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm:48 -msgid "Upload/Download" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:339 -msgid "User" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:539 -msgid "User(-u)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:63 -msgid "VEPA (Virtual Ethernet Port Aggregator)" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:41 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:187 -msgid "Volumes" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:73 -msgid "Volumes overview" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:53 -msgid "Warning" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:126 -msgid "" -"When pressing the Import button, both a local image can be loaded onto the " -"system and a valid image tar can be downloaded from remote." -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:124 -msgid "" -"Which Port(s) can be accessed, it's not restricted by the Allowed Access " -"interfaces configuration. Use this configuration with caution!" -msgstr "" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:118 -msgid "" -"Which interface(s) can access containers under the bridge network, fill-in " -"Interface Name" -msgstr "" diff --git a/luci-app-dockerman/po/zh-cn/dockerman.po b/luci-app-dockerman/po/zh-cn/dockerman.po deleted file mode 100755 index 2bdc11b8d..000000000 --- a/luci-app-dockerman/po/zh-cn/dockerman.po +++ /dev/null @@ -1,1094 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-03-19 04:16+0000\n" -"Last-Translator: Eric \n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.2-dev\n" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:619 -msgid "A list of kernel capabilities to add to the container" -msgstr "要添加到容器的内核功能列表" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:69 -msgid "Access Control" -msgstr "访问控制" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:223 -msgid "Add" -msgstr "新增" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:595 -msgid "Add host device to the container" -msgstr "将主机设备添加到容器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:571 -msgid "Advance" -msgstr "高级选项" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:586 -msgid "Allocates an ephemeral host port for all of a container's exposed ports" -msgstr "为容器的所有暴露端口分配临时主机端口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:118 -msgid "Allowed access interfaces" -msgstr "允许的访问接口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:498 -msgid "Always pull image first" -msgstr "总是先拉取镜像" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:29 -msgid "" -"An overview with the relevant data is displayed here with which the LuCI " -"docker client is connected." -msgstr "在此展示与LuCI docker客户端相连接的相关数据的概览。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:43 -msgid "Api Version" -msgstr "Api 版本" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:94 -msgid "Auto create macvlan interface in Openwrt" -msgstr "在 Openwrt 中自动创建 macvlan 界面" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:18 -msgid "Auto start" -msgstr "自动启动" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:134 -msgid "Available" -msgstr "可用" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:47 -msgid "Base device" -msgstr "基设备" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:553 -msgid "Bind Mount(-v)" -msgstr "绑定挂载(-v)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:554 -msgid "Bind mount a volume" -msgstr "绑定挂载卷" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:596 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:652 -msgid "Block IO Weight" -msgstr "块 IO 权重" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:653 -msgid "" -"Block IO weight (relative weight) accepts a weight value between 10 and 1000" -msgstr "块 IO 权重(相对权重)接受10到1000之间的数值" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:597 -msgid "" -"Block IO weight (relative weight) accepts a weight value between 10 and 1000." -msgstr "块 IO 权重(相对权重)接受10到1000之间的数值。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:61 -msgid "Bridge (Support direct communication between MAC VLANs)" -msgstr "桥接(支持 MAC VLAN 之间的直接通信)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:42 -msgid "Bridge device" -msgstr "Bridge device" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:84 -msgid "" -"By entering a valid image name with the corresponding version, the docker " -"image can be downloaded from the configured registry." -msgstr "" -"通过输入具有相应版本的有效映像名称,可以从镜像存储中心(Registry)中下载" -"docker映像。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:618 -msgid "CAP-ADD(--cap-add)" -msgstr "权限控制(--cap-add)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:581 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:635 -msgid "CPU Shares Weight" -msgstr "CPU 共享权重" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:779 -msgid "CPU Useage" -msgstr "CPU 使用率" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:636 -msgid "" -"CPU shares relative weight, if 0 is set, the system will ignore the value " -"and use the default of 1024" -msgstr "CPU 共享相对权重,如果设置为 0,则系统将忽略该值并使用默认值 1024" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:582 -msgid "" -"CPU shares relative weight, if 0 is set, the system will ignore the value " -"and use the default of 1024." -msgstr "CPU 共享相对权重,如果设置为 0,则系统将忽略该值并使用默认值 1024。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:573 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:626 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:44 -msgid "CPUs" -msgstr "线程数量" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:159 -msgid "Can NOT connect to docker daemon, please check!!" -msgstr "无法连接到docker守护进程(docker daemon),请检查!!" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:91 -msgid "Cancel" -msgstr "取消" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:60 -msgid "Client connection" -msgstr "客户端连接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:347 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:687 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:182 -msgid "Command" -msgstr "命令" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:100 -msgid "Command line" -msgstr "命令行" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:72 -msgid "Command line Error" -msgstr "命令行错误" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:17 -msgid "Configuration" -msgstr "配置" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:36 -msgid "Configure the default bridge network" -msgstr "配置默认桥接网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:405 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:707 -msgid "Connect" -msgstr "连接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:403 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:437 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:473 -msgid "Connect Network" -msgstr "连接网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:74 -msgid "Connect to remote docker endpoint" -msgstr "连接到远程docker" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:7 -msgid "Console" -msgstr "控制台" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:161 -msgid "Container Info" -msgstr "容器信息" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:650 -msgid "Container Inspect" -msgstr "检查容器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:671 -msgid "Container Logs" -msgstr "容器日志" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:473 -msgid "Container Name" -msgstr "容器名称" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:92 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:58 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:29 -msgid "Container detail" -msgstr "容器详情" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:38 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:142 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:148 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:87 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:133 -msgid "Containers" -msgstr "容器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:94 -msgid "Create macvlan interface" -msgstr "创建 macvlan 接口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:465 -msgid "Create new docker container" -msgstr "创建 docker 容器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:31 -msgid "Create new docker network" -msgstr "创建 docker 网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:312 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:153 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:92 -msgid "Created" -msgstr "创建时间" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:33 -msgid "DELETING" -msgstr "删除中" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:371 -msgid "DNS" -msgstr "DNS" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:51 -msgid "Debug" -msgstr "调试" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:35 -msgid "Default bridge" -msgstr "默认桥接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:363 -msgid "Device" -msgstr "设备" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:594 -msgid "Device(--device)" -msgstr "设备(--device)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:396 -msgid "Disconnect" -msgstr "断开" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:14 -msgid "Docker" -msgstr "Docker" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:12 -msgid "Docker - Configuration" -msgstr "Docker - 配置" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:192 -msgid "Docker - Container (%s)" -msgstr "Docker - 容器 (%s)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:128 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:450 -msgid "Docker - Containers" -msgstr "Docker - 容器" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/logs.htm:3 -msgid "Docker - Events" -msgstr "Docker - 事件" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:72 -msgid "Docker - Images" -msgstr "Docker - 镜像" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:15 -msgid "Docker - Network" -msgstr "Docker - 网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:54 -msgid "Docker - Networks" -msgstr "Docker - 网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:28 -msgid "Docker - Overview" -msgstr "Docker - 概览" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:69 -msgid "Docker - Volumes" -msgstr "Docker - 存储卷" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:16 -msgid "Docker Daemon settings" -msgstr "Docker 服务端(Docker Daemon)设置" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:489 -msgid "Docker Image" -msgstr "Docker 镜像" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:30 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:46 -msgid "Docker Root Dir" -msgstr "Docker 根目录" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:93 -msgid "Docker Socket Path" -msgstr "Docker 套接字路径" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:42 -msgid "Docker Version" -msgstr "Docker 版本" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm:91 -msgid "Docker actions done." -msgstr "Docker 执行完成。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:70 -msgid "DockerMan" -msgstr "DockerMan" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:13 -msgid "DockerMan is a simple docker manager client for LuCI" -msgstr "DockerMan是用于LuCI的简单docker管理器客户端" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:68 -msgid "DockerMan settings" -msgstr "DockerMan设置" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:172 -msgid "Download" -msgstr "下载" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:82 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:40 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:85 -msgid "Driver" -msgstr "驱动" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:265 -msgid "Duplicate/Edit" -msgstr "复制/编辑" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:120 -msgid "Enable IPv6" -msgstr "启用 IPv6" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:351 -msgid "Env" -msgstr "环境变量" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:546 -msgid "Environmental Variable(-e)" -msgstr "环境变量(-e)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:54 -msgid "Error" -msgstr "错误" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:42 -#: applications/luci-app-dockerman/luasrc/view/dockerman/logs.htm:5 -msgid "Events" -msgstr "事件" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:116 -msgid "Exclude IPs" -msgstr "排除 IP" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:247 -msgid "Export" -msgstr "导出" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:585 -msgid "Exposed All Ports(-P)" -msgstr "暴露所有端口(-P)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:560 -msgid "Exposed Ports(-p)" -msgstr "暴露端口(-p)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:55 -msgid "Fatal" -msgstr "致命的" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:6 -msgid "File" -msgstr "文件" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:324 -msgid "Finish Time" -msgstr "完成时间" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:220 -msgid "Force Remove" -msgstr "强制移除" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:88 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:106 -msgid "Gateway" -msgstr "网关" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:33 -msgid "Github" -msgstr "Github" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm:4 -msgid "Go to relevant configuration page" -msgstr "进入相关配置页面" - -#: applications/luci-app-dockerman/root/usr/share/rpcd/acl.d/luci-app-dockerman.json:3 -msgid "Grant UCI access for luci-app-dockerman" -msgstr "授予 UCI 访问 luci-app-dockerman 的权限" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:330 -msgid "Healthy" -msgstr "健康" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:578 -msgid "Host Name" -msgstr "主机名" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:100 -msgid "Host or IP Address for the connection to a remote docker instance" -msgstr "连接到远程Docker实例的主机名或IP地址" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:300 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:142 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:78 -msgid "ID" -msgstr "ID" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:44 -msgid "IP VLAN" -msgstr "IP VLAN" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:111 -msgid "IP range" -msgstr "IP 范围" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:522 -msgid "IPv4 Address" -msgstr "IPv4 地址" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:132 -msgid "IPv6 Gateway" -msgstr "IPv6 网关" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:126 -msgid "IPv6 Subnet" -msgstr "IPv6 子网" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:304 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:54 -msgid "Image" -msgstr "镜像" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:39 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:151 -msgid "Images" -msgstr "镜像" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:132 -msgid "Images overview" -msgstr "镜像概览" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:4 -msgid "Import" -msgstr "导入" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:125 -msgid "Import Image" -msgstr "导入镜像" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:47 -msgid "Index Server Address" -msgstr "索引服务器地址" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:52 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:414 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:102 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:3 -msgid "Info" -msgstr "信息" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:74 -msgid "Ingress" -msgstr "入口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:75 -msgid "" -"Ingress network is the network which provides the routing-mesh in swarm mode" -msgstr "入口网络是以群模式提供路由网格的网络" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:8 -msgid "Inspect" -msgstr "检查" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:477 -msgid "Interactive (-i)" -msgstr "交互(-i)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:86 -msgid "Internal" -msgstr "内部" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:66 -msgid "Ipvlan Mode" -msgstr "Ipvlan 模式" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:43 -msgid "" -"It replaces the daemon registry mirrors with a new set of registry mirrors" -msgstr "" -"设置新的镜像存储中心(Registry)镜像源,这将取代服务端(daemon)配置的镜像存" -"储中心(Registry)的镜像源" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:238 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:264 -msgid "Kill" -msgstr "强制关闭" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:70 -msgid "L2 bridge" -msgstr "L2 桥接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:71 -msgid "L3 bridge" -msgstr "L3 桥接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:359 -msgid "Links" -msgstr "链接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:527 -msgid "Links with other containers" -msgstr "与其他容器的链接" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:283 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_load.htm:2 -msgid "Load" -msgstr "负载" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:49 -msgid "Log Level" -msgstr "日志等级" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:661 -msgid "Log driver options" -msgstr "日志驱动选项" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:9 -msgid "Logs" -msgstr "日志" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:43 -msgid "MAC VLAN" -msgstr "MAC VLAN" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:589 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:644 -msgid "Memory" -msgstr "内存" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:783 -msgid "Memory Useage" -msgstr "内存使用率" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:645 -msgid "" -"Memory limit (format: []). Number is a positive integer. Unit " -"can be one of b, k, m, or g. Minimum is 4M" -msgstr "" -"内存限制(格式:<数字>[<单位>])。数字是正整数。单位可以是 b、k、m 或 g 之一。" -"最小值为 4M" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:590 -msgid "" -"Memory limit (format: []). Number is a positive integer. Unit " -"can be one of b, k, m, or g. Minimum is 4M." -msgstr "" -"内存限制(格式:<数字>[<单位>])。数字是正整数。单位可以是 b、k、m 或 g 之一。" -"最小值为 4M。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:57 -msgid "Mode" -msgstr "模式" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:90 -msgid "Mount Point" -msgstr "挂载点" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:603 -msgid "Mount tmpfs directory" -msgstr "挂载 tmpfs 目录" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:343 -msgid "Mount/Volume" -msgstr "挂载/卷" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:175 -msgid "Mounts" -msgstr "挂载点" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:295 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:419 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:83 -msgid "Name" -msgstr "名称" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:37 -msgid "Name of the network that can be selected during container creation" -msgstr "在容器创建时可以选择网络的名称" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:394 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:528 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:169 -msgid "Network" -msgstr "网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:80 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:36 -msgid "Network Name" -msgstr "网络名称" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:40 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:518 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:169 -msgid "Networks" -msgstr "网络" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:59 -msgid "Networks overview" -msgstr "网络概览" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:104 -msgid "New" -msgstr "新建" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:39 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:54 -msgid "New tag" -msgstr "新建标签" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:627 -msgid "Number of CPUs. Number is a fractional number. 0.000 means no limit" -msgstr "CPU 数量。数字是小数。0.000 表示没有限制" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:574 -msgid "Number of CPUs. Number is a fractional number. 0.000 means no limit." -msgstr "CPU 数量。数字是小数。0.000 表示没有限制。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:73 -msgid "" -"On this page all images are displayed that are available on the system and " -"with which a container can be created." -msgstr "在此页面上,显示系统上可用的所有镜像文件,并可以用它们来创建容器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:193 -msgid "On this page, the selected container can be managed." -msgstr "在此页面可以管理所选的容器。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:82 -msgid "Options" -msgstr "选项" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:45 -msgid "Overlay network" -msgstr "Overlay network" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:37 -msgid "Overview" -msgstr "概览" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:33 -msgid "PLEASE CONFIRM" -msgstr "请确认" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:84 -msgid "Parent Interface" -msgstr "父接口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:64 -msgid "Pass-through (Mirror physical device to single MAC VLAN)" -msgstr "直通(将物理设备镜像到单独的 MAC VLAN)" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:54 -msgid "Please input new tag" -msgstr "请输入新的标签" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:270 -msgid "Please input the PATH and select the file !" -msgstr "请输入路径并选择文件!" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:82 -msgid "Please input the PORT or HOST IP of remote docker instance!" -msgstr "请输入合法的远程docker实例端口和主机IP" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:86 -msgid "Please input the SOCKET PATH of docker daemon!" -msgstr "请输入合法docker服务端(docker daemon)的SOCKET地址" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:91 -msgid "Plese input command line:" -msgstr "请输入 的命令行:" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:355 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:172 -msgid "Ports" -msgstr "端口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:124 -msgid "Ports allowed to be accessed" -msgstr "允许访问的端口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:62 -msgid "Private (Prevent communication between MAC VLANs)" -msgstr "专用(阻止 MAC VLAN 之间的通信)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:504 -msgid "Privileged" -msgstr "特权模式" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:561 -msgid "Publish container's port(s) to the host" -msgstr "将容器的端口发布到主机" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:100 -msgid "Pull" -msgstr "拉取" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:83 -msgid "Pull Image" -msgstr "拉取镜像" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:42 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:48 -msgid "Registry Mirrors" -msgstr "镜像加速器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:73 -msgid "Remote Endpoint" -msgstr "远程实例" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:99 -msgid "Remote Host" -msgstr "远程主机" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:106 -msgid "Remote Port" -msgstr "远程端口" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:274 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:274 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:210 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:115 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:108 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:173 -msgid "Remove" -msgstr "移除" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:43 -#: applications/luci-app-dockerman/luasrc/view/dockerman/images_import.htm:82 -msgid "Remove tag" -msgstr "移除标签" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:171 -msgid "Rename" -msgstr "重命名" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:145 -msgid "RepoTags" -msgstr "仓库标签" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:469 -msgid "Resolve CLI" -msgstr "解析 CLI" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:4 -msgid "Resources" -msgstr "资源" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:220 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:244 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:87 -msgid "Restart" -msgstr "重新启动" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:334 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:427 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:510 -msgid "Restart Policy" -msgstr "重启策略" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:86 -msgid "Restrict external access to the network" -msgstr "限制外部网络访问" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm:31 -msgid "Reveal/hide password" -msgstr "显示/隐藏 密码" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:566 -msgid "Run command" -msgstr "运行命令" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:230 -msgid "Save" -msgstr "保存" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:533 -msgid "Set custom DNS servers" -msgstr "设置自定义 DNS 服务器" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:547 -msgid "Set environment variables to inside the container" -msgstr "在容器内部设置环境变量" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:50 -msgid "Set the logging level" -msgstr "设置日志记录级别" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:151 -msgid "Size" -msgstr "大小" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:61 -msgid "" -"Specifies where the Docker daemon will listen for client connections " -"(default: unix:///var/run/docker.sock)" -msgstr "" -"指定Docker服务端(Docker daemon)将在何处侦听客户端连接(默认: unix:///var/" -"run/docker.sock)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:211 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:234 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:65 -msgid "Start" -msgstr "启动" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:319 -msgid "Start Time" -msgstr "开始时间" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:789 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:790 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container.htm:5 -msgid "Stats" -msgstr "状态" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:308 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:165 -msgid "Status" -msgstr "状态" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:229 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:254 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:65 -msgid "Stop" -msgstr "停止" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm:91 -msgid "Submit" -msgstr "提交" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:86 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:101 -msgid "Subnet" -msgstr "子网" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:375 -msgid "Sysctl" -msgstr "系统控制" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:610 -msgid "Sysctl(--sysctl)" -msgstr "系统控制(--sysctl)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:611 -msgid "Sysctls (kernel parameters) options" -msgstr "系统控制(内核参数)选项" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:792 -msgid "TOP" -msgstr "TOP" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:483 -msgid "TTY (-t)" -msgstr "TTY(-t)" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm:56 -msgid "TX/RX" -msgstr "发射/接收" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:579 -msgid "The hostname to use for the container" -msgstr "容器使用的主机名" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:662 -msgid "The logging configuration for this container" -msgstr "该容器的日志记录配置" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:540 -msgid "" -"The user that commands are run as inside the container.(format: name|uid[:" -"group|gid])" -msgstr "在容器中以用户运行命令。(格式:name|uid[:group|gid])" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua:129 -msgid "" -"This page displays all containers that have been created on the connected " -"docker host." -msgstr "此页面显示在连接的Docker主机上已创建的所有容器。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua:55 -msgid "" -"This page displays all docker networks that have been created on the " -"connected docker host." -msgstr "此页面显示在已连接的Docker主机上创建的所有Docker网络。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:367 -msgid "Tmpfs" -msgstr "Tmpfs" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:602 -msgid "Tmpfs(--tmpfs)" -msgstr "Tmpfs(--tmpfs)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua:45 -msgid "Total Memory" -msgstr "总内存" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:697 -msgid "UID" -msgstr "UID" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:297 -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:336 -msgid "Update" -msgstr "更新" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:256 -msgid "Upgrade" -msgstr "升级" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:7 -msgid "Upload" -msgstr "上传" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:303 -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:304 -msgid "Upload Error" -msgstr "上传错误" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm:294 -msgid "Upload Success" -msgstr "上传成功" - -#: applications/luci-app-dockerman/luasrc/view/dockerman/container_stats.htm:48 -msgid "Upload/Download" -msgstr "上传/下载" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua:339 -msgid "User" -msgstr "用户" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua:539 -msgid "User(-u)" -msgstr "用户(-u)" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua:63 -msgid "VEPA (Virtual Ethernet Port Aggregator)" -msgstr "VEPA(虚拟以太网端口聚合器)" - -#: applications/luci-app-dockerman/luasrc/controller/dockerman.lua:41 -#: applications/luci-app-dockerman/luasrc/view/dockerman/overview.htm:187 -msgid "Volumes" -msgstr "存储卷" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua:73 -msgid "Volumes overview" -msgstr "卷概览" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:53 -msgid "Warning" -msgstr "警告" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua:126 -msgid "" -"When pressing the Import button, both a local image can be loaded onto the " -"system and a valid image tar can be downloaded from remote." -msgstr "" -"按下导入按钮时,既可以将本地镜像文件加载到系统上,也可以从远程下载有效的Tar格" -"式的镜像文件。" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:124 -msgid "" -"Which Port(s) can be accessed, it's not restricted by the Allowed Access " -"interfaces configuration. Use this configuration with caution!" -msgstr "设置可以被访问的端口,该配置不受“允许的访问接口”配置的限制。请谨慎使用该配置选项!" - -#: applications/luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua:118 -msgid "" -"Which interface(s) can access containers under the bridge network, fill-in " -"Interface Name" -msgstr "哪些接口可以访问桥接网络下的容器,请填写接口名称" - -#~ msgid "Containers allowed to be accessed" -#~ msgstr "允许访问的容器" - -#~ msgid "" -#~ "Which container(s) under bridge network can be accessed, even from " -#~ "interfaces that are not allowed, fill-in Container Id or Name" -#~ msgstr "" -#~ "桥接网络下哪些容器可以访问,即使是不允许从接口访问,也要填写容器 ID 或名称" - -#~ msgid "Connect to remote endpoint" -#~ msgstr "连接到远程终端" - -#~ msgid "Global settings" -#~ msgstr "全局设定" - -#~ msgid "Path" -#~ msgstr "路径" - -#~ msgid "Please input the PATH !" -#~ msgstr "请输入合法路径!" - -#~ msgid "Setting" -#~ msgstr "设置" - -#~ msgid "Specifies where the Docker daemon will listen for client connections" -#~ msgstr "指定Docker服务端(Docker daemon)侦听客户端连接的位置" - -#~ msgid "Docker Container" -#~ msgstr "Docker 容器" - -#~ msgid "" -#~ "DockerMan is a Simple Docker manager client for LuCI, If you have any " -#~ "issue please visit:" -#~ msgstr "" -#~ "DockerMan 是一个简单的 LuCI 客户端 Docker 管理器,如果您有任何问题,请访" -#~ "问:" - -#~ msgid "Import Images" -#~ msgstr "导入镜像" - -#~ msgid "New Container" -#~ msgstr "新建容器" - -#~ msgid "New Network" -#~ msgstr "新建网络" - -#~ msgid "Macvlan Mode" -#~ msgstr "Macvlan 模式" - -#~ msgid "" -#~ "Daemon unix socket (unix:///var/run/docker.sock) or TCP Remote Hosts " -#~ "(tcp://0.0.0.0:2375), default: unix:///var/run/docker.sock" -#~ msgstr "" -#~ "守护进程 unix 套接字 (unix:///var/run/docker.sock) 或 TCP 远程主机 " -#~ "(tcp://0.0.0.0:2375),默认值:unix:///var/run/docker.sock" - -#~ msgid "Docker Daemon" -#~ msgstr "Docker 服务端" - -#~ msgid "Dockerman connect to remote endpoint" -#~ msgstr "Dockerman 连接到远程端点" - -#~ msgid "Enable" -#~ msgstr "启用" - -#~ msgid "Server Host" -#~ msgstr "服务器主机" - -#~ msgid "Contaienr Info" -#~ msgstr "容器信息" diff --git a/luci-app-dockerman/po/zh_Hans b/luci-app-dockerman/po/zh_Hans deleted file mode 100755 index 41451e4a1..000000000 --- a/luci-app-dockerman/po/zh_Hans +++ /dev/null @@ -1 +0,0 @@ -zh-cn \ No newline at end of file diff --git a/luci-app-dockerman/postinst b/luci-app-dockerman/postinst deleted file mode 100755 index b0db1cb89..000000000 --- a/luci-app-dockerman/postinst +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -/init.sh env -touch /etc/config/dockerd -uci set dockerd.dockerman=dockerman -uci set dockerd.dockerman.socket_path=`uci get dockerd.dockerman.socket_path 2&> /dev/null || echo '/var/run/docker.sock'` -uci set dockerd.dockerman.status_path=`uci get dockerd.dockerman.status_path 2&> /dev/null || echo '/tmp/.docker_action_status'` -uci set dockerd.dockerman.debug=`uci get dockerd.dockerman.debug 2&> /dev/null || echo 'false'` -uci set dockerd.dockerman.debug_path=`uci get dockerd.dockerman.debug_path 2&> /dev/null || echo '/tmp/.docker_debug'` -uci set dockerd.dockerman.remote_port=`uci get dockerd.dockerman.remote_port 2&> /dev/null || echo '2375'` -uci set dockerd.dockerman.remote_endpoint=`uci get dockerd.dockerman.remote_endpoint 2&> /dev/null || echo '0'` -uci del_list dockerd.dockerman.ac_allowed_interface='br-lan' -uci add_list dockerd.dockerman.ac_allowed_interface='br-lan' -uci commit dockerd \ No newline at end of file diff --git a/luci-app-dockerman/root/etc/init.d/dockerman b/luci-app-dockerman/root/etc/init.d/dockerman deleted file mode 100755 index 80309aeab..000000000 --- a/luci-app-dockerman/root/etc/init.d/dockerman +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=99 -USE_PROCD=1 -# PROCD_DEBUG=1 -config_load 'dockerd' -# config_get daemon_ea "dockerman" daemon_ea -_DOCKERD=/etc/init.d/dockerd - -docker_running(){ - docker version > /dev/null 2>&1 - return $? -} - -add_ports() { - [ $# -eq 0 ] && return - $($_DOCKERD running) && docker_running || return 1 - ids=$@ - for id in $ids; do - id=$(docker ps --filter "ID=$id" --quiet) - [ -z "$id" ] && { - echo "Docker containner not running"; - return 1; - } - ports=$(docker ps --filter "ID=$id" --format "{{.Ports}}") - # echo "$ports" - for port in $ports; do - echo "$port" | grep -qE "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:.*$" || continue; - [ "${port: -1}" == "," ] && port="${port:0:-1}" - local protocol="" - [ "${port%tcp}" != "$port" ] && protocol="/tcp" - [ "${port%udp}" != "$port" ] && protocol="/udp" - [ "$protocol" == "" ] && continue - port="${port%%->*}" - port="${port##*:}" - uci_add_list dockerd dockerman ac_allowed_ports "${port}${protocol}" - done - done - uci_commit dockerd -} - - -convert() { - _convert() { - _id=$1 - _id=$(docker ps --all --filter "ID=$_id" --quiet) - if [ -z "$_id" ]; then - uci_remove_list dockerd dockerman ac_allowed_container "$1" - return - fi - if /etc/init.d/dockerman add_ports "$_id"; then - uci_remove_list dockerd dockerman ac_allowed_container "$_id" - fi - } - config_list_foreach dockerman ac_allowed_container _convert - uci_commit dockerd -} - -iptables_append(){ - # Wait for a maximum of 10 second per command, retrying every millisecond - local iptables_wait_args="--wait 10 --wait-interval 1000" - if ! iptables ${iptables_wait_args} --check $@ 2>/dev/null; then - iptables ${iptables_wait_args} -A $@ 2>/dev/null - fi -} - -init_dockerman_chain(){ - iptables -N DOCKER-MAN >/dev/null 2>&1 - iptables -F DOCKER-MAN >/dev/null 2>&1 - iptables -D DOCKER-USER -j DOCKER-MAN >/dev/null 2>&1 - iptables -I DOCKER-USER -j DOCKER-MAN >/dev/null 2>&1 -} - -delete_dockerman_chain(){ - iptables -D DOCKER-USER -j DOCKER-MAN >/dev/null 2>&1 - iptables -F DOCKER-MAN >/dev/null 2>&1 - iptables -X DOCKER-MAN >/dev/null 2>&1 -} - -add_allowed_interface(){ - iptables_append DOCKER-MAN -i $1 -o docker0 -j RETURN -} - -add_allowed_ports(){ - port=$1 - if [ "${port%/tcp}" != "$port" ]; then - iptables_append DOCKER-MAN -p tcp -m conntrack --ctorigdstport ${port%/tcp} --ctdir ORIGINAL -j RETURN - elif [ "${port%/udp}" != "$port" ]; then - iptables_append DOCKER-MAN -p udp -m conntrack --ctorigdstport ${port%/udp} --ctdir ORIGINAL -j RETURN - fi -} - -handle_allowed_ports(){ - config_list_foreach "dockerman" "ac_allowed_ports" add_allowed_ports -} - -handle_allowed_interface(){ - config_list_foreach "dockerman" "ac_allowed_interface" add_allowed_interface - iptables_append DOCKER-MAN -m conntrack --ctstate ESTABLISHED,RELATED -o docker0 -j RETURN >/dev/null 2>&1 - iptables_append DOCKER-MAN -m conntrack --ctstate NEW,INVALID -o docker0 -j DROP >/dev/null 2>&1 - iptables_append DOCKER-MAN -j RETURN >/dev/null 2>&1 -} - -start_service(){ - [ -x "$_DOCKERD" ] && $($_DOCKERD enabled) || return 0 - delete_dockerman_chain - $($_DOCKERD running) && docker_running || return 0 - init_dockerman_chain - handle_allowed_ports - handle_allowed_interface -} - -stop_service(){ - delete_dockerman_chain -} - -service_triggers() { - procd_add_reload_trigger 'dockerd' -} - -reload_service() { - start -} - -boot() { - sleep 5s - start -} - -extra_command "add_ports" "Add allowed ports based on the container ID(s)" -extra_command "convert" "Convert Ac allowed container to AC allowed ports" diff --git a/luci-app-dockerman/root/etc/uci-defaults/luci-app-dockerman b/luci-app-dockerman/root/etc/uci-defaults/luci-app-dockerman deleted file mode 100755 index 4358728a1..000000000 --- a/luci-app-dockerman/root/etc/uci-defaults/luci-app-dockerman +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -. $IPKG_INSTROOT/lib/functions.sh - -[ -x "$(command -v dockerd)" ] && chmod +x /etc/init.d/dockerman && /etc/init.d/dockerman enable >/dev/null 2>&1 -sed -i 's/self:cfgvalue(section) or {}/self:cfgvalue(section) or self.default or {}/' /usr/lib/lua/luci/view/cbi/dynlist.htm -/etc/init.d/uhttpd restart >/dev/null 2>&1 -rm -fr /tmp/luci-indexcache /tmp/luci-modulecache >/dev/null 2>&1 -touch /etc/config/dockerd -ls /etc/rc.d/*dockerd &> /dev/null && uci -q set dockerd.globals.auto_start="1" || uci -q set dockerd.globals.auto_start="0" -uci -q batch <<-EOF >/dev/null - set uhttpd.main.script_timeout="3600" - commit uhttpd - set dockerd.dockerman=dockerman - set dockerd.dockerman.socket_path='/var/run/docker.sock' - set dockerd.dockerman.status_path='/tmp/.docker_action_status' - set dockerd.dockerman.debug='false' - set dockerd.dockerman.debug_path='/tmp/.docker_debug' - set dockerd.dockerman.remote_endpoint='0' - - del_list dockerd.dockerman.ac_allowed_interface='br-lan' - add_list dockerd.dockerman.ac_allowed_interface='br-lan' - - commit dockerd -EOF -# remove dockerd firewall -config_load dockerd -remove_firewall(){ - cfg=${1} - uci_remove dockerd ${1} -} -config_foreach remove_firewall firewall -# Convert ac_allowed_container to ac_allowed_ports -(sleep 30s && /etc/init.d/dockerman convert;/etc/init.d/dockerman restart) & - -exit 0 diff --git a/luci-app-dockerman/root/usr/share/rpcd/acl.d/luci-app-dockerman.json b/luci-app-dockerman/root/usr/share/rpcd/acl.d/luci-app-dockerman.json deleted file mode 100755 index 78c2c6418..000000000 --- a/luci-app-dockerman/root/usr/share/rpcd/acl.d/luci-app-dockerman.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "luci-app-dockerman": { - "description": "Grant UCI access for luci-app-dockerman", - "read": { - "uci": [ "dockerd" ] - }, - "write": { - "uci": [ "dockerd" ] - } - } -} diff --git a/luci-app-snmpd/Makefile b/luci-app-snmpd/Makefile old mode 100755 new mode 100644 index 12f22abd3..3cd753a5f --- a/luci-app-snmpd/Makefile +++ b/luci-app-snmpd/Makefile @@ -1,15 +1,11 @@ -# -# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) -# -# - include $(TOPDIR)/rules.mk +LUCI_TITLE:= Net-SNMP LuCI interface +LUCI_DEPENDS:=+luci-base +snmpd +LUCI_PKGARCH:=all +LUCI_DESCRIPTION:=Some common net-snmp config items. In no way is this comprehensive. -LUCI_TITLE:=LuCI SNMPD Interface -LUCI_DEPENDS:=+snmpd +snmptrapd +snmp-utils +snmp-mibs - -PKG_LICENSE:=GPLv3 - -#include ../luci/luci.mk +PKG_MAINTAINER:= Karl Palsson +PKG_LICENSE:=Apache-2.0 include $(TOPDIR)/feeds/luci/luci.mk + # call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js b/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js new file mode 100644 index 000000000..b9e5e2853 --- /dev/null +++ b/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js @@ -0,0 +1,64 @@ +// SPDX: Apache-2.0 +// Karl Palsson 2021 +'use strict'; +'require form'; +'require ui'; +'require view'; + +var desc = _("" + + "SNMPD is a master daemon/agent for SNMP, from the " + + "net-snmp project. " + + "Note, OpenWrt has mostly complete UCI support for snmpd, but this LuCI applet " + + "only covers a few of those options. In particular, there is very little/no validation " + + "or help. See /etc/config/snmpd for manual configuration." +); + +return view.extend({ + render: function() { + var m, s, o; + + m = new form.Map("snmpd", _("net-snmp's SNMPD"), desc); + + s = m.section(form.TypedSection, "agent", _("Agent settings")); + s.anonymous = true; + o = s.option(form.Value, "agentaddress", _("The address the agent should listen on"), + _("Eg: UDP:161, or UDP:10.5.4.3:161 to only listen on a given interface")); + + s = m.section(form.TypedSection, "agentx", _("AgentX settings"), + _("Delete this section to disable AgentX")); + s.anonymous = true; + o = s.option(form.Value, "agentxsocket", _("The address the agent should allow AgentX connections to"), + _("This is only necessary if you have subagents using the agentX " + + "socket protocol. Eg: /var/run/agentx.sock")); + s.addremove = true; + + s = m.section(form.TypedSection, "com2sec", _("com2sec security")); + o = s.option(form.Value, "secname", "secname"); + o = s.option(form.Value, "source", "source"); + o = s.option(form.Value, "community", "community"); + + s = m.section(form.TypedSection, "group", "group", _("Groups help define access methods")); + s.addremove = true; + s.option(form.Value, "group", "group"); + s.option(form.Value, "version", "version"); + s.option(form.Value, "secname", "secname"); + + s = m.section(form.TypedSection, "access", "access"); + s.option(form.Value, "group", "group"); + s.option(form.Value, "context", "context"); + s.option(form.Value, "version", "version"); + s.option(form.Value, "level", "level"); + s.option(form.Value, "prefix", "prefix"); + s.option(form.Value, "read", "read"); + s.option(form.Value, "write", "write"); + s.option(form.Value, "notify", "notify"); + + s = m.section(form.TypedSection, "system", _("System"), _("Values used in the MIB2 System tree")); + s.anonymous = true; + s.option(form.Value, "sysLocation", "sysLocation"); + s.option(form.Value, "sysContact", "sysContact"); + s.option(form.Value, "sysName", "sysName"); + + return m.render(); + } +}); diff --git a/luci-app-snmpd/luasrc/controller/snmpd.lua b/luci-app-snmpd/luasrc/controller/snmpd.lua deleted file mode 100755 index 2694da219..000000000 --- a/luci-app-snmpd/luasrc/controller/snmpd.lua +++ /dev/null @@ -1,8 +0,0 @@ -local ucic = luci.model.uci.cursor() -local dt = require "luci.cbi.datatypes" -module("luci.controller.snmpd", package.seeall) - -function index() - entry({"admin", "network", "snmpd"}, alias("admin", "network", "snmpd", "index"), _("SNMPd")) - entry({"admin", "network", "snmpd", "index"}, cbi("snmpd")) -end diff --git a/luci-app-snmpd/luasrc/model/cbi/snmpd.lua b/luci-app-snmpd/luasrc/model/cbi/snmpd.lua deleted file mode 100755 index 132b3a1d2..000000000 --- a/luci-app-snmpd/luasrc/model/cbi/snmpd.lua +++ /dev/null @@ -1,141 +0,0 @@ --- Copyright 2018 Ycarus (Yannick Chabanois) --- Licensed to the public under the Apache License 2.0. - -m = Map("snmpd", translate("SNMPd"), translate("SNMPd settings interface (Beta)")) - -s = m:section(TypedSection, "snmpd", translate("General")) -s.addremove = false - -enabled = s:option(Flag, "enabled", translate("Enabled")) -enabled.rmempty = false - -network = s:option(Value, "network", translate("Networks")) -network.template = "cbi/network_netlist" -network.widget = "checkbox" -network.rmempty = true -network.cast = "string" -network.nocreate = true - -s = m:section(TypedSection, "system", translate("System")) -s.addremove = false - -sysLocation = s:option(Value, "sysLocation", translate("Location")) -sysContact = s:option(Value, "sysContact", translate("Contact")) -sysName = s:option(Value, "sysName", translate("Name")) ---sysServices = s:option(Value, "sysServices", translate("Services")) ---sysDescr = s:option(Value, "sysDescr", translate("Description")) ---sysObjectID = s:option(Value, "sysObjectID", translate("ObjectID")) - -s = m:section(TypedSection, "com2sec", translate("com2sec security")) -s.addremove = true - -secname = s:option(ListValue, "secname", translate("Server")) -secname.optional = false -secname:value("ro",translate("Read-only")) -secname:value("rw",translate("Read-write")) - -source = s:option(Value, "source", translate("Source")) -source.datatype = "host" -source.optional = false -source.rmempty = false - -community = s:option(Value, "community", translate("Community")) -community.optional = false -community.rmempty = false - ---s = m:section(TypedSection, "com2sec6", translate("com2sec6")) ---s.addremove = true - ---secname = s:option(ListValue, "secname", translate("secname")) ---secname.optional = false ---secname:value("ro",translate("Read-only")) ---secname:value("rw",translate("Read-write")) - ---source = s:option(Value, "source", translate("Source")) ---source.datatype = "host" ---source.optional = false ---source.rmempty = false - ---community = s:option(Value, "community", translate("Community")) ---community.optional = false ---community.rmempty = false - -s = m:section(TypedSection, "group", translate("Group"), translate("Groups help define access methods")) -s.addremove = true -s.anonymous = false - -secname = s:option(ListValue, "secname", translate("secname")) -secname.optional = false -secname:value("ro",translate("Read-only")) -secname:value("rw",translate("Read-write")) - -group = s:option(Value, "group", translate("Group")) -group.optional = false -group.rmempty = false - -version = s:option(ListValue, "version", translate("version")) -version.optional = false -version:value("v1","v1") -version:value("v2c","v2c") -version:value("usm","usm") - -s = m:section(TypedSection, "access", translate("Access")) -s.addremove = true -s.anonymous = false - -group = s:option(Value, "group", translate("Group")) -group.optional = false -group.rmempty = false - -version = s:option(ListValue, "version", translate("version")) -version.optional = false -version:value("any",translate("any")) -version:value("v1","v1") -version:value("v2c","v2c") -version:value("usm","usm") - -context = s:option(ListValue, "context", translate("Context")) -context.optional = false -context:value("none","none") - -level = s:option(ListValue, "level", translate("Level")) -level.optional = false -level:value("noauth",translate("noauth")) -level:value("auth",translate("auth")) - -read = s:option(ListValue, "read", translate("Read")) -read.optional = false -read:value("all","all") -read:value("none","none") - -write = s:option(ListValue, "write", translate("Write")) -write.optional = false -write:value("all","all") -write:value("none","none") - -notify = s:option(ListValue, "notify", translate("Notify")) -notify.optional = false -notify:value("all","all") -notify:value("none","none") - ---s = m:section(TypedSection, "engineid", translate("engineid")) ---s.addremove = false ---s.anonymous = true - ---engineid = s:option(Value, "engineid", translate("engineid")) ---engineidtype = s:option(ListValue, "engineidtype", translate("engineidtype")) ---engineidtype:value("1",translate("IPv4")) ---engineidtype:value("2",translate("IPv6")) ---engineidtype:value("3",translate("MAC")) ---engineidnic = s:option(Value, "engineidnic", translate("engineidnic")) - -s = m:section(TypedSection, "exec", translate("Exec")) -s.addremove = true -s.anonymous = true - -miboid = s:option(Value, "miboid", translate("ObjectID")) -name = s:option(Value, "name", translate("Name")) -prog = s:option(Value, "prog", translate("Program")) -args = s:option(Value, "args", translate("Arguments")) - -return m diff --git a/luci-app-snmpd/luasrc/view/snmpd.htm b/luci-app-snmpd/luasrc/view/snmpd.htm deleted file mode 100755 index 74e60ca9a..000000000 --- a/luci-app-snmpd/luasrc/view/snmpd.htm +++ /dev/null @@ -1,132 +0,0 @@ -<%+header%> - - - -<% - local uci = require("luci.model.uci").cursor() - local hosts = uci:get_list("dhcp", uci:get_first("dhcp","dnsmasq"), "ipset") - local ips = uci:get_list("omr-bypass", "ips", "ip") - local dpi = uci:get_list("omr-bypass", "dpi", "proto") - local tmpfile = os.tmpname() - local dpi_available_proto = luci.util.execi("cat /proc/net/xt_ndpi/proto | awk '{print $3}' | sort -u | head -n -1") - local sys = require "luci.sys" - local ifaces = sys.net:devices() - local bypassif = uci:get("omr-bypass","defaults","ifname") or "" -%> -<% if stderr and #stderr > 0 then %>
<%=pcdata(stderr)%>
<% end %> -
-
-

<%:SNMPd%>

-
- <%:General%> -
-
- -
- checked<% end %>> -
-
-
- network -
-
-
- -
-
-
-
- -
-
-
-
- -
-
- -

<%:General%>

- -
-
-
-
-
<%:Domain, IP or network%>
-
<%:Output interface%>
-
-
-
-
-
- -
-
-
- -
-
-
-
- -
-
-
-

<%:Protocols%>

-
-
-
-
<%:Protocols%>
-
<%:Output interface%>
-
-
-
-
-<% - local allprt="""" - local protos = {} - for l in io.lines("/proc/net/xt_ndpi/proto") do - local a,b,c,d = l:match('(%w+) (%w+)') - if b ~= "2" and not string.match(b,"custom") then - table.insert(protos,b) - end - end - table.sort(protos) - for _,b in ipairs(protos) do - allprt=allprt .. ","" .. b .. """ - end -%> -
-
- -
-
-
- -
-
-
-
- -
-
-
-
- - -
- - -<%+footer%> diff --git a/luci-app-snmpd/po/de/snmpd.po b/luci-app-snmpd/po/de/snmpd.po deleted file mode 100755 index cfe49bcae..000000000 --- a/luci-app-snmpd/po/de/snmpd.po +++ /dev/null @@ -1,184 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-10-05 12:39+0000\n" -"Last-Translator: Weblate Admin \n" -"Language-Team: German \n" -"Language: de\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0.4\n" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 -msgid "Access" -msgstr "Zugriff" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:81 -#: luci-app-snmpd/luasrc/view/snmpd.htm:122 -msgid "Add" -msgstr "Hinzufügen" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:66 -#: luci-app-snmpd/luasrc/view/snmpd.htm:116 -msgid "All" -msgstr "alle" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 -msgid "Arguments" -msgstr "Parameter" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 -msgid "Community" -msgstr "Community" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 -msgid "Contact" -msgstr "Kontakt" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 -msgid "Context" -msgstr "Umgebung" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:54 -msgid "Domain, IP or network" -msgstr "FQDN, IP-Adresse oder CIDR-Netzmaske" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 -#: luci-app-snmpd/luasrc/view/snmpd.htm:24 -msgid "Enabled" -msgstr "Aktiv" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 -msgid "Exec" -msgstr "Ausführung" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 -#: luci-app-snmpd/luasrc/view/snmpd.htm:21 -#: luci-app-snmpd/luasrc/view/snmpd.htm:48 -msgid "General" -msgstr "Allgemein" - -#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 -msgid "Grant UCI access for luci-app-snmpd" -msgstr "UCI-Zugriff für luci-app-snmpd gewähren" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 -msgid "Group" -msgstr "Gruppe" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -msgid "Groups help define access methods" -msgstr "Gruppen ermöglichen es, Zugriffsmethoden festzulegen" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:64 -#: luci-app-snmpd/luasrc/view/snmpd.htm:114 -msgid "Interface" -msgstr "Schnittstelle" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 -msgid "Level" -msgstr "Ebene" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 -msgid "Location" -msgstr "Ort" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 -msgid "Name" -msgstr "Name" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 -msgid "Networks" -msgstr "Netzwerke" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 -msgid "Notify" -msgstr "Benachrichten" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 -msgid "ObjectID" -msgstr "Objekt-Identifikation" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:55 -#: luci-app-snmpd/luasrc/view/snmpd.htm:90 -msgid "Output interface" -msgstr "Ausgabe-Anschluss" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 -msgid "Program" -msgstr "Programm" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:85 -#: luci-app-snmpd/luasrc/view/snmpd.htm:89 -msgid "Protocols" -msgstr "Protokolle" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 -msgid "Read" -msgstr "Lesen" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 -msgid "Read-only" -msgstr "Nur-Lesen" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 -msgid "Read-write" -msgstr "Lesen/Schreiben" - -#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -#: luci-app-snmpd/luasrc/view/snmpd.htm:19 -#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 -msgid "SNMPd" -msgstr "SNMPd" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -msgid "SNMPd settings interface (Beta)" -msgstr "SNMPd Einstellungen (Beta)" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 -msgid "Server" -msgstr "Server" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 -msgid "Source" -msgstr "Quelle" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 -msgid "System" -msgstr "System" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 -msgid "Write" -msgstr "Schreiben" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 -msgid "any" -msgstr "jede" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 -msgid "auth" -msgstr "Authentifizierung" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 -msgid "com2sec security" -msgstr "com2sec-Sicherheit" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 -msgid "noauth" -msgstr "noauth/offen" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 -msgid "secname" -msgstr "sec-Name" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 -msgid "version" -msgstr "Version" diff --git a/luci-app-snmpd/po/fr/snmpd.po b/luci-app-snmpd/po/fr/snmpd.po deleted file mode 100755 index 7efb48a42..000000000 --- a/luci-app-snmpd/po/fr/snmpd.po +++ /dev/null @@ -1,184 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-02-19 07:53+0000\n" -"Last-Translator: Weblate Admin \n" -"Language-Team: French \n" -"Language: fr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.6.1\n" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 -msgid "Access" -msgstr "Accès" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:81 -#: luci-app-snmpd/luasrc/view/snmpd.htm:122 -msgid "Add" -msgstr "Ajouter" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:66 -#: luci-app-snmpd/luasrc/view/snmpd.htm:116 -msgid "All" -msgstr "Tout" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 -msgid "Arguments" -msgstr "Arguments" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 -msgid "Community" -msgstr "Communauté" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 -msgid "Contact" -msgstr "Contact" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 -msgid "Context" -msgstr "Contexte" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:54 -msgid "Domain, IP or network" -msgstr "Domaine, IP ou réseau" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 -#: luci-app-snmpd/luasrc/view/snmpd.htm:24 -msgid "Enabled" -msgstr "Activer" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 -msgid "Exec" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 -#: luci-app-snmpd/luasrc/view/snmpd.htm:21 -#: luci-app-snmpd/luasrc/view/snmpd.htm:48 -msgid "General" -msgstr "Général" - -#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 -msgid "Grant UCI access for luci-app-snmpd" -msgstr "Accorder l'accès UCI pour luci-app-snmpd" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 -msgid "Group" -msgstr "Groupe" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -msgid "Groups help define access methods" -msgstr "Les groupes aident à définir les méthodes d'accès" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:64 -#: luci-app-snmpd/luasrc/view/snmpd.htm:114 -msgid "Interface" -msgstr "Interface" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 -msgid "Level" -msgstr "Niveau" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 -msgid "Location" -msgstr "Localisation" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 -msgid "Name" -msgstr "Nom" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 -msgid "Networks" -msgstr "Réseaux" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 -msgid "Notify" -msgstr "Notifier" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 -msgid "ObjectID" -msgstr "ObjectID" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:55 -#: luci-app-snmpd/luasrc/view/snmpd.htm:90 -msgid "Output interface" -msgstr "Interface de sortie" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 -msgid "Program" -msgstr "Programme" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:85 -#: luci-app-snmpd/luasrc/view/snmpd.htm:89 -msgid "Protocols" -msgstr "Protocoles" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 -msgid "Read" -msgstr "Lecture" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 -msgid "Read-only" -msgstr "Lecture Seule" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 -msgid "Read-write" -msgstr "Lecture-écriture" - -#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -#: luci-app-snmpd/luasrc/view/snmpd.htm:19 -#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 -msgid "SNMPd" -msgstr "SNMPd" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -msgid "SNMPd settings interface (Beta)" -msgstr "Paramètres du protocole SNMPd (Beta)" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 -msgid "Server" -msgstr "Serveur" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 -msgid "Source" -msgstr "Source" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 -msgid "System" -msgstr "Système" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 -msgid "Write" -msgstr "Ecriture" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 -msgid "any" -msgstr "Tout" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 -msgid "auth" -msgstr "Authentification" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 -msgid "com2sec security" -msgstr "com2sec security" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 -msgid "noauth" -msgstr "pas d'authentification" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 -msgid "secname" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 -msgid "version" -msgstr "version" diff --git a/luci-app-snmpd/po/it/snmpd.po b/luci-app-snmpd/po/it/snmpd.po deleted file mode 100755 index 5517296de..000000000 --- a/luci-app-snmpd/po/it/snmpd.po +++ /dev/null @@ -1,184 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-02-21 21:14+0000\n" -"Last-Translator: Deleted User \n" -"Language-Team: Italian \n" -"Language: it\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10.1\n" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 -msgid "Access" -msgstr "Accesso" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:81 -#: luci-app-snmpd/luasrc/view/snmpd.htm:122 -msgid "Add" -msgstr "Aggiungi" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:66 -#: luci-app-snmpd/luasrc/view/snmpd.htm:116 -msgid "All" -msgstr "Tutti" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 -msgid "Arguments" -msgstr "Parametri" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 -msgid "Community" -msgstr "Community" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 -msgid "Contact" -msgstr "Contatto" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 -msgid "Context" -msgstr "Contesto" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:54 -msgid "Domain, IP or network" -msgstr "Dominio, IP o rete" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 -#: luci-app-snmpd/luasrc/view/snmpd.htm:24 -msgid "Enabled" -msgstr "Abilitato" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 -msgid "Exec" -msgstr "Esegui" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 -#: luci-app-snmpd/luasrc/view/snmpd.htm:21 -#: luci-app-snmpd/luasrc/view/snmpd.htm:48 -msgid "General" -msgstr "Generale" - -#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 -msgid "Grant UCI access for luci-app-snmpd" -msgstr "Concedi l'accesso UCI per luci-app-snmpd" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 -msgid "Group" -msgstr "Gruppo" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -msgid "Groups help define access methods" -msgstr "I gruppi aiutano a definire i metodi di accesso" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:64 -#: luci-app-snmpd/luasrc/view/snmpd.htm:114 -msgid "Interface" -msgstr "Interfaccia" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 -msgid "Level" -msgstr "Livello" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 -msgid "Location" -msgstr "Sede" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 -msgid "Name" -msgstr "Nome" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 -msgid "Networks" -msgstr "Reti" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 -msgid "Notify" -msgstr "Notificare" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 -msgid "ObjectID" -msgstr "" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:55 -#: luci-app-snmpd/luasrc/view/snmpd.htm:90 -msgid "Output interface" -msgstr "Interfaccia di output" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 -msgid "Program" -msgstr "Programma" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:85 -#: luci-app-snmpd/luasrc/view/snmpd.htm:89 -msgid "Protocols" -msgstr "Protocollo" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 -msgid "Read" -msgstr "Leggi" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 -msgid "Read-only" -msgstr "Sola lettura" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 -msgid "Read-write" -msgstr "Leggi-Scrivi" - -#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -#: luci-app-snmpd/luasrc/view/snmpd.htm:19 -#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 -msgid "SNMPd" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -msgid "SNMPd settings interface (Beta)" -msgstr "Interfaccia delle impostazioni SNMPd (Beta)" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 -msgid "Server" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 -msgid "Source" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 -msgid "System" -msgstr "Sistema" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 -msgid "Write" -msgstr "Scrittura" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 -msgid "any" -msgstr "qualsiasi" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 -msgid "auth" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 -msgid "com2sec security" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 -msgid "noauth" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 -msgid "secname" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 -msgid "version" -msgstr "versione" diff --git a/luci-app-snmpd/po/oc/snmpd.po b/luci-app-snmpd/po/oc/snmpd.po deleted file mode 100755 index 10292f065..000000000 --- a/luci-app-snmpd/po/oc/snmpd.po +++ /dev/null @@ -1,184 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-08-31 17:15+0000\n" -"Last-Translator: Quentin PAGÈS \n" -"Language-Team: Occitan \n" -"Language: oc\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0.4\n" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 -msgid "Access" -msgstr "Accès" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:81 -#: luci-app-snmpd/luasrc/view/snmpd.htm:122 -msgid "Add" -msgstr "Ajustar" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:66 -#: luci-app-snmpd/luasrc/view/snmpd.htm:116 -msgid "All" -msgstr "Tot" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 -msgid "Arguments" -msgstr "Arguments" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 -msgid "Community" -msgstr "Comunautat" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 -msgid "Contact" -msgstr "Contacte" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 -msgid "Context" -msgstr "Contèxt" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:54 -msgid "Domain, IP or network" -msgstr "Domeni, IP o ret" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 -#: luci-app-snmpd/luasrc/view/snmpd.htm:24 -msgid "Enabled" -msgstr "Activat" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 -msgid "Exec" -msgstr "Exec" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 -#: luci-app-snmpd/luasrc/view/snmpd.htm:21 -#: luci-app-snmpd/luasrc/view/snmpd.htm:48 -msgid "General" -msgstr "General" - -#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 -msgid "Grant UCI access for luci-app-snmpd" -msgstr "Acordar l'accès UCI a luci-app-snmpd" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 -msgid "Group" -msgstr "Grop" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -msgid "Groups help define access methods" -msgstr "Los grops ajudan a gerir los metòdes d'accès" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:64 -#: luci-app-snmpd/luasrc/view/snmpd.htm:114 -msgid "Interface" -msgstr "Interfàcia" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 -msgid "Level" -msgstr "Nivèl" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 -msgid "Location" -msgstr "Emplaçament" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 -msgid "Name" -msgstr "Nom" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 -msgid "Networks" -msgstr "Rets" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 -msgid "Notify" -msgstr "Notificar" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 -msgid "ObjectID" -msgstr "ObjectID" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:55 -#: luci-app-snmpd/luasrc/view/snmpd.htm:90 -msgid "Output interface" -msgstr "Interfàcia de sortida" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 -msgid "Program" -msgstr "Programa" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:85 -#: luci-app-snmpd/luasrc/view/snmpd.htm:89 -msgid "Protocols" -msgstr "Protocòls" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 -msgid "Read" -msgstr "Lectura" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 -msgid "Read-only" -msgstr "Lectura sola" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 -msgid "Read-write" -msgstr "Lectura-escritura" - -#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -#: luci-app-snmpd/luasrc/view/snmpd.htm:19 -#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 -msgid "SNMPd" -msgstr "SNMPd" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -msgid "SNMPd settings interface (Beta)" -msgstr "Interfàcia de paramètres SNMPd (Beta)" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 -msgid "Server" -msgstr "Servidor" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 -msgid "Source" -msgstr "Font" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 -msgid "System" -msgstr "Sistèma" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 -msgid "Write" -msgstr "Escritura" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 -msgid "any" -msgstr "Quin que siá" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 -msgid "auth" -msgstr "auth" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 -msgid "com2sec security" -msgstr "seguretat com2sec" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 -msgid "noauth" -msgstr "noauth" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 -msgid "secname" -msgstr "secname" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 -msgid "version" -msgstr "version" diff --git a/luci-app-snmpd/po/templates/snmpd.pot b/luci-app-snmpd/po/templates/snmpd.pot old mode 100755 new mode 100644 index 9acfaf5cb..5eb995f6b --- a/luci-app-snmpd/po/templates/snmpd.pot +++ b/luci-app-snmpd/po/templates/snmpd.pot @@ -1,175 +1,69 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 -msgid "Access" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:22 +msgid "Agent settings" msgstr "" -#: luci-app-snmpd/luasrc/view/snmpd.htm:81 -#: luci-app-snmpd/luasrc/view/snmpd.htm:122 -msgid "Add" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:27 +msgid "AgentX settings" msgstr "" -#: luci-app-snmpd/luasrc/view/snmpd.htm:66 -#: luci-app-snmpd/luasrc/view/snmpd.htm:116 -msgid "All" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:28 +msgid "Delete this section to disable AgentX" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 -msgid "Arguments" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:25 +msgid "Eg: UDP:161, or UDP:10.5.4.3:161 to only listen on a given interface" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 -msgid "Community" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 -msgid "Contact" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 -msgid "Context" -msgstr "" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:54 -msgid "Domain, IP or network" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 -#: luci-app-snmpd/luasrc/view/snmpd.htm:24 -msgid "Enabled" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 -msgid "Exec" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 -#: luci-app-snmpd/luasrc/view/snmpd.htm:21 -#: luci-app-snmpd/luasrc/view/snmpd.htm:48 -msgid "General" -msgstr "" - -#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 +#: applications/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 msgid "Grant UCI access for luci-app-snmpd" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 -msgid "Group" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:40 msgid "Groups help define access methods" msgstr "" -#: luci-app-snmpd/luasrc/view/snmpd.htm:64 -#: luci-app-snmpd/luasrc/view/snmpd.htm:114 -msgid "Interface" +#: applications/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 +msgid "SNMPD" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 -msgid "Level" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:8 +msgid "" +"SNMPD is a master daemon/agent for SNMP, from the net-snmp project. Note, OpenWrt has mostly complete UCI " +"support for snmpd, but this LuCI applet only covers a few of those options. " +"In particular, there is very little/no validation or help. See /etc/config/" +"snmpd for manual configuration." msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 -msgid "Location" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 -msgid "Name" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 -msgid "Networks" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 -msgid "Notify" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 -msgid "ObjectID" -msgstr "" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:55 -#: luci-app-snmpd/luasrc/view/snmpd.htm:90 -msgid "Output interface" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 -msgid "Program" -msgstr "" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:85 -#: luci-app-snmpd/luasrc/view/snmpd.htm:89 -msgid "Protocols" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 -msgid "Read" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 -msgid "Read-only" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 -msgid "Read-write" -msgstr "" - -#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -#: luci-app-snmpd/luasrc/view/snmpd.htm:19 -#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 -msgid "SNMPd" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -msgid "SNMPd settings interface (Beta)" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 -msgid "Server" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 -msgid "Source" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:56 msgid "System" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 -msgid "Write" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:30 +msgid "The address the agent should allow AgentX connections to" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 -msgid "any" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:24 +msgid "The address the agent should listen on" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 -msgid "auth" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:31 +msgid "" +"This is only necessary if you have subagents using the agentX socket " +"protocol. Eg: /var/run/agentx.sock" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:56 +msgid "Values used in the MIB2 System tree" +msgstr "" + +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:35 msgid "com2sec security" msgstr "" -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 -msgid "noauth" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 -msgid "secname" -msgstr "" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 -msgid "version" +#: applications/luci-app-snmpd/htdocs/luci-static/resources/view/snmpd/snmpd.js:20 +msgid "net-snmp's SNMPD" msgstr "" diff --git a/luci-app-snmpd/po/zh_Hans/snmpd.po b/luci-app-snmpd/po/zh_Hans/snmpd.po deleted file mode 100755 index 43c9d8f1d..000000000 --- a/luci-app-snmpd/po/zh_Hans/snmpd.po +++ /dev/null @@ -1,184 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-05-05 11:40+0000\n" -"Last-Translator: niergouge <1150108426@qq.com>\n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.6.1\n" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 -msgid "Access" -msgstr "访问" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:81 -#: luci-app-snmpd/luasrc/view/snmpd.htm:122 -msgid "Add" -msgstr "添加" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:66 -#: luci-app-snmpd/luasrc/view/snmpd.htm:116 -msgid "All" -msgstr "所有" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 -msgid "Arguments" -msgstr "理由" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 -msgid "Community" -msgstr "公共" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 -msgid "Contact" -msgstr "联系" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 -msgid "Context" -msgstr "语境" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:54 -msgid "Domain, IP or network" -msgstr "域,IP或网络" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 -#: luci-app-snmpd/luasrc/view/snmpd.htm:24 -msgid "Enabled" -msgstr "启用" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 -msgid "Exec" -msgstr "执行" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 -#: luci-app-snmpd/luasrc/view/snmpd.htm:21 -#: luci-app-snmpd/luasrc/view/snmpd.htm:48 -msgid "General" -msgstr "通用" - -#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 -msgid "Grant UCI access for luci-app-snmpd" -msgstr "授予UCI访问luci-app-snmpd的权限" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 -msgid "Group" -msgstr "组" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 -msgid "Groups help define access methods" -msgstr "定义访问组帮助方法" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:64 -#: luci-app-snmpd/luasrc/view/snmpd.htm:114 -msgid "Interface" -msgstr "接口" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 -msgid "Level" -msgstr "级别" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 -msgid "Location" -msgstr "位置" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 -msgid "Name" -msgstr "名称" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 -msgid "Networks" -msgstr "网络" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 -msgid "Notify" -msgstr "通知" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 -msgid "ObjectID" -msgstr "对象ID" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:55 -#: luci-app-snmpd/luasrc/view/snmpd.htm:90 -msgid "Output interface" -msgstr "输出接口" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 -msgid "Program" -msgstr "程序" - -#: luci-app-snmpd/luasrc/view/snmpd.htm:85 -#: luci-app-snmpd/luasrc/view/snmpd.htm:89 -msgid "Protocols" -msgstr "协议" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 -msgid "Read" -msgstr "读取" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 -msgid "Read-only" -msgstr "只读" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 -msgid "Read-write" -msgstr "读写" - -#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -#: luci-app-snmpd/luasrc/view/snmpd.htm:19 -#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 -msgid "SNMPd" -msgstr "SNMPd设置" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 -msgid "SNMPd settings interface (Beta)" -msgstr "SNMPd设置界面(测试版)" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 -msgid "Server" -msgstr "服务器" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 -msgid "Source" -msgstr "源" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 -msgid "System" -msgstr "系统" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 -msgid "Write" -msgstr "写" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 -msgid "any" -msgstr "任何" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 -msgid "auth" -msgstr "认证" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 -msgid "com2sec security" -msgstr "com2sec安全" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 -msgid "noauth" -msgstr "无认证" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 -msgid "secname" -msgstr "第二名称" - -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 -#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 -msgid "version" -msgstr "版本" diff --git a/luci-app-snmpd/root/etc/config/snmpd b/luci-app-snmpd/root/etc/config/snmpd deleted file mode 100755 index 09a89474f..000000000 --- a/luci-app-snmpd/root/etc/config/snmpd +++ /dev/null @@ -1,91 +0,0 @@ - -config agent - option agentaddress 'UDP:161,UDP6:161' - -config agentx - option agentxsocket '/var/run/agentx.sock' - -config com2sec 'public' - option secname 'ro' - option source 'default' - option community 'public' - -config com2sec 'private' - option secname 'rw' - option source 'localhost' - option community 'private' - -config group 'public_v1' - option group 'public' - option version 'v1' - option secname 'ro' - -config group 'public_v2c' - option group 'public' - option version 'v2c' - option secname 'ro' - -config group 'public_usm' - option group 'public' - option version 'usm' - option secname 'ro' - -config group 'private_v1' - option group 'private' - option version 'v1' - option secname 'rw' - -config group 'private_v2c' - option group 'private' - option version 'v2c' - option secname 'rw' - -config group 'private_usm' - option group 'private' - option version 'usm' - option secname 'rw' - -config view 'all' - option viewname 'all' - option type 'included' - option oid '.1' - -config access 'public_access' - option group 'public' - option context 'none' - option version 'any' - option level 'noauth' - option prefix 'exact' - option read 'all' - option write 'none' - option notify 'none' - -config access 'private_access' - option group 'private' - option context 'none' - option version 'any' - option level 'noauth' - option prefix 'exact' - option read 'all' - option write 'all' - option notify 'all' - -config system - option sysLocation 'office' - option sysContact 'bofh@example.com' - option sysName 'OpenMPTCProuter' - -config exec - option name 'filedescriptors' - option prog '/bin/cat' - option args '/proc/sys/fs/file-nr' - -config engineid - option engineidtype '3' - option engineidnic 'eth0' - -config snmpd 'general' - list network 'lan' - option enabled '0' - option ipv6cpipv4 '1' - diff --git a/luci-app-snmpd/root/etc/init.d/snmpd b/luci-app-snmpd/root/etc/init.d/snmpd deleted file mode 100755 index 39fc71445..000000000 --- a/luci-app-snmpd/root/etc/init.d/snmpd +++ /dev/null @@ -1,349 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2008 OpenWrt.org -START=50 - -USE_PROCD=1 -PROG="/usr/sbin/snmpd" - -CONFIGFILE="/var/run/snmpd.conf" - -snmpd_agent_add() { - local cfg="$1" - - config_get agentaddress "$cfg" agentaddress - [ -n "$agentaddress" ] || return 0 - echo "agentaddress $agentaddress" >> $CONFIGFILE -} - -snmpd_agentx_add() { - local cfg="$1" - echo "master agentx" >> $CONFIGFILE - config_get agentxsocket "$cfg" agentxsocket - [ -n "$agentxsocket" ] && echo "agentXSocket $agentxsocket" >> $CONFIGFILE -} - -snmpd_system_add() { - local cfg="$1" - config_get syslocation "$cfg" sysLocation - [ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $CONFIGFILE - config_get syscontact "$cfg" sysContact - [ -n "$syscontact" ] && echo "sysContact $syscontact" >> $CONFIGFILE - config_get sysname "$cfg" sysName - [ -n "$sysname" ] && echo "sysName $sysname" >> $CONFIGFILE - config_get sysservice "$cfg" sysService - [ -n "$sysservice" ] && echo "sysService $sysservice" >> $CONFIGFILE - config_get sysdescr "$cfg" sysDescr - [ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $CONFIGFILE - config_get sysobjectid "$cfg" sysObjectID - [ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $CONFIGFILE -} - -snmpd_com2sec_add() { - local cfg="$1" - config_get secname "$cfg" secname - [ -n "$secname" ] || return 0 - config_get source "$cfg" source - [ -n "$source" ] || return 0 - config_get community "$cfg" community - [ -n "$community" ] || return 0 - echo "com2sec $secname $source $community" >> $CONFIGFILE -} - -snmpd_com2sec6_add() { - local cfg="$1" - config_get secname "$cfg" secname - [ -n "$secname" ] || return 0 - config_get source "$cfg" source - [ -n "$source" ] || return 0 - config_get community "$cfg" community - [ -n "$community" ] || return 0 - echo "com2sec6 $secname $source $community" >> $CONFIGFILE -} - -snmpd_group_add() { - local cfg="$1" - config_get group "$cfg" group - [ -n "$group" ] || return 0 - config_get version "$cfg" version - [ -n "$version" ] || return 0 - config_get secname "$cfg" secname - [ -n "$secname" ] || return 0 - echo "group $group $version $secname" >> $CONFIGFILE -} - -snmpd_view_add() { - local cfg="$1" - config_get viewname "$cfg" viewname - [ -n "$viewname" ] || return 0 - config_get type "$cfg" type - [ -n "$type" ] || return 0 - config_get oid "$cfg" oid - [ -n "$oid" ] || return 0 - # optional mask - config_get mask "$cfg" mask - echo "view $viewname $type $oid $mask" >> $CONFIGFILE -} - -snmpd_access_add() { - local cfg="$1" - config_get group "$cfg" group - [ -n "$group" ] || return 0 - config_get context "$cfg" context - [ -n $context ] || return 0 - [ "$context" == "none" ] && context='""' - config_get version "$cfg" version - [ -n "$version" ] || return 0 - config_get level "$cfg" level - [ -n "$level" ] || return 0 - config_get prefix "$cfg" prefix - [ -n "$prefix" ] || return 0 - config_get read "$cfg" read - [ -n "$read" ] || return 0 - config_get write "$cfg" write - [ -n "$write" ] || return 0 - config_get notify "$cfg" notify - [ -n "$notify" ] || return 0 - echo "access $group $context $version $level $prefix $read $write $notify" >> $CONFIGFILE -} - -snmpd_trap_hostname_add() { - local cfg="$1" - config_get hostname "$cfg" HostName - config_get port "$cfg" Port - config_get community "$cfg" Community - config_get type "$cfg" Type - echo "$type $hostname $community $port" >> $CONFIGFILE -} - -snmpd_trap_ip_add() { - local cfg="$1" - config_get host_ip "$cfg" HostIP - config_get port "$cfg" Port - config_get community "$cfg" Community - config_get type "$cfg" Type - echo "$type $host_ip $community $port" >> $CONFIGFILE -} - -snmpd_access_default_add() { - local cfg="$1" - config_get mode "$cfg" Mode - config_get community "$cfg" CommunityName - config_get oidrestrict "$cfg" RestrictOID - config_get oid "$cfg" RestrictedOID - echo -n "$mode $community default" >> $CONFIGFILE - [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE - [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE -} - -snmpd_access_HostName_add() { - local cfg="$1" - config_get hostname "$cfg" HostName - config_get mode "$cfg" Mode - config_get community "$cfg" CommunityName - config_get oidrestrict "$cfg" RestrictOID - config_get oid "$cfg" RestrictedOID - echo -n "$mode $community $hostname" >> $CONFIGFILE - [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE - [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE -} - -snmpd_access_HostIP_add() { - local cfg="$1" - config_get host_ip "$cfg" HostIP - config_get ip_mask "$cfg" IPMask - config_get mode "$cfg" Mode - config_get community "$cfg" CommunityName - config_get oidrestrict "$cfg" RestrictOID - config_get oid "$cfg" RestrictedOID - echo -n "$mode $community $host_ip/$ip_mask" >> $CONFIGFILE - [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE - [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE -} - -snmpd_pass_add() { - local cfg="$1" - local pass='pass' - - config_get miboid "$cfg" miboid - [ -n "$miboid" ] || return 0 - config_get prog "$cfg" prog - [ -n "$prog" ] || return 0 - config_get_bool persist "$cfg" persist 0 - [ $persist -ne 0 ] && pass='pass_persist' - config_get priority "$cfg" priority - priority=${priority:+-p $priority} - echo "$pass $priority $miboid $prog" >> $CONFIGFILE -} - -snmpd_exec_add() { - local cfg="$1" - - config_get name "$cfg" name - [ -n "$name" ] || return 0 - config_get prog "$cfg" prog - [ -n "$prog" ] || return 0 - config_get args "$cfg" args - config_get miboid "$cfg" miboid - echo "exec $miboid $name $prog $args" >> $CONFIGFILE -} - -snmpd_disk_add() { - local cfg="$1" - local disk='disk' - - config_get partition "$cfg" partition - [ -n "$partition" ] || return 0 - config_get size "$cfg" size - [ -n "$size" ] || return 0 - echo "$disk $partition $size" >> $CONFIGFILE -} - -snmpd_engineid_add() { - local cfg="$1" - - config_get engineid "$cfg" engineid - [ -n "$engineid" ] && echo "engineID $engineid" >> $CONFIGFILE - config_get engineidtype "$cfg" engineidtype - [ "$engineidtype" -ge 1 -a "$engineidtype" -le 3 ] && \ - echo "engineIDType $engineidtype" >> $CONFIGFILE - config_get engineidnic "$cfg" engineidnic - [ -n "$engineidnic" ] && echo "engineIDNic $engineidnic" >> $CONFIGFILE -} - -snmpd_sink_add() { - local cfg="$1" - local section="$2" - local community - local port - local host - - config_get host "$cfg" host - [ -n "section" -a -n "$host" ] || return 0 - # optional community - config_get community "$cfg" community - # optional port - config_get port "$cfg" port - port=${port:+:$port} - echo "$section $host$port $community" >> $CONFIGFILE -} - -append_parm() { - local section="$1" - local option="$2" - local switch="$3" - local _loctmp - config_get _loctmp "$section" "$option" - [ -z "$_loctmp" ] && return 0 - echo "$switch $_loctmp" >> $CONFIGFILE -} - -append_authtrapenable() { - local section="$1" - local option="$2" - local switch="$3" - local _loctmp - config_get_bool _loctmp "$section" "$option" - [ -z "$_loctmp" ] && return 0 - [ "$_loctmp" -gt 0 ] && echo "$switch $_loctmp" >> $CONFIGFILE -} - -snmpd_setup_fw_rules() { - local net="$1" - local zone - - zone=$(fw3 -q network "$net" 2>/dev/null) - - local handled_zone - for handled_zone in $HANDLED_SNMP_ZONES; do - [ "$handled_zone" = "$zone" ] && return - done - - json_add_object "" - json_add_string type rule - json_add_string src "$zone" - json_add_string proto udp - json_add_string dest_port 161 - json_add_string target ACCEPT - json_close_object - - HANDLED_SNMP_ZONES="$HANDLED_SNMP_ZONES $zone" -} - -start_service() { - [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE" - - config_load snmpd - - config_get_bool snmp_enabled general enabled 1 - [ "$snmp_enabled" -eq 0 ] && return - - procd_open_instance - - config_foreach snmpd_agent_add agent - config_foreach snmpd_agentx_add agentx - config_foreach snmpd_system_add system - config_foreach snmpd_com2sec_add com2sec - if [ "$(uci -q get snmpd.general.ipv6cpipv4)" = "1" ]; then - config_foreach snmpd_com2sec6_add com2sec - else - config_foreach snmpd_com2sec6_add com2sec6 - fi - config_foreach snmpd_group_add group - config_foreach snmpd_view_add view - config_foreach snmpd_access_add access - config_foreach snmpd_trap_hostname_add trap_HostName - config_foreach snmpd_trap_ip_add trap_HostIP - config_foreach snmpd_access_default_add access_default - config_foreach snmpd_access_HostName_add access_HostName - config_foreach snmpd_access_HostIP_add access_HostIP - config_foreach snmpd_pass_add pass - config_foreach snmpd_exec_add exec - config_foreach snmpd_disk_add disk - config_foreach snmpd_engineid_add engineid - append_parm trapcommunity community trapcommunity - config_foreach snmpd_sink_add trapsink trapsink - config_foreach snmpd_sink_add trap2sink trap2sink - config_foreach snmpd_sink_add informsink informsink - append_authtrapenable authtrapenable enable authtrapenable - append_parm v1trapaddress host v1trapaddress - append_parm trapsess trapsess trapsess - - procd_set_param command $PROG -Lf /dev/null -f - procd_set_param file $CONFIGFILE - procd_set_param respawn - - for iface in $(ls /sys/class/net 2>/dev/null); do - procd_append_param netdev "$iface" - done - - procd_open_data - - json_add_array firewall - config_list_foreach general network snmpd_setup_fw_rules - json_close_array - - procd_close_data - - procd_close_instance -} - -stop_service() { - [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE" - procd_set_config_changed firewall -} - -service_triggers(){ - local script=$(readlink "$initscript") - local name=$(basename ${script:-$initscript}) - - procd_open_trigger - procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload - procd_close_trigger - - procd_add_reload_trigger 'snmpd' -} - -service_started() { - [ "$snmp_enabled" -eq 0 ] && return - procd_set_config_changed firewall -} diff --git a/luci-app-snmpd/root/etc/uci-defaults/4400-snmpd b/luci-app-snmpd/root/etc/uci-defaults/4400-snmpd deleted file mode 100755 index 8c6f6a547..000000000 --- a/luci-app-snmpd/root/etc/uci-defaults/4400-snmpd +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -if [ "$(uci -q get snmpd.general.network)" = "" ]; then - uci -q batch <<-EOF >/dev/null - add_list snmpd.general.network=lan - set snmpd.@system[0].sysName="OpenMPTCProuter" - set snmpd.general.enabled=0 - commit snmpd - EOF -fi - -uci -q batch <<-EOF >/dev/null - delete ucitrack.@snmpd[-1] - add ucitrack snmpd - set ucitrack.@snmpd[-1].init=snmpd - commit ucitrack -EOF - -rm -f /tmp/luci-indexcache -exit 0 \ No newline at end of file diff --git a/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json b/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json old mode 100755 new mode 100644 index 771c4021a..85850a218 --- a/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json +++ b/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json @@ -1,13 +1,13 @@ { - "admin/network/snmpd": { - "title": "SNMPd", - "order": 91, + "admin/services/snmpd": { + "title": "SNMPD", "action": { - "type": "cbi", - "path": "snmpd" + "type": "view", + "path": "snmpd/snmpd" }, "depends": { - "acl": [ "luci-app-snmpd" ] + "acl": [ "luci-app-snmpd" ], + "uci": { "snmpd": true } } } } diff --git a/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json b/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json old mode 100755 new mode 100644 index 1fc168524..566e52139 --- a/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json +++ b/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json @@ -1,11 +1,11 @@ { - "luci-app-snmpd": { - "description": "Grant UCI access for luci-app-snmpd", - "read": { - "uci": [ "snmpd" ] - }, - "write": { - "uci": [ "snmpd" ] + "luci-app-snmpd": { + "description": "Grant UCI access for luci-app-snmpd", + "read": { + "uci": [ "snmpd" ] + }, + "write": { + "uci": [ "snmpd" ] + } } - } -} \ No newline at end of file +} diff --git a/luci-mod-dashboard/Makefile b/luci-mod-dashboard/Makefile old mode 100755 new mode 100644 index 6a6d84166..4a9aec96f --- a/luci-mod-dashboard/Makefile +++ b/luci-mod-dashboard/Makefile @@ -1,11 +1,8 @@ # # Copyright 2019-2020 ZHANG Zhao -# Copyright 2020 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the Apache License, Version 2.0 . # -# Based on openwrt luci commit 03c77dafe3cfb922b995adfe9c0f8a75c98a18af -# include $(TOPDIR)/rules.mk diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css old mode 100755 new mode 100644 index f20713832..66dd81f79 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css +++ b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css @@ -8,7 +8,6 @@ .Dashboard h3 { color:#000; - background: transparent; } .Dashboard hr { @@ -21,7 +20,7 @@ } .Dashboard .box-s1 { - min-height: 550px; + min-height: 466px; } .Dashboard .internet-status-self .internet-status-info .title { @@ -33,13 +32,6 @@ background-color: #e0e0e0; } -.Dashboard div > table > tbody > tr:nth-of-type(2n), div > .table > .tr:nth-of-type(2n) { - background-color: transparent; -} -.Dashboard .tr { - background-color: transparent; -} - .Dashboard .title { text-align: center; } @@ -109,11 +101,11 @@ } .Dashboard .internet-status-self .settings-info p:first-child span:first-child{ - font-size: 12px; + font-size: 15px; font-weight: 500; } -//.Dashboard .internet-status-self .settings-info p:first-child span:first-child, +.Dashboard .internet-status-self .settings-info p:nth-child(2) span:first-child, .Dashboard .router-status-wifi .wifi-info .settings-info p:first-child span:first-child, .Dashboard .router-status-wifi .wifi-info .settings-info p:nth-child(2) span:first-child{ font-weight: 700; @@ -128,10 +120,11 @@ .Dashboard .settings-info p span:nth-child(2){ display: inline-block; word-break: break-all; - overflow: hidden; - max-height: 16px; - position: relative; - top:2px; +} + +.Dashboard .settings-info p span:nth-child(2).label { + padding: 1px 4px 1px 4px; + font-size: 9.75px; } .Dashboard .router-status-info .settings-info p span:nth-child(2){ @@ -199,14 +192,6 @@ border-bottom:1px solid rgba(0,0,0,.1); } -.Dashboard .label-success { - background-color: green; -} - -.Dashboard .label-danger { - background-color: red; -} - /** * Responsive **/ diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js old mode 100755 new mode 100644 index cf69d4d0e..c43e2ca54 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js +++ b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js @@ -14,24 +14,16 @@ var callSystemInfo = rpc.declare({ method: 'info' }); -var callOpenMPTCProuterInfo = rpc.declare({ - object: 'openmptcprouter', - method: 'status' -}); - - return baseclass.extend({ params: [], - formatBytes: function(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"][d]}, load: function() { return Promise.all([ network.getWANNetworks(), network.getWAN6Networks(), L.resolveDefault(callSystemBoard(), {}), - L.resolveDefault(callSystemInfo(), {}), - L.resolveDefault(callOpenMPTCProuterInfo(), {}) + L.resolveDefault(callSystemInfo(), {}) ]); }, @@ -44,7 +36,7 @@ return baseclass.extend({ var container_item = E('div', { 'class': 'settings-info'}); if ('internet' == type) { - icon = (data.internet.v4.connected.value || data.internet.v6.connected.value) ? type : 'not-internet'; + icon = (data.v4.connected.value || data.v6.connected.value) ? type : 'not-internet'; } container_box.appendChild(E('div', { 'class': 'title'}, [ @@ -60,45 +52,19 @@ return baseclass.extend({ container_box.appendChild(E('hr')); if ('internet' == type) { - var container_internet_v4 = E('div'); var container_internet_v6 = E('div'); - var container_internet_vps = E('div'); - for(var idx in data['vps']) { - var classname = ver, - suppelements = '', - visible = data['vps'][idx].visible; - if ('title' === idx) { - container_internet_vps.appendChild( - E('p', { 'class': 'mt-2'}, [ - E('h4', {'class': ''}, [ data['vps'].title ]), - ]) - ); - continue; - } - if (visible) { - container_internet_vps.appendChild( - E('p', { 'class': 'mt-2'}, [ - E('span', {'class': ''}, [ data['vps'][idx].title + ':' ]), - E('span', {'class': ''}, [ data['vps'][idx].value ]), - suppelements - ]) - ); - } - } + for(var idx in data) { - - for(var idx in data['internet']) { - - for(var ver in data['internet'][idx]) { + for(var ver in data[idx]) { var classname = ver, suppelements = '', - visible = data['internet'][idx][ver].visible; + visible = data[idx][ver].visible; if('connected' === ver) { - classname = data['internet'][idx][ver].value ? 'label label-success' : 'label label-danger'; - data['internet'][idx][ver].value = data['internet'][idx][ver].value ? _('yes') : _('no'); + classname = data[idx][ver].value ? 'label label-success' : 'label label-danger'; + data[idx][ver].value = data[idx][ver].value ? _('yes') : _('no'); } if ('v4' === idx) { @@ -106,17 +72,17 @@ return baseclass.extend({ if ('title' === ver) { container_internet_v4.appendChild( E('p', { 'class': 'mt-2'}, [ - E('h4', {'class': ''}, [ data['internet'][idx].title ]), + E('span', {'class': ''}, [ data[idx].title ]), ]) ); continue; } if ('addrsv4' === ver) { - var addrs = data['internet'][idx][ver].value; + var addrs = data[idx][ver].value; if(Array.isArray(addrs) && addrs.length) { for(var ip in addrs) { - data['internet'][idx][ver].value = addrs[ip].split('/')[0]; + data[idx][ver].value = addrs[ip].split('/')[0]; } } } @@ -124,8 +90,8 @@ return baseclass.extend({ if (visible) { container_internet_v4.appendChild( E('p', { 'class': 'mt-2'}, [ - E('span', {'class': ''}, [ data['internet'][idx][ver].title + ':' ]), - E('span', {'class': classname }, [ data['internet'][idx][ver].value ]), + E('span', {'class': ''}, [ data[idx][ver].title + ':' ]), + E('span', {'class': classname }, [ data[idx][ver].value ]), suppelements ]) ); @@ -136,7 +102,7 @@ return baseclass.extend({ if ('title' === ver) { container_internet_v6.appendChild( E('p', { 'class': 'mt-2'}, [ - E('h4', {'class': ''}, [ data['internet'][idx].title ]), + E('span', {'class': ''}, [ data[idx].title ]), ]) ); continue; @@ -145,8 +111,8 @@ return baseclass.extend({ if (visible) { container_internet_v6.appendChild( E('p', {'class': 'mt-2'}, [ - E('span', {'class': ''}, [data['internet'][idx][ver].title + ':']), - E('span', {'class': classname}, [data['internet'][idx][ver].value]), + E('span', {'class': ''}, [data[idx][ver].title + ':']), + E('span', {'class': classname}, [data[idx][ver].value]), suppelements ]) ); @@ -155,19 +121,8 @@ return baseclass.extend({ } } - container_item.appendChild(E('p', { 'class': 'table'}, [ - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td' }, [ container_internet_vps ]) - ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td' }, [ - container_internet_v4 - ]), - E('div', { 'class': 'td' }, [ - container_internet_v6 - ]) - ]) - ])); + container_item.appendChild(container_internet_v4); + container_item.appendChild(container_internet_v6); } else { for(var idx in data) { container_item.appendChild( @@ -186,10 +141,13 @@ return baseclass.extend({ }, renderUpdateWanData: function(data, v6) { + for (var i = 0; i < data.length; i++) { var ifc = data[i]; if (v6) { + var uptime = ifc.getUptime(); + this.params.internet.v6.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-'; this.params.internet.v6.ipprefixv6.value = ifc.getIP6Prefix() || '-'; this.params.internet.v6.gatewayv6.value = ifc.getGateway6Addr() || '-'; this.params.internet.v6.protocol.value= ifc.getI18n() || E('em', _('Not connected')); @@ -207,115 +165,102 @@ return baseclass.extend({ } } }, - renderUpdateOpenMPTCProuterData: function(data, v6) { - if (data.openmptcprouter != undefined) { - if (data.openmptcprouter.wan_addr != '') this.params.omrvps.internet.v4.connected.value = true; - if (data.openmptcprouter.wan_addr) this.params.omrvps.internet.v4.addrsv4.value = data.openmptcprouter.wan_addr || [ '-']; - if (data.openmptcprouter.wan_addr6) this.params.omrvps.internet.v6.addrsv6.value = data.openmptcprouter.wan_addr6 || [ '-']; - if (data.openmptcprouter.vps_kernel) this.params.omrvps.vps.version.value = data.openmptcprouter.vps_kernel + ' ' + data.openmptcprouter.vps_omr_version || [ '-']; - if (data.openmptcprouter.vps_loadavg) { - var vps_loadavg = data.openmptcprouter.vps_loadavg.split(" "); - this.params.omrvps.vps.load.value = '%s, %s, %s'.format(vps_loadavg[0],vps_loadavg[1],vps_loadavg[2]); - } - if (data.openmptcprouter.vps_uptime) this.params.omrvps.vps.uptime.value = String.format('%t', data.openmptcprouter.vps_uptime) || [ '-']; - if (data.openmptcprouter.proxy_traffic) this.params.omrvps.vps.trafficproxy.value = this.formatBytes(data.openmptcprouter.proxy_traffic) || [ '-']; - if (data.openmptcprouter.vpn_traffic) this.params.omrvps.vps.trafficvpn.value = this.formatBytes(data.openmptcprouter.vpn_traffic) || [ '-']; - if (data.openmptcprouter.total_traffic) this.params.omrvps.vps.traffictotal.value = this.formatBytes(data.openmptcprouter.total_traffic) || [ '-']; - if (data.openmptcprouter.ipv6 != 'disabled') this.params.omrvps.internet.v6.connected.value = true; - } - }, renderInternetBox: function(data) { - this.params.omrvps = { - vps: { - title: _('Server'), + this.params.internet = { - version: { - title: _('Version'), - visible: true, - value: [ '-' ] - }, + v4: { + title: _('IPv4 Internet'), - load: { - title: _('Load'), + connected: { + title: _('Connected'), visible: true, - value: [ '-' ] + value: false }, uptime: { title: _('Uptime'), visible: true, - value: [ '-' ] + value: '-' }, - trafficproxy: { - title: _('Proxy traffic'), + protocol: { + title: _('Protocol'), + visible: true, + value: '-' + }, + + addrsv4: { + title: _('IPv4'), visible: true, value: [ '-' ] }, - trafficvpn: { - title: _('VPN traffic'), + gatewayv4: { + title: _('GatewayV4'), visible: true, - value: [ '-' ] + value: '-' }, - traffictotal: { - title: _('Total traffic'), + dnsv4: { + title: _('DNSv4'), visible: true, - value: [ '-' ] + value: ['-'] } }, - internet: { + v6: { + title: _('IPv6 Internet'), - v4: { - title: _('IPv4 Internet'), - - connected: { - title: _('Connected'), - visible: true, - value: false - }, - - addrsv4: { - title: _('IPv4'), - visible: true, - value: [ '-' ] - } + connected: { + title: _('Connected'), + visible: true, + value: false }, - v6: { - title: _('IPv6 Internet'), + uptime: { + title: _('Uptime'), + visible: true, + value: '-' + }, - connected: { - title: _('Connected'), - visible: true, - value: false - }, + protocol: { + title: _('Protocol'), + visible: true, + value: ' - ' + }, - ipprefixv6 : { - title: _('IPv6 prefix'), - visible: false, - value: ' - ' - }, + ipprefixv6 : { + title: _('IPv6 prefix'), + visible: true, + value: ' - ' + }, - addrsv6: { - title: _('IPv6'), - visible: true, - value: [ '-' ] - } + addrsv6: { + title: _('IPv6'), + visible: false, + value: [ '-' ] + }, + gatewayv6: { + title: _('GatewayV6'), + visible: true, + value: '-' + }, + + dnsv6: { + title: _('DNSv6'), + visible: true, + value: [ '-' ] } } }; - //this.renderUpdateWanData(data[0], false); - //this.renderUpdateWanData(data[1], true); - this.renderUpdateOpenMPTCProuterData(data[4], true); + this.renderUpdateWanData(data[0], false); + this.renderUpdateWanData(data[1], true); - return this.renderHtml(this.params.omrvps, 'internet'); + return this.renderHtml(this.params.internet, 'internet'); }, renderRouterBox: function(data) { @@ -349,11 +294,6 @@ return baseclass.extend({ value: datestr }, - load: { - title: _('Load Average'), - value: Array.isArray(systeminfo.load) ? '%.2f, %.2f, %.2f'.format(systeminfo.load[0] / 65535.0,systeminfo.load[1] / 65535.0,systeminfo.load[2] / 65535.0) : null - }, - kernel: { title: _('Kernel Version'), value: boardinfo.kernel @@ -371,7 +311,7 @@ return baseclass.extend({ release: { title: _('Firmware Version'), - value: (typeof boardinfo.release !== "undefined") ? ((typeof boardinfo.release.description !== "undefined") ? boardinfo.release.description : null) : null + value: boardinfo.release.description } }; diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js old mode 100755 new mode 100644 index c673fa681..9f4edce28 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js +++ b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js @@ -70,13 +70,11 @@ return baseclass.extend({ ])); } - if (this.params.lan.devices.length > 0) { - container_box.appendChild(E('hr')); - container_box.appendChild(container_devices); - container_box.appendChild(E('hr')); - container_box.appendChild(container_deviceslist); - container_wapper.appendChild(container_box); - } + container_box.appendChild(E('hr')); + container_box.appendChild(container_devices); + container_box.appendChild(E('hr')); + container_box.appendChild(container_deviceslist); + container_wapper.appendChild(container_box); return container_wapper; }, diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js old mode 100755 new mode 100644 index fe5e843f0..318c3abf8 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js +++ b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js @@ -78,20 +78,20 @@ return baseclass.extend({ container_box.appendChild(container_radio); - var container_devices = E('div', { 'class': 'table assoclist devices-info' }, [ - E('div', { 'class': 'tr table-titles dashboard-bg' }, [ - E('div', { 'class': 'th nowrap' }, _('Hostname')), - E('div', { 'class': 'th' }, _('Wireless')), - E('div', { 'class': 'th' }, _('Signal')), - E('div', { 'class': 'th' }, '%s / %s'.format( _('Up.'), _('Down.'))) + var container_devices = E('table', { 'class': 'table assoclist devices-info' }, [ + E('tr', { 'class': 'tr table-titles dashboard-bg' }, [ + E('th', { 'class': 'th nowrap' }, _('Hostname')), + E('th', { 'class': 'th' }, _('Wireless')), + E('th', { 'class': 'th' }, _('Signal')), + E('th', { 'class': 'th' }, '%s / %s'.format( _('Up.'), _('Down.'))) ]) ]); var container_devices_item; - var container_devices_list = E('div', { 'class': 'table assoclist devices-info' }); + var container_devices_list = E('table', { 'class': 'table assoclist devices-info' }); for (var i =0; i < this.params.wifi.devices.length; i++) { - container_devices_item = E('div', { 'class': 'tr cbi-rowstyle-1' }); + container_devices_item = E('tr', { 'class': 'tr cbi-rowstyle-1' }); for(var idx in this.params.wifi.devices[i]) { var device = this.params.wifi.devices[i]; @@ -109,7 +109,7 @@ return baseclass.extend({ ]) ]); } else if ('rate' == idx) { - container_content = E('div', { 'class': 'td device-info' }, [ + container_content = E('td', { 'class': 'td device-info' }, [ E('p', {}, [ E('span', { 'class': ''}, [ device[idx].value.rx ]), E('br'), @@ -117,7 +117,7 @@ return baseclass.extend({ ]) ]); } else { - container_content = E('div', { 'class': 'td device-info'}, [ + container_content = E('td', { 'class': 'td device-info'}, [ E('p', {}, [ E('span', { 'class': ''}, [ device[idx].value ]), ]) @@ -130,13 +130,11 @@ return baseclass.extend({ container_devices_list.appendChild(container_devices_item); } - if (this.params.wifi.devices.length > 0) { - container_devices.appendChild(container_devices_list); - container_box.appendChild(E('hr')); - container_box.appendChild(container_devices); - container_box.appendChild(container_devices_list); - container_wapper.appendChild(container_box); - } + container_devices.appendChild(container_devices_list); + container_box.appendChild(E('hr')); + container_box.appendChild(container_devices); + container_box.appendChild(container_devices_list); + container_wapper.appendChild(container_box); return container_wapper; }, @@ -149,7 +147,7 @@ return baseclass.extend({ for (var j = 0; j < network_items.length; j++) { var net = network_items[j], is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()), - chan = net.getChannel(), + chan = net.getChannel(), freq = net.getFrequency(), rate = net.getBitRate(); @@ -264,6 +262,8 @@ return baseclass.extend({ this.renderUpdateData(data[0], data[1], data[2]); - return this.renderHtml(); + if (this.params.wifi.radios.length) + return this.renderHtml(); + return E([]); } }); diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/po/ar/dashboard.po b/luci-mod-dashboard/po/ar/dashboard.po new file mode 100644 index 000000000..41ecc7e3a --- /dev/null +++ b/luci-mod-dashboard/po/ar/dashboard.po @@ -0,0 +1,215 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/bg/dashboard.po b/luci-mod-dashboard/po/bg/dashboard.po new file mode 100644 index 000000000..2a7df7bb6 --- /dev/null +++ b/luci-mod-dashboard/po/bg/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-08-27 12:56+0000\n" +"Last-Translator: Iskren Mihaylov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.8.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Активен" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Архитектура" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Битрейт" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Канал" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Свързан" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP Устройства" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Табло" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Устройства" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Свързани устройства" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Долу." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Сваляне" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Криптиране" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Версия на firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "ГейтауейV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Разрешаване достъп до DHCP статус екран" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Разрешаване достъп до главен статус екран" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Разрешаване достъп до екран със системни маршрути" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Разрешаване достъп до екран с безжичен статус" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Хостнейм" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP адрес" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Интернет" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Интернет" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 префикс" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Интернет" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Версия на ядрото" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Местно време" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Модел" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Не е свързан" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Протокол" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Сигнал" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Система" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Горе." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Качване" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Ъптайм" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Безжичен" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "не" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "да" + +#~ msgid "Connected since" +#~ msgstr "Свързан от" diff --git a/luci-mod-dashboard/po/bn_BD/dashboard.po b/luci-mod-dashboard/po/bn_BD/dashboard.po new file mode 100644 index 000000000..b168d00a2 --- /dev/null +++ b/luci-mod-dashboard/po/bn_BD/dashboard.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-10-08 17:53+0000\n" +"Last-Translator: Rayhan Nabi \n" +"Language-Team: Bengali (Bangladesh) \n" +"Language: bn_BD\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "হোস্টনেম" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "আইপি এড্রেস" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "প্রোটোকল" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "সংকেত" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "সিস্টেম" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/ca/dashboard.po b/luci-mod-dashboard/po/ca/dashboard.po new file mode 100644 index 000000000..9f2a47c1d --- /dev/null +++ b/luci-mod-dashboard/po/ca/dashboard.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-03-08 10:38+0000\n" +"Last-Translator: Roger Pueyo Centelles \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.16.2-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Actiu" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arquitectura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Dispositius" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Puja" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/cs/dashboard.po b/luci-mod-dashboard/po/cs/dashboard.po new file mode 100644 index 000000000..1510f26db --- /dev/null +++ b/luci-mod-dashboard/po/cs/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-01-18 00:56+0000\n" +"Last-Translator: Lukáš Wagner \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktivní" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architektura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Přenosová rychlost" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanál" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Připojeno" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP zařízení" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Řídicí panel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Zařízení" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Připojená zařízení" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Šifrování" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Verze firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "Brána v4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "Brána v6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Poskytnout přístup k zobrazení stavu DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Poskytnout přístup k zobrazení stavu bezdrátové sítě" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Název počítače" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP adresa" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Verze kernelu" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Místní čas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Nepřipojeno" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signál" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Systém" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Doba běhu" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Bezdrátová síť" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "ne" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ano" + +#~ msgid "Connected since" +#~ msgstr "Připojeno od" diff --git a/luci-mod-dashboard/po/da/dashboard.po b/luci-mod-dashboard/po/da/dashboard.po new file mode 100644 index 000000000..7fe4cc1ec --- /dev/null +++ b/luci-mod-dashboard/po/da/dashboard.po @@ -0,0 +1,220 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-12-08 22:46+0000\n" +"Last-Translator: drax red \n" +"Language-Team: Danish \n" +"Language: da\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.10-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktiv" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arkitektur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Tilsluttet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP-enheder" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Dashboard" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Enheder" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Enheder tilsluttet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Ned." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Download" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Kryptering" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Firmware-version" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Giver adgang til visning af DHCP-status" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Giver adgang til hovedstatusdisplayet" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Giv adgang til systemets rutestatus" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Giv adgang til trådløs statusvisning" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Værtsnavn" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP-adresse" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6-præfiks" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Kerneversion" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Lokal tid" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Ikke tilsluttet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "System" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Op." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Upload" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Oppetid" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Trådløs" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nej" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ja" + +#~ msgid "Connected since" +#~ msgstr "Tilsluttet siden" diff --git a/luci-mod-dashboard/po/de/dashboard.po b/luci-mod-dashboard/po/de/dashboard.po new file mode 100644 index 000000000..dbcd01a92 --- /dev/null +++ b/luci-mod-dashboard/po/de/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-20 16:23+0000\n" +"Last-Translator: ssantos \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18.1\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktiv" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architektur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Verbunden" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP-Geräte" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Übersicht" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Geräte" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Verbundene Geräte" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Runter." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Herunterladen" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Verschlüsselung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Firmware-Version" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Zugriff auf die DHCP-Statusanzeige gewähren" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Zugriff zur Hauptstatusanzeige gewähren" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Zugriff auf den Status der Systemroute gewähren" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Zugriff auf Wireless-Statusanzeige gewähren" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Hostname" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP-Adresse" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4-Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6-Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6-Präfix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Kernel-Version" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Ortszeit" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modell" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Nicht verbunden" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokoll" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "System" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Aktiv." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Hochladen" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Laufzeit" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "WLAN" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nein" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ja" + +#~ msgid "Connected since" +#~ msgstr "Verbunden seit" diff --git a/luci-mod-dashboard/po/el/dashboard.po b/luci-mod-dashboard/po/el/dashboard.po new file mode 100644 index 000000000..905dc71db --- /dev/null +++ b/luci-mod-dashboard/po/el/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-05-15 17:04+0000\n" +"Last-Translator: MarioK239 \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.13-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Ενεργό" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Αρχιτεκτονική" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Ρυθμός bit" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Κανάλι" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Συνδεδεμένο" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Συσκευές DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Ταμπλό" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Συσκευές" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Συσκευές Συνδεδεμένες" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Κάτω." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Λήψη" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Κρυπτογράφηση" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Έκδοση υλικολογισμικού" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Παραχωρήστε πρόσβαση στην οθόνη κατάστασης DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Παραχωρήστε πρόσβαση στην κύρια οθόνη κατάστασης" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Παραχωρήστε πρόσβαση στην κατάσταση διαδρομής συστήματος" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Παραχωρήστε πρόσβαση στην οθόνη ασύρματης κατάστασης" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Hostname" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Διεύθυνση IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Ίντερνετ IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Ίντερνετ IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Πρόθεμα IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Διαδίκτυο" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Έκδοση kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Τοπική ώρα" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Μοντέλο" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Μη συνδεδεμένο" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Πρωτόκολλο" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Σήμα" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Σύστημα" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Πάνω." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Μεταφόρτωση" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Χρόνος λειτουργίας" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Ασύρματο" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "όχι" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ναί" + +#~ msgid "Connected since" +#~ msgstr "Συνδεδεμένο από" diff --git a/luci-mod-dashboard/po/en/dashboard.po b/luci-mod-dashboard/po/en/dashboard.po new file mode 100644 index 000000000..80f51b65f --- /dev/null +++ b/luci-mod-dashboard/po/en/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-06-24 07:45+0000\n" +"Last-Translator: Hannu Nyman \n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.7.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Active" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architecture" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Channel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Connected" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP Devices" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Dashboard" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Devices" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Devices Connected" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Down." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Download" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Encryption" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Firmware Version" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Grant access to DHCP status display" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Grant access to main status display" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Grant access to the system route status" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Grant access to wireless status display" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Hostname" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP Address" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Kernel Version" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Local Time" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Not connected" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "System" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Up." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Upload" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Uptime" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Wireless" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "no" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "yes" + +#~ msgid "Connected since" +#~ msgstr "Connected since" diff --git a/luci-mod-dashboard/po/es/dashboard.po b/luci-mod-dashboard/po/es/dashboard.po new file mode 100644 index 000000000..ac5750e29 --- /dev/null +++ b/luci-mod-dashboard/po/es/dashboard.po @@ -0,0 +1,223 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-04-17 08:10+0000\n" +"Last-Translator: Juan \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Activo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arquitectura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Tasa de bits" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Canal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Conectado" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Dispositivos DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Tablero" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Dispositivos" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Dispositivos conectados" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Desc." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Descargar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Encriptación" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versión del firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Otorgar acceso a la pantalla de estado de DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Otorgar acceso a la pantalla de estado principal" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +#, fuzzy +msgid "Grant access to the system route status" +msgstr "Otorgar acceso al estado de la ruta del sistema" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Otorgar acceso a la pantalla de estado de Wi-Fi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Nombre de host" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Dirección IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Internet IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Internet IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Prefijo IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versión del núcleo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Hora local" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modelo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "No conectado" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocolo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Señal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistema" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Carga" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Cargar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Tiempo de actividad" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Wi-Fi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "no" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "sí" + +#~ msgid "Connected since" +#~ msgstr "Conectado desde" diff --git a/luci-mod-dashboard/po/fi/dashboard.po b/luci-mod-dashboard/po/fi/dashboard.po new file mode 100644 index 000000000..7a0e80f4f --- /dev/null +++ b/luci-mod-dashboard/po/fi/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-03-13 23:17+0000\n" +"Last-Translator: Jiri Grönroos \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.12-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktiivinen" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arkkitehtuuri" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bittinopeus" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanava" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Yhdistetty" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP-laitteet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Kojelauta" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Laitteet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Yhdisteyt laitteet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Lataus" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Lataus" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Salaus" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Laiteohjelmiston versio" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Salli pääsy DHCP-tilanäyttöön" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Salli pääsy päätilanäyttöön" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Salli pääsy järjestelmän reitin tilaan" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Salli pääsy langattoman tilan näyttöön" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Laitenimi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP-osoite" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6-etuliite" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Ytimen versio" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Paikallinen aika" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Malli" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Ei yhdistetty" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokolla" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signaali" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Järjestelmä" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Lähetys" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Lähetys" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Toiminta-aika" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Langaton" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "ei" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "kyllä" + +#~ msgid "Connected since" +#~ msgstr "Yhdistetty lähtien" diff --git a/luci-mod-dashboard/po/fr/dashboard.po b/luci-mod-dashboard/po/fr/dashboard.po old mode 100755 new mode 100644 index ee91c668b..b394ddff8 --- a/luci-mod-dashboard/po/fr/dashboard.po +++ b/luci-mod-dashboard/po/fr/dashboard.po @@ -1,223 +1,222 @@ msgid "" msgstr "" -"PO-Revision-Date: 2022-02-19 07:53+0000\n" -"Last-Translator: Weblate Admin \n" -"Language-Team: French \n" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-11 13:51+0000\n" +"Last-Translator: Edouard Choinière \n" +"Language-Team: French \n" "Language: fr\n" +"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.6.1\n" +"X-Generator: Weblate 4.18-dev\n" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:165 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "Actif" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:368 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "Architecture" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" msgstr "BSSID" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" msgstr "Débit" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:236 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" msgstr "Canal" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:277 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "Connecté" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" -msgstr "Périphériques DHCP" +msgstr "Appareils DHCP" -#: luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNS v6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 msgid "Dashboard" msgstr "Tableau de bord" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:136 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" -msgstr "Périphériques" +msgstr "Appareils" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" -msgstr "Périphériques connectés" +msgstr "Appareils connectés" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." -msgstr "En panne." +msgstr "Déconnecté." -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:131 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Téléchargement" +msgstr "Télécharger" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Chiffrement" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:373 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "Version du micrologiciel" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:173 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" -msgstr "GHz" +msgstr "Ghz" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "Passerelle V4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "Passerelle V6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" msgstr "Permettre l'accès à l'affichage de l'état DHCP" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" msgstr "Permettre l'accès à l'affichage de l'état principal" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "Permettre l’accès au status de routage" +msgstr "Autoriser l'accès à l'état de l'itinéraire du système" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "Permettre l'accès du status WIFI" +msgstr "Permettre l'accès au status WIFI" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:224 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" msgstr "Nom d'hôte" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" msgstr "Adresse IP" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:283 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:116 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:274 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "Internet IPv4" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:305 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "Internet IPv6" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:299 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Préfixe IPv6" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" msgstr "Internet" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:358 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Version du noyau" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "Load" -msgstr "Charge" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:353 -msgid "Load Average" -msgstr "Charge moyenne" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:348 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "Heure locale" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" msgstr "MAC" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:121 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" -msgstr "Mac" +msgstr "MAC" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:179 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" msgstr "Mbit/s" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:363 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Modèle" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:202 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "Non connecté" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "Proxy traffic" -msgstr "Trafic proxy" +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocole" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:230 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" msgstr "SSID" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:232 -msgid "Server" -msgstr "Serveur" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" msgstr "Signal" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" msgstr "Système" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:265 -msgid "Total traffic" -msgstr "Trafic total" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." -msgstr "En ligne." +msgstr "Connecté." -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:126 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" msgstr "Téléverser" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:343 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "Temps de service" +msgstr "Disponibilité" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:259 -msgid "VPN traffic" -msgstr "Trafic VPN" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "Version" -msgstr "Version" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" -msgstr "Sans-fil" +msgstr "Sans fil" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" msgstr "non" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" msgstr "oui" + +#~ msgid "Connected since" +#~ msgstr "Connecté depuis" diff --git a/luci-mod-dashboard/po/he/dashboard.po b/luci-mod-dashboard/po/he/dashboard.po new file mode 100644 index 000000000..905bf7389 --- /dev/null +++ b/luci-mod-dashboard/po/he/dashboard.po @@ -0,0 +1,216 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/hi/dashboard.po b/luci-mod-dashboard/po/hi/dashboard.po new file mode 100644 index 000000000..dd6968663 --- /dev/null +++ b/luci-mod-dashboard/po/hi/dashboard.po @@ -0,0 +1,215 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/hu/dashboard.po b/luci-mod-dashboard/po/hu/dashboard.po new file mode 100644 index 000000000..a1e2e9eca --- /dev/null +++ b/luci-mod-dashboard/po/hu/dashboard.po @@ -0,0 +1,223 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-08-12 12:55+0000\n" +"Last-Translator: Tudós Péter \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.8-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktív" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architektúra" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitráta" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Csatorna" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Csatlakoztatott" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP eszközök" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Kezelőfelület" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Eszközök" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Csatlakozott eszközök" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Le." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Letöltés" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Titkosítás" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Firmware verzió" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "Átjáró V4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "Átjáró V6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Gépnév" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP cím" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Kernel Verzió" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Helyi idő" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modell" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Nincs csatlakoztatva" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Jel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Rendszer" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Fel." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Feltöltés" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Futási idő" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Vezeték nélküli" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nem" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "igen" + +#, fuzzy +#~ msgid "Connected since" +#~ msgstr "Ennyi ideje csatlakoztatva" diff --git a/luci-mod-dashboard/po/id/dashboard.po b/luci-mod-dashboard/po/id/dashboard.po new file mode 100644 index 000000000..084d40545 --- /dev/null +++ b/luci-mod-dashboard/po/id/dashboard.po @@ -0,0 +1,220 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2023-03-12 20:08+0000\n" +"Last-Translator: Biangkerok32 \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.16.2-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktif" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arsitektur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Terhubung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Perangkat DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Dasbor" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Perangkat" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Perangkat Terhubung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Turun." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Unduh" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Enkripsi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versi Firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Berikan akses ke tampilan status DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Berikan akses ke tampilan status utama" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Berikan akses ke status rute sistem" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Berikan akses ke tampilan status wifi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Hostname" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Alamat IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versi Kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Waktu setempat" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/detik" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Tidak terhubung" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Sinyal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistem" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Naik." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Upload" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Waktu terkini" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Wifi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "tidak" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ya" + +#~ msgid "Connected since" +#~ msgstr "Terhubung sejak" diff --git a/luci-mod-dashboard/po/it/dashboard.po b/luci-mod-dashboard/po/it/dashboard.po new file mode 100644 index 000000000..7dae9b8bd --- /dev/null +++ b/luci-mod-dashboard/po/it/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-12-26 08:48+0000\n" +"Last-Translator: Daniele Luisetto \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Attivo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architettura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Canale" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Connesso" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Dispositivi DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Pannello di controllo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Dispositivi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Dispositivi connessi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Disconesso." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Download" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Crittografia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versione del Firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Consentire la visualizzazione dello stato del DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Consentire la visualizzazione dello stato generale" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Consentire l'accesso allo stato delle route di sistema" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Consentire la visualizzazione dello stato del wireless" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Nome host" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Indirizzo IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Prefisso IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versione del Kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Data/ora locale" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modello" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Non connesso" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocollo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Segnale" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "SIstema" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "In funzione." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Carica" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Tempo di attività" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Wireless" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "no" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "sì" + +#~ msgid "Connected since" +#~ msgstr "Connesso da" diff --git a/luci-mod-dashboard/po/ja/dashboard.po b/luci-mod-dashboard/po/ja/dashboard.po new file mode 100644 index 000000000..d451b876f --- /dev/null +++ b/luci-mod-dashboard/po/ja/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-06-11 06:32+0000\n" +"Last-Translator: Satoru Yoshida \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.7-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "アクティブ" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "アーキテクチャ" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "ビットレート" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "チャンネル" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "接続中" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP デバイス" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNS (v4)" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNS (v6)" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "ダッシュボード" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "デバイス" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "接続中のデバイス" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "ダウン" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "ダウンロード" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "暗号化" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "ファームウェア バージョン" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "ゲートウェイ (v4)" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "ゲートウェイ (v6)" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "DHCPステータス表示へのアクセスを許可" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "メインステータス表示へのアクセスを許可" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "システムルートステータスへのアクセスを許可" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "無線ステータス表示へのアクセスを許可" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "ホスト名" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP アドレス" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 インターネット" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 インターネット" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 プレフィックス" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "インターネット" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "カーネル バージョン" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "時刻" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbps" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "モデル" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "未接続" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "プロトコル" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "信号強度" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "システム" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "アップ" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "アップロード" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "稼働時間" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "無線" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "いいえ" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "はい" + +#~ msgid "Connected since" +#~ msgstr "接続時間" diff --git a/luci-mod-dashboard/po/ko/dashboard.po b/luci-mod-dashboard/po/ko/dashboard.po new file mode 100644 index 000000000..0b968c298 --- /dev/null +++ b/luci-mod-dashboard/po/ko/dashboard.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-01-10 10:50+0000\n" +"Last-Translator: TheNoFace \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "활성화" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "아키텍처" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "비트레이트" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "채널" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "연결됨" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP 장치" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "대시보드" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "장치" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "연결된 장치" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "다운." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "다운로드" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "암호화" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "펌웨어 버전" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "게이트웨이 IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "게이트웨이 IPv6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "DHCP 상태 표시 접근을 허가합니다" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "기본 상태 표시 접근을 허가합니다" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "시스템 라우트 상태 접근을 허가합니다" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "무선 상태 표시 접근을 허가합니다" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "호스트명" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP 주소" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 인터넷" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 인터넷" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 접두사" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "인터넷" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "커널 버전" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "로컬 시간" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "모델" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "연결되지 않음" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "프로토콜" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "시그널" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "시스템" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "업." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "업로드" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "가동시간" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "무선" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "아니오" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "예" diff --git a/luci-mod-dashboard/po/mr/dashboard.po b/luci-mod-dashboard/po/mr/dashboard.po new file mode 100644 index 000000000..149c99b6a --- /dev/null +++ b/luci-mod-dashboard/po/mr/dashboard.po @@ -0,0 +1,215 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: mr\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/ms/dashboard.po b/luci-mod-dashboard/po/ms/dashboard.po new file mode 100644 index 000000000..bf5fa329a --- /dev/null +++ b/luci-mod-dashboard/po/ms/dashboard.po @@ -0,0 +1,215 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" diff --git a/luci-mod-dashboard/po/nb_NO/dashboard.po b/luci-mod-dashboard/po/nb_NO/dashboard.po new file mode 100644 index 000000000..724152ae0 --- /dev/null +++ b/luci-mod-dashboard/po/nb_NO/dashboard.po @@ -0,0 +1,230 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-11-08 00:12+0000\n" +"Last-Translator: Allan Nordhøy \n" +"Language-Team: Norwegian Bokmål \n" +"Language: nb_NO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.2\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +#, fuzzy +msgid "Active" +msgstr "Aktiv" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arkitektur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Tilkoblet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP-enheter" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Oversikt" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Enheter" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +#, fuzzy +msgid "Devices Connected" +msgstr "Tilkoblede enheter" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Nede." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Last ned" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Kryptering" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Fastvareversjon" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +#, fuzzy +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +#, fuzzy +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Innvilg tilgang til DHCP-statusskjerm" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Innvilg tilgang til hovedstatusskjerm" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Innvilg tilgang til systemrutestatus" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Innvilg tilgang til trådløs statusskjerm" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Vertsnavn" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP-adresse" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4-Internett" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6-Internett" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6-prefiks" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internett" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Kjerneversjon" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Lokal tid" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +#, fuzzy +msgid "Mac" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modell" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Ikke tilkoblet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokoll" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "System" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#, fuzzy +msgid "Up." +msgstr "Oppe." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +#, fuzzy +msgid "Upload" +msgstr "Last opp" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Oppetid" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +#, fuzzy +msgid "Wireless" +msgstr "Trådløst" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nei" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ja" + +#~ msgid "Connected since" +#~ msgstr "Tilkoblet siden" diff --git a/luci-mod-dashboard/po/nl/dashboard.po b/luci-mod-dashboard/po/nl/dashboard.po new file mode 100644 index 000000000..6b516f9d8 --- /dev/null +++ b/luci-mod-dashboard/po/nl/dashboard.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-11 03:31+0000\n" +"Last-Translator: xtz1983 \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Actief" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architectuur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanaal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Verbonden" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP Apparaten" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Dashboard" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Apparaten" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Verbonden Apparaten" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Uitgeschakeld." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Download" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Versleuteling" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Firmware Versie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Toegang verlenen tot weergave van DHCP-status" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Toegang verlenen tot hoofdstatusweergave" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Toegang verlenen tot de status van het systeemrouteringsproces" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Toegang verlenen tot weergave van draadloze status" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Hostnaam" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP Adres" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Kernel Versie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Lokale tijd" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Geen verbinding" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signaal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Systeem" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Boven." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Uploaden" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Bedrijfstijd" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Draadloos" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nee" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "ja" diff --git a/luci-mod-dashboard/po/pl/dashboard.po b/luci-mod-dashboard/po/pl/dashboard.po new file mode 100644 index 000000000..91c205b75 --- /dev/null +++ b/luci-mod-dashboard/po/pl/dashboard.po @@ -0,0 +1,223 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-03 11:51+0000\n" +"Last-Translator: Matthaiks \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktywny" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architektura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Szybkość transmisji" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanał" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Połączony" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Urządzenia DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Info" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Urządzenia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Podłączone urządzenia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Pobieranie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Pobierz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Szyfrowanie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Wersja firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "BramaV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "BramaV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Udziel dostępu do wyświetlania statusu DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Udziel dostępu do głównego wyświetlacza stanu" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Udziel dostępu do statusu systemowych tras" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Udziel dostępu do wyświetlania statusu sieci bezprzewodowej" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Nazwa hosta" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Adres IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Internet IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Internet IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Prefiks IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Wersja kernela" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Czas lokalny" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Nie podłączony" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokół" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Sygnał" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "System" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Wysyłanie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Wysyłanie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Czas pracy" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Sieć bezprzewodowa" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "tak" + +#~ msgid "Connected since" +#~ msgstr "Czas połączenia" diff --git a/luci-mod-dashboard/po/pt/dashboard.po b/luci-mod-dashboard/po/pt/dashboard.po new file mode 100644 index 000000000..5e473dda5 --- /dev/null +++ b/luci-mod-dashboard/po/pt/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-11-30 14:48+0000\n" +"Last-Translator: Gonçalo Pereira \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Ativo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arquitectura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Taxa de bits" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Canal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Ligado" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Dispositivos DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Painel de Controlo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Dispositivos" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Dispositivos ligados" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Em Baixo." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Descarregar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Encriptação" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versão do firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Conceder acesso à visualização do estado do DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Conceder acesso à visualização do estado principal" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Conceder acesso ao estado da rota do sistema" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Conceda acesso à visualização da condição do wireless" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Nome do equipamento" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Endereço IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Internet IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Internet IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Prefixo IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versão do kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Hora local" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modelo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Não conectado" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocolo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Sinal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistema" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Ativo." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Enviar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Tempo de atividade" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Rede sem fios" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "não" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "sim" + +#~ msgid "Connected since" +#~ msgstr "Ligado desde" diff --git a/luci-mod-dashboard/po/pt_BR/dashboard.po b/luci-mod-dashboard/po/pt_BR/dashboard.po new file mode 100644 index 000000000..95d523512 --- /dev/null +++ b/luci-mod-dashboard/po/pt_BR/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-05 03:51+0000\n" +"Last-Translator: Wellington Terumi Uemura \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Ativo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arquitetura" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Taxa de bits" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Canal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Conectado" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Dispositivos DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Painel de Controle" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Dispositivos" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Dispositivos conectados" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Baix." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Baixar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Criptografia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versão do firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Conceda acesso à visualização da condição do DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Conceda acesso à exibição do status principal" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Conceda acesso à condição da rota do sistema" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Conceda acesso à visualização da condição do wireless" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Nome do equipamento" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Endereço IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Internet IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Internet IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Prefixo IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versão do kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Hora local" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Modelo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Não conectado" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocolo" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Sinal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistema" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Envio" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Envio" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Tempo de atividade" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Rede sem fio" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "não" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "sim" + +#~ msgid "Connected since" +#~ msgstr "Conectado desde" diff --git a/luci-mod-dashboard/po/ro/dashboard.po b/luci-mod-dashboard/po/ro/dashboard.po new file mode 100644 index 000000000..dd777daff --- /dev/null +++ b/luci-mod-dashboard/po/ro/dashboard.po @@ -0,0 +1,223 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-11-04 20:04+0000\n" +"Last-Translator: Simona Iacob \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.14.2-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Activ" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arhitectură" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Rata de biți" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Canal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Conectat" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Dispozitive DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Tabloul de bord" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Dispozitive" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Dispozitive conectate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Oprit." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Descărcați" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Criptare" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Versiunea Firmware-ului" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Acordați acces la afișarea stării DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Acordați acces la afișarea principală a stării" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Acordați accesul la starea rutei sistemului" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Acordați acces la afișarea stării wireless" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Numele gazdei ( hostname )" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Adresa IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Internet IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Internet IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Prefix IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Versiunea Kernel-ului" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Ora locală" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Nu este conectat" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protocol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Semnal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistem" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Sus." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Încărcați" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Timp de funcționare" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Fără fir" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nu" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "da" + +#~ msgid "Connected since" +#~ msgstr "Conectat de la" diff --git a/luci-mod-dashboard/po/ru/dashboard.po b/luci-mod-dashboard/po/ru/dashboard.po old mode 100755 new mode 100644 index 466e9ab42..77e35af2e --- a/luci-mod-dashboard/po/ru/dashboard.po +++ b/luci-mod-dashboard/po/ru/dashboard.po @@ -1,224 +1,223 @@ msgid "" msgstr "" -"PO-Revision-Date: 2021-06-16 10:51+0000\n" -"Last-Translator: Dmitry Galenko \n" -"Language-Team: Russian \n" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-04-16 06:28+0000\n" +"Last-Translator: st7105 \n" +"Language-Team: Russian \n" "Language: ru\n" +"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.6.1\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.17-dev\n" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:165 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" -msgstr "Активный" +msgstr "Активно" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:368 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" -msgstr "Процессор" +msgstr "Архитектура" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" msgstr "BSSID" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "Скорость" +msgstr "Битрейт" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:236 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" msgstr "Канал" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:277 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" -msgstr "Подключено" +msgstr "Подключен" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "Устройства DHCP" -#: luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Дашборд" +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:136 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Информационная панель" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" msgstr "Устройства" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" msgstr "Подключенные устройства" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." -msgstr "Не работает." +msgstr "Скач." -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:131 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" -msgstr "Получение" +msgstr "Скачать" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "Шифрование" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:373 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" -msgstr "Версия ПО" +msgstr "Версия прошивки" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:173 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" -msgstr "GHz" +msgstr "ГГц" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "Разрешить просмотр информации о DHCP" +msgstr "Предоставить доступ к просмотру состояния DHCP" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" -msgstr "Разрешить просмотр информации основной информации" +msgstr "Предоставить доступ к отображению основного состояния" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "Разрешить просмотр информации о маршрутах" +msgstr "Предоставить доступ к состоянию системных маршрутов" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "Разрешить просмотр информации о беспроводных сетях" +msgstr "Предоставить доступ к просмотру состояния беспроводных сетей" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:224 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" msgstr "Имя хоста" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" msgstr "IP-адрес" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:283 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:116 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:274 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "IPv4 Internet" +msgstr "IPv4 Интернет" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:305 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "IPv6 Internet" +msgstr "IPv6 Интернет" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:299 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "Префикс IPv6" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" -msgstr "Internet" +msgstr "Интернет" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:358 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "Версия ядра" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "Load" -msgstr "Загрузка" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:353 -msgid "Load Average" -msgstr "Средняя загрузка" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:348 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" -msgstr "Время хоста" +msgstr "Время" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" msgstr "MAC" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:121 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" msgstr "Mac" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:179 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" -msgstr "Mbit/s" +msgstr "Мбит/с" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:363 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "Модель" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:202 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" -msgstr "Не подключено" +msgstr "Не подключен" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "Proxy traffic" -msgstr "Трафик через прокси" +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Протокол" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:230 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" msgstr "SSID" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:232 -msgid "Server" -msgstr "Сервер" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" msgstr "Сигнал" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" msgstr "Система" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:265 -msgid "Total traffic" -msgstr "Трафик всего" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." -msgstr "Работает." +msgstr "Загр." -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:126 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" -msgstr "Отправка" +msgstr "Загрузить" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:343 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "Uptime" +msgstr "Время работы" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:259 -msgid "VPN traffic" -msgstr "Трафик VPN" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "Version" -msgstr "Версия" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" -msgstr "Безпроводной" +msgstr "Беспроводная сеть" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" msgstr "нет" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" msgstr "да" + +#~ msgid "Connected since" +#~ msgstr "Подключено с" diff --git a/luci-mod-dashboard/po/sk/dashboard.po b/luci-mod-dashboard/po/sk/dashboard.po new file mode 100644 index 000000000..2776d0fee --- /dev/null +++ b/luci-mod-dashboard/po/sk/dashboard.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-15 17:44+0000\n" +"Last-Translator: MaycoH \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Weblate 4.18.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Architektúra" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitová rýchlosť" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanál" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Pripojené" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Zariadenia DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Zariadenia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Pripojené zariadenia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Šifrovanie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Verzia firmvéru" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "Brána v4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "Brána v6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Udeliť prístup k zobrazeniu stavu DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Názov hostiteľa" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Adresa IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Internet IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Internet IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Verzia jadra" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Miestny čas" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Nepripojené" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Signál" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Systém" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Doba spustenia" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Bezdrôtová sieť" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "nie" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "áno" diff --git a/luci-mod-dashboard/po/sv/dashboard.po b/luci-mod-dashboard/po/sv/dashboard.po new file mode 100644 index 000000000..066437213 --- /dev/null +++ b/luci-mod-dashboard/po/sv/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2022-12-04 12:08+0000\n" +"Last-Translator: Kristoffer Grundström \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.15-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Aktiv" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Arkitektur" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bithastighet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Ansluten" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP enheter" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Instrumentbräda" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Enheter" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Enheter anslutna" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Ner." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Nedladdning" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Kryptering" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Firmware Version" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Ge åtkomst till DHCP-statusvisning" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Ge åtkomst till huvudstatusvisning" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokoll" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Ladda upp" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "" + +#~ msgid "Connected since" +#~ msgstr "Ansluten sedan" diff --git a/luci-mod-dashboard/po/templates/dashboard.pot b/luci-mod-dashboard/po/templates/dashboard.pot old mode 100755 new mode 100644 index 018a75101..005ed4014 --- a/luci-mod-dashboard/po/templates/dashboard.pot +++ b/luci-mod-dashboard/po/templates/dashboard.pot @@ -1,214 +1,208 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:165 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:368 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:236 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:277 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "" -#: luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 msgid "Dashboard" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:136 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:131 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:373 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:173 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" msgstr "" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" msgstr "" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" msgstr "" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" msgstr "" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:224 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:283 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:116 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:274 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:305 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:299 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:358 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "Load" -msgstr "" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:353 -msgid "Load Average" -msgstr "" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:348 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:121 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:179 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:363 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:202 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "Proxy traffic" +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:230 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:232 -msgid "Server" -msgstr "" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:265 -msgid "Total traffic" -msgstr "" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:126 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:343 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:259 -msgid "VPN traffic" -msgstr "" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "Version" -msgstr "" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" msgstr "" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" msgstr "" diff --git a/luci-mod-dashboard/po/tr/dashboard.po b/luci-mod-dashboard/po/tr/dashboard.po new file mode 100644 index 000000000..d9ccc6cea --- /dev/null +++ b/luci-mod-dashboard/po/tr/dashboard.po @@ -0,0 +1,222 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-05-11 11:34+0000\n" +"Last-Translator: semih \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.7-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Etkin" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Mimari" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bit hızı" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kanal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Bağlandı" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP Aygıtları" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Denetim Paneli" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Aygıtlar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Bağlı Aygıtlar" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "İnd." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "İndir" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Şifreleme" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Ürün Yazılımı Sürümü" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "DHCP durum ekranına erişim izni verin" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Ana durum ekranına erişim izni verin" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Sistem yönlendirme durumuna erişim izni verin" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Kablosuz durum ekranına erişim izni verin" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Sunucu adı" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP Adresi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 İnternet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 İnternet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 ön eki" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "İnternet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Çekirdek Sürümü" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Yerel Zaman" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Bağlı değil" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Protokol" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Sinyal" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Sistem" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Yük." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Yükleme" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Çalışma süresi" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Kablosuz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "hayır" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "evet" + +#~ msgid "Connected since" +#~ msgstr "Şu tarihten beri bağlı" diff --git a/luci-mod-dashboard/po/uk/dashboard.po b/luci-mod-dashboard/po/uk/dashboard.po new file mode 100644 index 000000000..891a136ed --- /dev/null +++ b/luci-mod-dashboard/po/uk/dashboard.po @@ -0,0 +1,223 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2021-11-04 17:37+0000\n" +"Last-Translator: Paul Dee \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.9-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Активний" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Архітектура" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Бітрейт" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Канал" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Підключений" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP-пристрої" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Панелі" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Пристрої" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Пристрої, підключені" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Вниз." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Завантажити" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Шифрування" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Версія прошивки" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "Ггц" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "Шлюз V4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "Шлюз v6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Надання доступу до відображення стану DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Надання доступу до основного відображення стану" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Надати доступ до статусу системних маршрутів" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Надати доступ до відображення статусу бездротових мереж" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Ім'я хоста" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP-адреса" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "Інтернет IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "Інтернет IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "Префікс IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Інтернет" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Версія ядра" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Місцевий час" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Мбіт/с" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Модель" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Не підключено" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Протокол" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Сигнал" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Система" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Вгору." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Завантажити" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Час безвідмовної роботи" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Бездротові мережі" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "Ні" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "так" + +#~ msgid "Connected since" +#~ msgstr "Під'єднано з" diff --git a/luci-mod-dashboard/po/vi/dashboard.po b/luci-mod-dashboard/po/vi/dashboard.po new file mode 100644 index 000000000..92aa950e8 --- /dev/null +++ b/luci-mod-dashboard/po/vi/dashboard.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: 2023-06-20 13:52+0000\n" +"Last-Translator: Quy \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18.1\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "Kích hoạt" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "Kiến trúc" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "Bitrate" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "Kênh" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "Đã kết nối" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "Thiết bị DHCP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "Màn hình chính" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "Các thiết bị" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "Thiết bị đã kết nối" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "Sập." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "Tải xuống" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "Mã hóa" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "Phiên bản firmware" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "GatewayV4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "GatewayV6" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "Cấp quyền truy cập vào màn hình trạng thái DHCP" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "Cấp quyền truy cập vào màn hình trạng thái chính" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "Cấp quyền truy cập vào trạng thái tuyến đường hệ thống" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "Cấp quyền truy cập vào hiển thị trạng thái không dây" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "Tên máy chủ (hostname)" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "Địa chỉ IP" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6 prefix" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "Internet" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "Phiên bản Kernel" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "Giờ địa phương" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "Model" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "Không kết nối" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "Giao thức" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "Tín hiệu" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "Hệ thống" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "Đã mở." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "Tải lên" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "Thời gian hoạt động" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "Không dây" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "Không" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "có" diff --git a/luci-mod-dashboard/po/zh_Hans/dashboard.po b/luci-mod-dashboard/po/zh_Hans/dashboard.po old mode 100755 new mode 100644 index 4da85b2c8..983910c44 --- a/luci-mod-dashboard/po/zh_Hans/dashboard.po +++ b/luci-mod-dashboard/po/zh_Hans/dashboard.po @@ -1,223 +1,220 @@ msgid "" msgstr "" -"PO-Revision-Date: 2021-06-02 09:51+0000\n" -"Last-Translator: antrouter \n" -"Language-Team: Chinese (Simplified) \n" +"PO-Revision-Date: 2022-05-07 19:19+0000\n" +"Last-Translator: 王攀 <41330784@qq.com>\n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.6.1\n" +"X-Generator: Weblate 4.12.1\n" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:165 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 msgid "Active" -msgstr "激活" +msgstr "活跃" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:368 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 msgid "Architecture" -msgstr "构架" +msgstr "架构" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 msgid "BSSID" msgstr "BSSID" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:245 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 msgid "Bitrate" -msgstr "比特率" +msgstr "速率" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:236 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 msgid "Channel" -msgstr "频道" +msgstr "信道" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:277 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 msgid "Connected" -msgstr "连接" +msgstr "已连接" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 msgid "DHCP Devices" msgstr "DHCP 设备" -#: luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "仪表盘" +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:136 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "概览" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 msgid "Devices" msgstr "设备" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 msgid "Devices Connected" -msgstr "连接的设备" +msgstr "已连接设备" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Down." -msgstr "下." +msgstr "下行." -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:131 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 msgid "Download" msgstr "下载" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 msgid "Encryption" msgstr "加密" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:373 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 msgid "Firmware Version" msgstr "固件版本" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:173 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 msgid "GHz" -msgstr "Ghz" +msgstr "GHz" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "IPv4 网关" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "IPv6 网关" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 msgid "Grant access to DHCP status display" -msgstr "授予访问 DHCP 状态显示的权限" +msgstr "授予访问 DHCP 状态展示的权限" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 msgid "Grant access to main status display" -msgstr "授予访问主状态显示的权限" +msgstr "授予访问主状态展示的权限" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 msgid "Grant access to the system route status" -msgstr "授予对系统路由状态的访问权限" +msgstr "授予访问系统路由状态的权限" -#: luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 msgid "Grant access to wireless status display" -msgstr "授予访问无线状态显示的权限" +msgstr "授予访问无线状态展示的权限" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:224 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 msgid "Hostname" msgstr "主机名" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 msgid "IP Address" -msgstr "IP地址" +msgstr "IP 地址" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:283 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:116 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 msgid "IPv4" msgstr "IPv4" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:274 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 msgid "IPv4 Internet" -msgstr "IPv4互联网" +msgstr "IPv4 网络" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:305 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 msgid "IPv6" msgstr "IPv6" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:290 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 msgid "IPv6 Internet" -msgstr "IPv6互联网" +msgstr "IPv6 网络" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:299 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 msgid "IPv6 prefix" -msgstr "IPv6前缀" +msgstr "IPv6 前缀" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "Internet" msgstr "互联网" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:358 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 msgid "Kernel Version" msgstr "内核版本" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "Load" -msgstr "负载" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:353 -msgid "Load Average" -msgstr "平均负载" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:348 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 msgid "Local Time" msgstr "本地时间" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 msgid "MAC" -msgstr "MAC地址" +msgstr "MAC" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:121 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 msgid "Mac" -msgstr "mac地址" +msgstr "Mac" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:179 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 msgid "Mbit/s" msgstr "Mbit/s" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:363 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 msgid "Model" msgstr "型号" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:202 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 msgid "Not connected" msgstr "未连接" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "Proxy traffic" -msgstr "代理流量" +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "协议" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:159 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:230 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 msgid "SSID" msgstr "SSID" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:232 -msgid "Server" -msgstr "服务器" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 msgid "Signal" msgstr "信号" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:41 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 msgid "System" msgstr "系统" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:265 -msgid "Total traffic" -msgstr "总流量" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 msgid "Up." -msgstr "上." +msgstr "上行" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:126 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 msgid "Upload" msgstr "上传" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:343 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 msgid "Uptime" -msgstr "开机时间" +msgstr "运行时间" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:259 -msgid "VPN traffic" -msgstr "VPN流量" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "Version" -msgstr "版本" - -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 msgid "Wireless" msgstr "无线" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "no" msgstr "否" -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:101 -#: luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 msgid "yes" msgstr "是" + +#~ msgid "Connected since" +#~ msgstr "连接开始时间" diff --git a/luci-mod-dashboard/po/zh_Hant/dashboard.po b/luci-mod-dashboard/po/zh_Hant/dashboard.po new file mode 100644 index 000000000..3135a40d7 --- /dev/null +++ b/luci-mod-dashboard/po/zh_Hant/dashboard.po @@ -0,0 +1,220 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-12-25 07:50+0000\n" +"Last-Translator: Hulen \n" +"Language-Team: Chinese (Traditional) \n" +"Language: zh_Hant\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.15.1-dev\n" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 +msgid "Active" +msgstr "已啓用" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 +msgid "Architecture" +msgstr "架構" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 +msgid "BSSID" +msgstr "BSSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 +msgid "Bitrate" +msgstr "位元率" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 +msgid "Channel" +msgstr "頻道" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 +msgid "Connected" +msgstr "已連線" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 +msgid "DHCP Devices" +msgstr "DHCP 裝置" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 +msgid "DNSv4" +msgstr "DNSv4" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 +msgid "DNSv6" +msgstr "DNSv6" + +#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 +msgid "Dashboard" +msgstr "儀表板" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 +msgid "Devices" +msgstr "裝置" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 +msgid "Devices Connected" +msgstr "已連線裝置" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Down." +msgstr "下載." + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 +msgid "Download" +msgstr "下載" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 +msgid "Encryption" +msgstr "加密(Encryption)" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 +msgid "Firmware Version" +msgstr "韌體版本" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 +msgid "GHz" +msgstr "GHz" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 +msgid "GatewayV4" +msgstr "IPv4 閘道" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 +msgid "GatewayV6" +msgstr "IPv6 閘道" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 +msgid "Grant access to DHCP status display" +msgstr "授予存取 DHCP 狀態顯示的權限" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 +msgid "Grant access to main status display" +msgstr "授予存取主要狀態顯示的權限" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 +msgid "Grant access to the system route status" +msgstr "授予存取系統路由狀態的權限" + +#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 +msgid "Grant access to wireless status display" +msgstr "授予存取無線狀態顯示的權限" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 +msgid "Hostname" +msgstr "主機名稱" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 +msgid "IP Address" +msgstr "IP 位址" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 +msgid "IPv4" +msgstr "IPv4 地址" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 +msgid "IPv4 Internet" +msgstr "IPv4 網路" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 +msgid "IPv6" +msgstr "IPv6" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 +msgid "IPv6 Internet" +msgstr "IPv6 網路" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 +msgid "IPv6 prefix" +msgstr "IPv6字首" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "Internet" +msgstr "網際網路" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 +msgid "Kernel Version" +msgstr "核心版本" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 +msgid "Local Time" +msgstr "本地時間" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 +msgid "MAC" +msgstr "MAC" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 +msgid "Mac" +msgstr "Mac" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 +msgid "Mbit/s" +msgstr "Mbit/s" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 +msgid "Model" +msgstr "裝置型號" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 +msgid "Not connected" +msgstr "尚未連線" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 +msgid "Protocol" +msgstr "協定" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 +msgid "SSID" +msgstr "SSID" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 +msgid "Signal" +msgstr "訊號" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 +msgid "System" +msgstr "系統" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 +msgid "Up." +msgstr "上傳" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 +msgid "Upload" +msgstr "上傳" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 +msgid "Uptime" +msgstr "上線時間" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 +msgid "Wireless" +msgstr "無線" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "no" +msgstr "否" + +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 +#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 +msgid "yes" +msgstr "是" + +#~ msgid "Connected since" +#~ msgstr "連線開始時間" diff --git a/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json old mode 100755 new mode 100644 diff --git a/luci-mod-network/Makefile b/luci-mod-network/Makefile old mode 100755 new mode 100644 index 6148f98b4..4820ffe28 --- a/luci-mod-network/Makefile +++ b/luci-mod-network/Makefile @@ -1,15 +1,13 @@ # # Copyright (C) 2008-2014 The LuCI Team -# Copyright (C) 2020-2021 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the Apache License, Version 2.0 . # -# From https://github.com/openwrt/luci/commit/b88157e69a060ade618e48b30947729310935d61 include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Network Administration -LUCI_DEPENDS:=+luci-base +libiwinfo-lua +rpcd-mod-iwinfo +LUCI_DEPENDS:=+luci-base +rpcd-mod-iwinfo PKG_LICENSE:=Apache-2.0 diff --git a/luci-mod-network/htdocs/luci-static/resources/tools/network.js b/luci-mod-network/htdocs/luci-static/resources/tools/network.js old mode 100755 new mode 100644 index 6f16713fe..092bbbc14 --- a/luci-mod-network/htdocs/luci-static/resources/tools/network.js +++ b/luci-mod-network/htdocs/luci-static/resources/tools/network.js @@ -1,4 +1,5 @@ 'use strict'; +'require fs'; 'require ui'; 'require dom'; 'require uci'; @@ -149,25 +150,77 @@ function updatePlaceholders(opt, section_id) { } } +var cbiFlagTristate = form.ListValue.extend({ + __init__: function(/* ... */) { + this.super('__init__', arguments); + this.keylist = [ '', '0!', '1!' ]; + this.vallist = [ _('automatic'), _('disabled'), _('enabled') ]; + }, + + load: function(section_id) { + var invert = false, sysfs = this.sysfs; + + if (sysfs) { + if (sysfs.charAt(0) == '!') { + invert = true; + sysfs = sysfs.substring(1); + } + + return L.resolveDefault(fs.read(sysfs), '').then(L.bind(function(res) { + res = (res || '').trim(); + + if (res == '0') + this.sysfs_default = invert; + else if (res == '1') + this.sysfs_default = !invert; + + return this.super('load', [section_id]); + }, this)); + } + + return this.super('load', [section_id]); + }, + + write: function(section_id, formvalue) { + if (formvalue == '1!') + return this.super('write', [section_id, '1']); + else if (formvalue == '0!') + return this.super('write', [section_id, '0']); + else + return this.super('remove', [section_id]); + }, + + renderWidget: function(section_id, option_index, cfgvalue) { + var sysdef = this.sysfs_default; + + if (this.sysfs_default !== null) { + this.keylist[0] = sysdef ? '1' : '0'; + this.vallist[0] = sysdef ? _('automatic (enabled)') : _('automatic (disabled)'); + } + + return this.super('renderWidget', [section_id, option_index, cfgvalue]); + } +}); + var cbiTagValue = form.Value.extend({ renderWidget: function(section_id, option_index, cfgvalue) { var widget = new ui.Dropdown(cfgvalue || ['-'], { '-': E([], [ E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ '—' ]), - E('span', { 'class': 'hide-close' }, [ _('Do not participate', 'VLAN port state') ]) + E('span', { 'class': 'hide-close' }, [ _('Not Member', 'VLAN port state') ]) ]), 'u': E([], [ - E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'u' ]), - E('span', { 'class': 'hide-close' }, [ _('Egress untagged', 'VLAN port state') ]) + E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'U' ]), + E('span', { 'class': 'hide-close' }, [ _('Untagged', 'VLAN port state') ]) ]), 't': E([], [ - E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 't' ]), - E('span', { 'class': 'hide-close' }, [ _('Egress tagged', 'VLAN port state') ]) + E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'T' ]), + E('span', { 'class': 'hide-close' }, [ _('Tagged', 'VLAN port state') ]) ]), '*': E([], [ E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ '*' ]), - E('span', { 'class': 'hide-close' }, [ _('Primary VLAN ID', 'VLAN port state') ]) + E('span', { 'class': 'hide-close' }, [ _('Is Primary VLAN', 'VLAN port state') ]) ]) }, { id: this.cbid(section_id), @@ -274,7 +327,7 @@ var cbiTagValue = form.Value.extend({ var t = /t/.test(s[1] || '') ? 't' : 'u'; - return /\*/.test(s[1] || '') ? [t, '*'] : [t]; + return /\x2a/.test(s[1] || '') ? [t, '*'] : [t]; } return ['-']; @@ -304,7 +357,7 @@ var cbiTagValue = form.Value.extend({ } } - uci.set('network', section_id, 'ports', ports); + uci.set('network', section_id, 'ports', ports.length ? ports : null); }, remove: function() {} @@ -331,6 +384,7 @@ return baseclass.extend({ addDeviceOptions: function(s, dev, isNew) { var parent_dev = dev ? dev.getParent() : null, + devname = dev ? dev.getName() : null, o, ss; s.tab('devgeneral', _('General device options')); @@ -421,7 +475,7 @@ return baseclass.extend({ vid = this.section.formvalue(section_id, 'vid'), name = this.section.getUIElement(section_id, 'name_complex'); - if (base && vid && name && !name.isChanged()) { + if (base && vid && name && !name.isChanged() && isNew) { name.setValue('%s.%d'.format(base, vid)); name.triggerValidation(); } @@ -619,48 +673,16 @@ return baseclass.extend({ o.placeholder = dev ? dev._devstate('qlen') : ''; o.datatype = 'uinteger'; - o = this.replaceOption(s, 'devadvanced', form.Flag, 'promisc', _('Enable promiscuous mode')); - o.default = o.disabled; - - o = this.replaceOption(s, 'devadvanced', form.Flag, 'autoneg', _('Autonegociation')); - o.default = o.enabled; - - o = this.replaceOption(s, 'devadvanced', form.Flag, 'gro', _('Generic Receive Offload (GRO)')); - o.default = o.enabled; - - o = this.replaceOption(s, 'devadvanced', form.Flag, 'gso', _('Generic Segmentation Offload (GSO)')); - o.default = o.enabled; - - o = this.replaceOption(s, 'devadvanced', form.Flag, 'tso', _('TCP Segmentation Offload (TSO)')); - o.default = o.enabled; - - o = this.replaceOption(s, 'devadvanced', form.Flag, 'lro', _('Large Receive Offload (LRO)')); - o.default = o.enabled; - - o = this.replaceOption(s, 'devadvanced', form.Flag, 'ufo', _('UDP Fragmentation Offload (UFO)')); - o.default = o.enabled; - - o = this.replaceOption(s, 'devadvanced', form.Value, 'speed', _('Speed')); - o.placeholder = dev ? dev.getSpeed() : ''; - o.default = ''; - o.rmempty = true; - o.datatype = 'uinteger'; - o.depends('autoneg', '0'); - - o = this.replaceOption(s, 'devadvanced', form.ListValue, 'duplex', _('Duplex')); - o.default = ''; - o.value('', _('unknown')); - o.value('half', _('half')); - o.value('full', _('full')); - o.depends('autoneg', '0'); + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'promisc', _('Enable promiscuous mode')); + o.sysfs_default = (dev && dev.dev && dev.dev.flags) ? dev.dev.flags.promisc : null; o = this.replaceOption(s, 'devadvanced', form.ListValue, 'rpfilter', _('Reverse path filter')); o.default = ''; o.value('', _('disabled')); o.value('loose', _('Loose filtering')); o.value('strict', _('Strict filtering')); - o.cfgvalue = function(section_id) { - var val = form.ListValue.prototype.cfgvalue.apply(this, [section_id]); + o.cfgvalue = function(/* ... */) { + var val = form.ListValue.prototype.cfgvalue.apply(this, arguments); switch (val || '') { case 'loose': @@ -676,11 +698,17 @@ return baseclass.extend({ } }; - o = this.replaceOption(s, 'devadvanced', form.Flag, 'acceptlocal', _('Accept local'), _('Accept packets with local source addresses')); - o.default = o.disabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'acceptlocal', _('Accept local'), _('Accept packets with local source addresses')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/accept_local'.format(devname || 'default'); - o = this.replaceOption(s, 'devadvanced', form.Flag, 'sendredirects', _('Send ICMP redirects')); - o.default = o.enabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'sendredirects', _('Send ICMP redirects')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/send_redirects'.format(devname || 'default'); + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'arp_accept ', _('Honor gratuitous ARP'), _('When enabled, new ARP table entries are added from received gratuitous APR requests or replies, otherwise only preexisting table entries are updated, but no new hosts are learned.')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/arp_accept'.format(devname || 'default'); + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'drop_gratuitous_arp', _('Drop gratuitous ARP'), _('Drop all gratuitous ARP frames, for example if there’s a known good ARP proxy on the network and such frames need not be used or in the case of 802.11, must not be used to prevent attacks.')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/drop_gratuitous_arp'.format(devname || 'default'); o = this.replaceOption(s, 'devadvanced', form.Value, 'neighreachabletime', _('Neighbour cache validity'), _('Time in milliseconds')); o.placeholder = '30000'; @@ -694,63 +722,75 @@ return baseclass.extend({ o.placeholder = '0'; o.datatype = 'uinteger'; - o = this.replaceOption(s, 'devadvanced', form.Value, 'ttl', _('Force TTL'), _('Some LTE providers detect tethering by inspecting packet TTL values')); - o.placeholder = '65'; - o.datatype = 'uinteger'; - - o = this.replaceOption(s, 'devgeneral', form.Flag, 'ipv6', _('Enable IPv6')); + o = this.replaceOption(s, 'devgeneral', cbiFlagTristate, 'ipv6', _('Enable IPv6')); + o.sysfs = '!/proc/sys/net/ipv6/conf/%s/disable_ipv6'.format(devname || 'default'); o.migrate = false; - o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'ip6segmentrouting', _('Enable IPv6 segment routing')); + o.sysfs = '/proc/sys/net/ipv6/conf/%s/seg6_enabled'.format(devname || 'default'); + o.depends('ipv6', /1/); + + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'drop_unsolicited_na', _('Drop unsolicited NA'), _('Drop all unsolicited neighbor advertisements, for example if there’s a known good NA proxy on the network and such frames need not be used or in the case of 802.11, must not be used to prevent attacks.')); + o.sysfs = '/proc/sys/net/ipv6/conf/%s/drop_unsolicited_na'.format(devname || 'default'); + o.depends('ipv6', /1/); o = this.replaceOption(s, 'devgeneral', form.Value, 'mtu6', _('IPv6 MTU')); o.datatype = 'max(9200)'; - o.depends('ipv6', '1'); + o.depends('ipv6', /1/); o = this.replaceOption(s, 'devgeneral', form.Value, 'dadtransmits', _('DAD transmits'), _('Amount of Duplicate Address Detection probes to send')); o.placeholder = '1'; o.datatype = 'uinteger'; - o.depends('ipv6', '1'); + o.depends('ipv6', /1/); - o = this.replaceOption(s, 'devadvanced', form.Flag, 'multicast', _('Enable multicast support')); - o.default = o.enabled; + o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'multicast', _('Enable multicast support')); + o.sysfs_default = (dev && dev.dev && dev.dev.flags) ? dev.dev.flags.multicast : null; o = this.replaceOption(s, 'devadvanced', form.ListValue, 'igmpversion', _('Force IGMP version')); o.value('', _('No enforcement')); o.value('1', _('Enforce IGMPv1')); o.value('2', _('Enforce IGMPv2')); o.value('3', _('Enforce IGMPv3')); - o.depends('multicast', '1'); + o.depends('multicast', /1/); o = this.replaceOption(s, 'devadvanced', form.ListValue, 'mldversion', _('Force MLD version')); o.value('', _('No enforcement')); o.value('1', _('Enforce MLD version 1')); o.value('2', _('Enforce MLD version 2')); - o.depends('multicast', '1'); + o.depends('multicast', /1/); if (isBridgePort(dev)) { - o = this.replaceOption(s, 'brport', form.Flag, 'learning', _('Enable MAC address learning')); - o.default = o.enabled; + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'learning', _('Enable MAC address learning')); + o.sysfs = '/sys/class/net/%s/brport/learning'.format(devname || 'default'); - o = this.replaceOption(s, 'brport', form.Flag, 'unicast_flood', _('Enable unicast flooding')); - o.default = o.enabled; + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'unicast_flood', _('Enable unicast flooding')); + o.sysfs = '/sys/class/net/%s/brport/unicast_flood'.format(devname || 'default'); - o = this.replaceOption(s, 'brport', form.Flag, 'isolated', _('Port isolation'), _('Only allow communication with non-isolated bridge ports when enabled')); - o.default = o.disabled; + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'isolate', _('Port isolation'), _('Only allow communication with non-isolated bridge ports when enabled')); + o.sysfs = '/sys/class/net/%s/brport/isolated'.format(devname || 'default'); o = this.replaceOption(s, 'brport', form.ListValue, 'multicast_router', _('Multicast routing')); o.value('', _('Never')); o.value('1', _('Learn')); o.value('2', _('Always')); - o.depends('multicast', '1'); + o.depends('multicast', /1/); - o = this.replaceOption(s, 'brport', form.Flag, 'multicast_to_unicast', _('Multicast to unicast'), _('Forward multicast packets as unicast packets on this device.')); - o.default = o.disabled; - o.depends('multicast', '1'); + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'multicast_to_unicast', _('Multicast to unicast'), _('Forward multicast packets as unicast packets on this device.')); + o.sysfs = '/sys/class/net/%s/brport/multicast_to_unicast'.format(devname || 'default'); + o.depends('multicast', /1/); - o = this.replaceOption(s, 'brport', form.Flag, 'multicast_fast_leave', _('Enable multicast fast leave')); - o.default = o.disabled; - o.depends('multicast', '1'); + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'multicast_fast_leave', _('Enable multicast fast leave')); + o.sysfs = '/sys/class/net/%s/brport/multicast_fast_leave'.format(devname || 'default'); + o.depends('multicast', /1/); + + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'drop_v4_unicast_in_l2_multicast', _('Drop nested IPv4 unicast'), _('Drop layer 2 multicast frames containing IPv4 unicast packets.')); + o.sysfs = '/proc/sys/net/ipv4/conf/%s/drop_unicast_in_l2_multicast'.format(devname || 'default'); + o.depends('multicast', /1/); + + o = this.replaceOption(s, 'brport', cbiFlagTristate, 'drop_v6_unicast_in_l2_multicast', _('Drop nested IPv6 unicast'), _('Drop layer 2 multicast frames containing IPv6 unicast packets.')); + o.sysfs = '/proc/sys/net/ipv6/conf/%s/drop_unicast_in_l2_multicast'.format(devname || 'default'); + o.depends('multicast', /1/); } o = this.replaceOption(s, 'bridgevlan', form.Flag, 'vlan_filtering', _('Enable VLAN filtering')); @@ -816,6 +856,8 @@ return baseclass.extend({ return network.instantiateDevice(port) }).filter(function(dev) { return dev.getType() != 'wifi' || dev.isUp(); + }).sort(function(a, b) { + return L.naturalCompare(a.getName(), b.getName()); }); this.children = this.children.filter(function(opt) { return !opt.option.match(/^port_/) }); @@ -929,18 +971,6 @@ return baseclass.extend({ for (var port_name in seen_ports) ports.push(port_name); - ports.sort(function(a, b) { - var m1 = a.match(/^(.+?)([0-9]*)$/), - m2 = b.match(/^(.+?)([0-9]*)$/); - - if (m1[1] < m2[1]) - return -1; - else if (m1[1] > m2[1]) - return 1; - else - return +(m1[2] || 0) - +(m2[2] || 0); - }); - ss.updatePorts(ports); }, diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js old mode 100755 new mode 100644 index 6c6163c7c..3a213a20c --- a/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js @@ -5,7 +5,9 @@ 'require rpc'; 'require uci'; 'require form'; +'require network'; 'require validation'; +'require tools.widgets as widgets'; var callHostHints, callDUIDHints, callDHCPLeases, CBILeaseStatus, CBILease6Status; @@ -65,6 +67,58 @@ CBILease6Status = form.DummyValue.extend({ } }); +function calculateNetwork(addr, mask) { + addr = validation.parseIPv4(String(addr)); + + if (!isNaN(mask)) + mask = validation.parseIPv4(network.prefixToMask(+mask)); + else + mask = validation.parseIPv4(String(mask)); + + if (addr == null || mask == null) + return null; + + return [ + [ + addr[0] & (mask[0] >>> 0 & 255), + addr[1] & (mask[1] >>> 0 & 255), + addr[2] & (mask[2] >>> 0 & 255), + addr[3] & (mask[3] >>> 0 & 255) + ].join('.'), + mask.join('.') + ]; +} + +function getDHCPPools() { + return uci.load('dhcp').then(function() { + let sections = uci.sections('dhcp', 'dhcp'), + tasks = [], pools = []; + + for (var i = 0; i < sections.length; i++) { + if (sections[i].ignore == '1' || !sections[i].interface) + continue; + + tasks.push(network.getNetwork(sections[i].interface).then(L.bind(function(section_id, net) { + var cidr = net ? (net.getIPAddrs()[0] || '').split('/') : null; + + if (cidr && cidr.length == 2) { + var net_mask = calculateNetwork(cidr[0], cidr[1]); + + pools.push({ + section_id: section_id, + network: net_mask[0], + netmask: net_mask[1] + }); + } + }, null, sections[i]['.name']))); + } + + return Promise.all(tasks).then(function() { + return pools; + }); + }); +} + function validateHostname(sid, s) { if (s == null || s == '') return true; @@ -72,7 +126,7 @@ function validateHostname(sid, s) { if (s.length > 256) return _('Expecting: %s').format(_('valid hostname')); - var labels = s.replace(/^\.+|\.$/g, '').split(/\./); + var labels = s.replace(/^\*?\.?|\.$/g, '').split(/\./); for (var i = 0; i < labels.length; i++) if (!labels[i].match(/^[a-z0-9_](?:[a-z0-9-]{0,61}[a-z0-9])?$/i)) @@ -102,13 +156,15 @@ function validateServerSpec(sid, s) { if (s == null || s == '') return true; - var m = s.match(/^(?:\/(.+)\/)?(.*)$/); + var m = s.match(/^(\/.*\/)?(.*)$/); if (!m) return _('Expecting: %s').format(_('valid hostname')); - var res = validateAddressList(sid, m[1]); - if (res !== true) - return res; + if (m[1] != '//' && m[1] != '/#/') { + var res = validateAddressList(sid, m[1]); + if (res !== true) + return res; + } if (m[2] == '' || m[2] == '#') return true; @@ -138,274 +194,552 @@ function validateServerSpec(sid, s) { return true; } +function validateMACAddr(pools, sid, s) { + if (s == null || s == '') + return true; + + var leases = uci.sections('dhcp', 'host'), + this_macs = L.toArray(s).map(function(m) { return m.toUpperCase() }); + + for (var i = 0; i < pools.length; i++) { + var this_net_mask = calculateNetwork(this.section.formvalue(sid, 'ip'), pools[i].netmask); + + if (!this_net_mask) + continue; + + for (var j = 0; j < leases.length; j++) { + if (leases[j]['.name'] == sid || !leases[j].ip) + continue; + + var lease_net_mask = calculateNetwork(leases[j].ip, pools[i].netmask); + + if (!lease_net_mask || this_net_mask[0] != lease_net_mask[0]) + continue; + + var lease_macs = L.toArray(leases[j].mac).map(function(m) { return m.toUpperCase() }); + + for (var k = 0; k < lease_macs.length; k++) + for (var l = 0; l < this_macs.length; l++) + if (lease_macs[k] == this_macs[l]) + return _('The MAC address %h is already used by another static lease in the same DHCP pool').format(this_macs[l]); + } + } + + return true; +} + return view.extend({ load: function() { return Promise.all([ callHostHints(), - callDUIDHints() + callDUIDHints(), + getDHCPPools(), + network.getDevices() ]); }, - render: function(hosts_duids) { + render: function(hosts_duids_pools) { var has_dhcpv6 = L.hasSystemFeature('dnsmasq', 'dhcpv6') || L.hasSystemFeature('odhcpd'), - hosts = hosts_duids[0], - duids = hosts_duids[1], + hosts = hosts_duids_pools[0], + duids = hosts_duids_pools[1], + pools = hosts_duids_pools[2], + ndevs = hosts_duids_pools[3], m, s, o, ss, so; - m = new form.Map('dhcp', _('DHCP and DNS'), _('Dnsmasq is a combined DHCP-Server and DNS-Forwarder for NAT firewalls')); + m = new form.Map('dhcp', _('DHCP and DNS'), + _('Dnsmasq is a lightweight DHCP server and DNS forwarder.')); - s = m.section(form.TypedSection, 'dnsmasq', _('Server Settings')); + s = m.section(form.TypedSection, 'dnsmasq'); s.anonymous = true; s.addremove = false; s.tab('general', _('General Settings')); + s.tab('relay', _('Relay')); s.tab('files', _('Resolv and Hosts Files')); - s.tab('tftp', _('TFTP Settings')); + s.tab('pxe_tftp', _('PXE/TFTP Settings')); s.tab('advanced', _('Advanced Settings')); s.tab('leases', _('Static Leases')); + s.tab('hosts', _('Hostnames')); + s.tab('srvhosts', _('SRV')); + s.tab('mxhosts', _('MX')); + s.tab('ipsets', _('IP Sets')); s.taboption('general', form.Flag, 'domainneeded', _('Domain required'), - _('Don\'t forward DNS-Requests without DNS-Name')); + _('Do not forward DNS queries without dots or domain parts.')); s.taboption('general', form.Flag, 'authoritative', _('Authoritative'), - _('This is the only DHCP in the local network')); - - - s.taboption('files', form.Flag, 'readethers', - _('Use /etc/ethers'), - _('Read /etc/ethers to configure the DHCP-Server')); - - s.taboption('files', form.Value, 'leasefile', - _('Leasefile'), - _('file where given DHCP-leases will be stored')); - - s.taboption('files', form.Flag, 'noresolv', - _('Ignore resolve file')).optional = true; - - o = s.taboption('files', form.Value, 'resolvfile', - _('Resolve file'), - _('local DNS file')); - - o.depends('noresolv', '0'); - o.placeholder = '/tmp/resolv.conf.d/resolv.conf.auto'; - o.optional = true; - - - s.taboption('files', form.Flag, 'nohosts', - _('Ignore /etc/hosts')).optional = true; - - s.taboption('files', form.DynamicList, 'addnhosts', - _('Additional Hosts files')).optional = true; - - o = s.taboption('advanced', form.Flag, 'quietdhcp', - _('Suppress logging'), - _('Suppress logging of the routine operation of these protocols')); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'sequential_ip', - _('Allocate IP sequentially'), - _('Allocate IP addresses sequentially, starting from the lowest available address')); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'boguspriv', - _('Filter private'), - _('Do not forward reverse lookups for local networks')); - o.default = o.enabled; - - s.taboption('advanced', form.Flag, 'filterwin2k', - _('Filter useless'), - _('Do not forward requests that cannot be answered by public name servers')); - - - s.taboption('advanced', form.Flag, 'localise_queries', - _('Localise queries'), - _('Localise hostname depending on the requesting subnet if multiple IPs are available')); - - if (L.hasSystemFeature('dnsmasq', 'dnssec')) { - o = s.taboption('advanced', form.Flag, 'dnssec', - _('DNSSEC')); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'dnsseccheckunsigned', - _('DNSSEC check unsigned'), - _('Requires upstream supports DNSSEC; verify unsigned domain responses really come from unsigned domains')); - o.default = o.enabled; - o.optional = true; - } + _('This is the only DHCP server in the local network.')); s.taboption('general', form.Value, 'local', _('Local server'), - _('Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only')); + _('Never forward matching domains and subdomains, resolve from DHCP or hosts files only.')); s.taboption('general', form.Value, 'domain', _('Local domain'), - _('Local domain suffix appended to DHCP names and hosts file entries')); + _('Local domain suffix appended to DHCP names and hosts file entries.')); - s.taboption('advanced', form.Flag, 'expandhosts', - _('Expand hosts'), - _('Add local domain suffix to names served from hosts files')); - - s.taboption('advanced', form.Flag, 'nonegcache', - _('No negative cache'), - _('Do not cache negative replies, e.g. for not existing domains')); - - s.taboption('advanced', form.Value, 'serversfile', - _('Additional servers file'), - _('This file may contain lines like \'server=/domain/1.2.3.4\' or \'server=1.2.3.4\' for domain-specific or full upstream DNS servers.')); - - s.taboption('advanced', form.Flag, 'strictorder', - _('Strict order'), - _('DNS servers will be queried in the order of the resolvfile')).optional = true; - - s.taboption('advanced', form.Flag, 'allservers', - _('All Servers'), - _('Query all available upstream DNS servers')).optional = true; - - o = s.taboption('advanced', form.DynamicList, 'bogusnxdomain', _('Bogus NX Domain Override'), - _('List of hosts that supply bogus NX domain results')); - - o.optional = true; - o.placeholder = '67.215.65.132'; - - - s.taboption('general', form.Flag, 'logqueries', + o = s.taboption('general', form.Flag, 'logqueries', _('Log queries'), - _('Write received DNS requests to syslog')).optional = true; - - o = s.taboption('general', form.DynamicList, 'server', _('DNS forwardings'), - _('List of DNS servers to forward requests to')); + _('Write received DNS queries to syslog.')); + o.optional = true; + o = s.taboption('general', form.DynamicList, 'server', + _('DNS forwardings'), + _('List of upstream resolvers to forward queries to.')); o.optional = true; o.placeholder = '/example.org/10.1.2.3'; o.validate = validateServerSpec; - - o = s.taboption('general', form.DynamicList, 'address', _('Addresses'), - _('List of domains to force to an IP address.')); - + o = s.taboption('general', form.DynamicList, 'address', + _('Addresses'), + _('Resolve specified FQDNs to an IP.') + '
' + + _('Syntax: /fqdn[/fqdn…]/[ipaddr].') + '
' + + _('/#/ matches any domain. /example.com/ returns NXDOMAIN.') + '
' + + _('/example.com/# returns NULL addresses (0.0.0.0 and ::) for example.com and its subdomains.')); o.optional = true; - o.placeholder = '/router.local/192.168.0.1'; + o.placeholder = '/router.local/router.lan/192.168.0.1'; + o = s.taboption('general', form.DynamicList, 'ipset', + _('IP sets'), + _('List of IP sets to populate with the IPs of DNS lookup results of the FQDNs also specified here.')); + o.optional = true; + o.placeholder = '/example.org/ipset,ipset6'; o = s.taboption('general', form.Flag, 'rebind_protection', _('Rebind protection'), - _('Discard upstream RFC1918 responses')); - + _('Discard upstream responses containing RFC1918 addresses.').format('https://datatracker.ietf.org/doc/html/rfc1918')); o.rmempty = false; - o = s.taboption('general', form.Flag, 'rebind_localhost', _('Allow localhost'), - _('Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services')); - + _('Exempt 127.0.0.0/8 and ::1 from rebinding checks, e.g. for RBL services.')); o.depends('rebind_protection', '1'); - o = s.taboption('general', form.DynamicList, 'rebind_domain', _('Domain whitelist'), - _('List of domains to allow RFC1918 responses for')); - o.optional = true; - + _('List of domains to allow RFC1918 responses for.')); o.depends('rebind_protection', '1'); + o.optional = true; o.placeholder = 'ihost.netflix.com'; o.validate = validateAddressList; + o = s.taboption('general', form.Flag, 'localservice', + _('Local service only'), + _('Accept DNS queries only from hosts whose address is on a local subnet.')); + o.optional = false; + o.rmempty = false; + + o = s.taboption('general', form.Flag, 'nonwildcard', + _('Non-wildcard'), + _('Bind dynamically to interfaces rather than wildcard address.')); + o.default = o.enabled; + o.optional = false; + o.rmempty = true; + + o = s.taboption('general', form.DynamicList, 'interface', + _('Listen interfaces'), + _('Listen only on the specified interfaces, and loopback if not excluded explicitly.')); + o.optional = true; + o.placeholder = 'lan'; + + o = s.taboption('general', form.DynamicList, 'notinterface', + _('Exclude interfaces'), + _('Do not listen on the specified interfaces.')); + o.optional = true; + o.placeholder = 'loopback'; + + o = s.taboption('relay', form.SectionValue, '__relays__', form.TableSection, 'relay', null, + _('Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4.') + + '
' + _('Note: you may also need a DHCP Proxy (currently unavailable) when specifying a non-standard Relay To port(addr#port).') + + '
' + _('You may add multiple unique Relay To on the same Listen addr.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + ss.nodescriptions = true; + + so = ss.option(form.Value, 'id', _('ID')); + so.rmempty = false; + so.optional = true; + + so = ss.option(widgets.NetworkSelect, 'interface', _('Interface')); + so.optional = true; + so.rmempty = false; + so.placeholder = 'lan'; + + so = ss.option(form.Value, 'local_addr', _('Listen address')); + so.rmempty = false; + so.datatype = 'ipaddr'; + + for (var family = 4; family <= 6; family += 2) { + for (var i = 0; i < ndevs.length; i++) { + var addrs = (family == 6) ? ndevs[i].getIP6Addrs() : ndevs[i].getIPAddrs(); + for (var j = 0; j < addrs.length; j++) + so.value(addrs[j].split('/')[0]); + } + } + + so = ss.option(form.Value, 'server_addr', _('Relay To address')); + so.rmempty = false; + so.optional = false; + so.placeholder = '192.168.10.1#535'; + + so.validate = function(section, value) { + var m = this.section.formvalue(section, 'local_addr'), + n = this.section.formvalue(section, 'server_addr'), + p; + if (n != null && n != '') + p = n.split('#'); + if (p.length > 1 && !/^[0-9]+$/.test(p[1])) + return _('Expected port number.'); + else + n = p[0]; + + if ((m == null || m == '') && (n == null || n == '')) + return _('Both Listen addr and Relay To must be specified.'); + + if ((validation.parseIPv6(m) && validation.parseIPv6(n)) || + validation.parseIPv4(m) && validation.parseIPv4(n)) + return true; + else + return _('Listen and Relay To IP family must be homogeneous.') + }; + + s.taboption('files', form.Flag, 'readethers', + _('Use /etc/ethers'), + _('Read /etc/ethers to configure the DHCP server.')); + + s.taboption('files', form.Value, 'leasefile', + _('Lease file'), + _('File to store DHCP lease information.')); + + o = s.taboption('files', form.Flag, 'noresolv', + _('Ignore resolv file')); + o.optional = true; + + o = s.taboption('files', form.Value, 'resolvfile', + _('Resolv file'), + _('File with upstream resolvers.')); + o.depends('noresolv', '0'); + o.placeholder = '/tmp/resolv.conf.d/resolv.conf.auto'; + o.optional = true; + + o = s.taboption('files', form.Flag, 'nohosts', + _('Ignore /etc/hosts')); + o.optional = true; + + o = s.taboption('files', form.DynamicList, 'addnhosts', + _('Additional hosts files')); + o.optional = true; + o.placeholder = '/etc/dnsmasq.hosts'; + + o = s.taboption('advanced', form.Flag, 'quietdhcp', + _('Suppress logging'), + _('Suppress logging of the routine operation for the DHCP protocol.')); + o.optional = true; + + o = s.taboption('advanced', form.Flag, 'sequential_ip', + _('Allocate IPs sequentially'), + _('Allocate IP addresses sequentially, starting from the lowest available address.')); + o.optional = true; + + o = s.taboption('advanced', form.Flag, 'boguspriv', + _('Filter private'), + _('Do not forward reverse lookups for local networks.')); + o.default = o.enabled; + + s.taboption('advanced', form.Flag, 'filterwin2k', + _('Filter SRV/SOA service discovery'), + _('Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links.') + '
' + + _('May prevent VoIP or other services from working.')); + + o = s.taboption('advanced', form.Flag, 'filter_aaaa', + _('Filter IPv6 AAAA records'), + _('Remove IPv6 addresses from the results and only return IPv4 addresses.') + '
' + + _('Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing.')); + o.optional = true; + + o = s.taboption('advanced', form.Flag, 'filter_a', + _('Filter IPv4 A records'), + _('Remove IPv4 addresses from the results and only return IPv6 addresses.')); + o.optional = true; + + s.taboption('advanced', form.Flag, 'localise_queries', + _('Localise queries'), + _('Return answers to DNS queries matching the subnet from which the query was received if multiple IPs are available.')); + + if (L.hasSystemFeature('dnsmasq', 'dnssec')) { + o = s.taboption('advanced', form.Flag, 'dnssec', + _('DNSSEC'), + _('Validate DNS replies and cache DNSSEC data, requires upstream to support DNSSEC.')); + o.optional = true; + + o = s.taboption('advanced', form.Flag, 'dnsseccheckunsigned', + _('DNSSEC check unsigned'), + _('Verify unsigned domain responses really come from unsigned domains.')); + o.default = o.enabled; + o.optional = true; + } + + s.taboption('advanced', form.Flag, 'expandhosts', + _('Expand hosts'), + _('Add local domain suffix to names served from hosts files.')); + + s.taboption('advanced', form.Flag, 'nonegcache', + _('No negative cache'), + _('Do not cache negative replies, e.g. for non-existent domains.')); + + o = s.taboption('advanced', form.Value, 'serversfile', + _('Additional servers file'), + _('File listing upstream resolvers, optionally domain-specific, e.g. server=1.2.3.4, server=/domain/1.2.3.4.')); + o.placeholder = '/etc/dnsmasq.servers'; + + o = s.taboption('advanced', form.Flag, 'strictorder', + _('Strict order'), + _('Upstream resolvers will be queried in the order of the resolv file.')); + o.optional = true; + + o = s.taboption('advanced', form.Flag, 'allservers', + _('All servers'), + _('Query all available upstream resolvers.')); + o.optional = true; + + o = s.taboption('advanced', form.DynamicList, 'bogusnxdomain', + _('IPs to override with NXDOMAIN'), + _('List of IP addresses to convert into NXDOMAIN responses.')); + o.optional = true; + o.placeholder = '64.94.110.11'; o = s.taboption('advanced', form.Value, 'port', - _('DNS server port'), - _('Listening port for inbound DNS queries')); - + _('DNS server port'), + _('Listening port for inbound DNS queries.')); o.optional = true; o.datatype = 'port'; o.placeholder = 53; - o = s.taboption('advanced', form.Value, 'queryport', - _('DNS query port'), - _('Fixed source port for outbound DNS queries')); - + _('DNS query port'), + _('Fixed source port for outbound DNS queries.')); o.optional = true; o.datatype = 'port'; o.placeholder = _('any'); - o = s.taboption('advanced', form.Value, 'dhcpleasemax', - _('Max. DHCP leases'), - _('Maximum allowed number of active DHCP leases')); - + _('Max. DHCP leases'), + _('Maximum allowed number of active DHCP leases.')); o.optional = true; o.datatype = 'uinteger'; o.placeholder = _('unlimited'); - o = s.taboption('advanced', form.Value, 'ednspacket_max', - _('Max. EDNS0 packet size'), - _('Maximum allowed size of EDNS.0 UDP packets')); - + _('Max. EDNS0 packet size'), + _('Maximum allowed size of EDNS0 UDP packets.')); o.optional = true; o.datatype = 'uinteger'; o.placeholder = 1280; - o = s.taboption('advanced', form.Value, 'dnsforwardmax', - _('Max. concurrent queries'), - _('Maximum allowed number of concurrent DNS queries')); - + _('Max. concurrent queries'), + _('Maximum allowed number of concurrent DNS queries.')); o.optional = true; o.datatype = 'uinteger'; o.placeholder = 150; o = s.taboption('advanced', form.Value, 'cachesize', _('Size of DNS query cache'), - _('Number of cached DNS entries (max is 10000, 0 is no caching)')); + _('Number of cached DNS entries, 10000 is maximum, 0 is no caching.')); o.optional = true; o.datatype = 'range(0,10000)'; - o.placeholder = 150; - - s.taboption('tftp', form.Flag, 'enable_tftp', - _('Enable TFTP server')).optional = true; - - o = s.taboption('tftp', form.Value, 'tftp_root', - _('TFTP server root'), - _('Root directory for files served via TFTP')); + o.placeholder = 1000; + o = s.taboption('pxe_tftp', form.Flag, 'enable_tftp', + _('Enable TFTP server'), + _('Enable the built-in single-instance TFTP server.')); o.optional = true; + + o = s.taboption('pxe_tftp', form.Value, 'tftp_root', + _('TFTP server root'), + _('Root directory for files served via TFTP. Enable TFTP server and TFTP server root turn on the TFTP server and serve files from TFTP server root.')); o.depends('enable_tftp', '1'); + o.optional = true; o.placeholder = '/'; - - o = s.taboption('tftp', form.Value, 'dhcp_boot', + o = s.taboption('pxe_tftp', form.Value, 'dhcp_boot', _('Network boot image'), - _('Filename of the boot image advertised to clients')); - - o.optional = true; + _('Filename of the boot image advertised to clients.')); o.depends('enable_tftp', '1'); + o.optional = true; o.placeholder = 'pxelinux.0'; - o = s.taboption('general', form.Flag, 'localservice', - _('Local Service Only'), - _('Limit DNS service to subnets interfaces on which we are serving DNS.')); - o.optional = false; - o.rmempty = false; + /* PXE - https://openwrt.org/docs/guide-user/base-system/dhcp#booting_options */ + o = s.taboption('pxe_tftp', form.SectionValue, '__pxe__', form.GridSection, 'boot', null, + _('Special PXE boot options for Dnsmasq.')); + ss = o.subsection; + ss.addremove = true; + ss.anonymous = true; + ss.nodescriptions = true; - o = s.taboption('general', form.Flag, 'nonwildcard', - _('Non-wildcard'), - _('Bind dynamically to interfaces rather than wildcard address (recommended as linux default)')); - o.default = o.enabled; - o.optional = false; - o.rmempty = true; + so = ss.option(form.Value, 'filename', + _('Filename'), + _('Host requests this filename from the boot server.')); + so.optional = false; + so.placeholder = 'pxelinux.0'; - o = s.taboption('general', form.DynamicList, 'interface', - _('Listen Interfaces'), - _('Limit listening to these interfaces, and loopback.')); - o.optional = true; + so = ss.option(form.Value, 'servername', + _('Server name'), + _('The hostname of the boot server')); + so.optional = false; + so.placeholder = 'myNAS'; - o = s.taboption('general', form.DynamicList, 'notinterface', - _('Exclude interfaces'), - _('Prevent listening on these interfaces.')); - o.optional = true; + so = ss.option(form.Value, 'serveraddress', + _('Server address'), + _('The IP address of the boot server')); + so.optional = false; + so.placeholder = '192.168.1.2'; + + so = ss.option(form.DynamicList, 'dhcp_option', + _('DHCP Options'), + _('Options for the Network-ID. (Note: needs also Network-ID.) E.g. "42,192.168.1.4" for NTP server, "3,192.168.4.4" for default route. 0.0.0.0 means "the address of the system running dnsmasq".')); + so.optional = true; + so.placeholder = '42,192.168.1.4'; + + so = ss.option(widgets.DeviceSelect, 'networkid', + _('Network-ID'), + _('Apply DHCP Options to this net. (Empty = all clients).')); + so.optional = true; + so.noaliases = true; + + so = ss.option(form.Flag, 'force', + _('Force'), + _('Always send DHCP Options. Sometimes needed, with e.g. PXELinux.')); + so.optional = true; + + so = ss.option(form.Value, 'instance', + _('Instance'), + _('Dnsmasq instance to which this boot section is bound. If unspecified, the section is valid for all dnsmasq instances.')); + so.optional = true; + + Object.values(L.uci.sections('dhcp', 'dnsmasq')).forEach(function(val, index) { + so.value(index, '%s (Domain: %s, Local: %s)'.format(index, val.domain || '?', val.local || '?')); + }); + + o = s.taboption('srvhosts', form.SectionValue, '__srvhosts__', form.TableSection, 'srvhost', null, + _('Bind service records to a domain name: specify the location of services. See RFC2782.').format('https://datatracker.ietf.org/doc/html/rfc2782') + + '
' + _('_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is possible, no browsers support SRV records.)') + + '
' + _('_proto: _tcp, _udp, _sctp, _quic, … .') + + '
' + _('You may add multiple records for the same Target.') + + '
' + _('Larger weights (of the same prio) are given a proportionately higher probability of being selected.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + + so = ss.option(form.Value, 'srv', _('SRV'), _('Syntax: _service._proto.example.com.')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = '_sip._tcp.example.com'; + + so = ss.option(form.Value, 'target', _('Target'), _('CNAME or fqdn')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'sip.example.com'; + + so = ss.option(form.Value, 'port', _('Port')); + so.rmempty = false; + so.datatype = 'port'; + so.placeholder = '5060'; + + so = ss.option(form.Value, 'class', _('Priority'), _('Ordinal: lower comes first.')); + so.rmempty = true; + so.datatype = 'range(0,65535)'; + so.placeholder = '10'; + + so = ss.option(form.Value, 'weight', _('Weight')); + so.rmempty = true; + so.datatype = 'range(0,65535)'; + so.placeholder = '50'; + + o = s.taboption('mxhosts', form.SectionValue, '__mxhosts__', form.TableSection, 'mxhost', null, + _('Bind service records to a domain name: specify the location of services.') + + '
' + _('You may add multiple records for the same domain.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + ss.rowcolors = true; + ss.nodescriptions = true; + + so = ss.option(form.Value, 'domain', _('Domain')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'example.com'; + + so = ss.option(form.Value, 'relay', _('Relay')); + so.rmempty = false; + so.datatype = 'hostname'; + so.placeholder = 'relay.example.com'; + + so = ss.option(form.Value, 'pref', _('Priority'), _('Ordinal: lower comes first.')); + so.rmempty = true; + so.datatype = 'range(0,65535)'; + so.placeholder = '0'; + + o = s.taboption('hosts', form.SectionValue, '__hosts__', form.GridSection, 'domain', null, + _('Hostnames are used to bind a domain name to an IP address. This setting is redundant for hostnames already configured with static leases, but it can be useful to rebind an FQDN.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + + so = ss.option(form.Value, 'name', _('Hostname')); + so.rmempty = false; + so.datatype = 'hostname'; + + so = ss.option(form.Value, 'ip', _('IP address')); + so.rmempty = false; + so.datatype = 'ipaddr'; + + var ipaddrs = {}; + + Object.keys(hosts).forEach(function(mac) { + var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4); + + for (var i = 0; i < addrs.length; i++) + ipaddrs[addrs[i]] = hosts[mac].name || mac; + }); + + L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) { + so.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4])); + }); + + o = s.taboption('ipsets', form.SectionValue, '__ipsets__', form.GridSection, 'ipset', null, + _('List of IP sets to populate with the IPs of DNS lookup results of the FQDNs also specified here.')); + + ss = o.subsection; + + ss.addremove = true; + ss.anonymous = true; + ss.sortable = true; + + so = ss.option(form.DynamicList, 'name', _('IP set')); + so.rmempty = false; + so.datatype = 'string'; + + so = ss.option(form.DynamicList, 'domain', _('Domain')); + so.rmempty = false; + so.datatype = 'hostname'; o = s.taboption('leases', form.SectionValue, '__leases__', form.GridSection, 'host', null, _('Static leases are used to assign fixed IP addresses and symbolic hostnames to DHCP clients. They are also required for non-dynamic interface configurations where only hosts with a corresponding lease are served.') + '
' + @@ -415,6 +749,7 @@ return view.extend({ ss.addremove = true; ss.anonymous = true; + ss.sortable = true; so = ss.option(form.Value, 'name', _('Hostname')); so.validate = validateHostname; @@ -428,8 +763,8 @@ return view.extend({ uci.unset('dhcp', section, 'dns'); }; - so = ss.option(form.Value, 'mac', _('MAC-Address')); - so.datatype = 'list(unique(macaddr))'; + so = ss.option(form.Value, 'mac', _('MAC address')); + so.datatype = 'list(macaddr)'; so.rmempty = true; so.cfgvalue = function(section) { var macs = L.toArray(uci.get('dhcp', section, 'mac')), @@ -468,75 +803,54 @@ return view.extend({ return node; }; + so.validate = validateMACAddr.bind(so, pools); Object.keys(hosts).forEach(function(mac) { var hint = hosts[mac].name || L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4)[0]; so.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac); }); - so.write = function(section, value) { - var ip = this.map.lookupOption('ip', section)[0].formvalue(section); - var hosts = uci.sections('dhcp', 'host'); - var section_removed = false; - - for (var i = 0; i < hosts.length; i++) { - if (ip == hosts[i].ip) { - uci.set('dhcp', hosts[i]['.name'], 'mac', [hosts[i].mac, value].join(' ')); - uci.remove('dhcp', section); - section_removed = true; - break; - } - } - - if (!section_removed) { - uci.set('dhcp', section, 'mac', value); - } - } - - so = ss.option(form.Value, 'ip', _('IPv4-Address')); + so = ss.option(form.Value, 'ip', _('IPv4 address')); so.datatype = 'or(ip4addr,"ignore")'; so.validate = function(section, value) { - var mac = this.map.lookupOption('mac', section), - name = this.map.lookupOption('name', section), - m = mac ? mac[0].formvalue(section) : null, - n = name ? name[0].formvalue(section) : null; + var m = this.section.formvalue(section, 'mac'), + n = this.section.formvalue(section, 'name'); if ((m == null || m == '') && (n == null || n == '')) - return _('One of hostname or mac address must be specified!'); + return _('One of hostname or MAC address must be specified!'); - return true; + if (value == null || value == '' || value == 'ignore') + return true; + + var leases = uci.sections('dhcp', 'host'); + + for (var i = 0; i < leases.length; i++) + if (leases[i]['.name'] != section && leases[i].ip == value) + return _('The IP address %h is already used by another static lease').format(value); + + for (var i = 0; i < pools.length; i++) { + var net_mask = calculateNetwork(value, pools[i].netmask); + + if (net_mask && net_mask[0] == pools[i].network) + return true; + } + + return _('The IP address is outside of any DHCP pool address range'); }; - var ipaddrs = {}; - - Object.keys(hosts).forEach(function(mac) { - var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4); - - for (var i = 0; i < addrs.length; i++) - ipaddrs[addrs[i]] = hosts[mac].name; - }); - L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) { so.value(ipv4, ipaddrs[ipv4] ? '%s (%s)'.format(ipv4, ipaddrs[ipv4]) : ipv4); }); - so = ss.option(form.Value, 'gw', _('Gateway IPv4 Address')); - so.rmempty = true; - so.datatype = 'or(ip4addr,"ignore")'; - Object.keys(hosts).forEach(function(mac) { - if (hosts[mac].ipv4) - so.value(hosts[mac].ipv4); - }); - so = ss.option(form.Value, 'leasetime', _('Lease time')); so.rmempty = true; - so = ss.option(form.Value, 'duid', _('DUID')); + so = ss.option(form.Value, 'duid', _('DUID')); so.datatype = 'and(rangelength(20,36),hexstring)'; Object.keys(duids).forEach(function(duid) { so.value(duid, '%s (%s)'.format(duid, duids[duid].hostname || duids[duid].macaddr || duids[duid].ip6addr || '?')); }); - so = ss.option(form.Value, 'hostid', _('IPv6-Suffix (hex)')); + so = ss.option(form.Value, 'hostid', _('IPv6 suffix (hex)')); o = s.taboption('leases', CBILeaseStatus, '__status__'); @@ -560,8 +874,17 @@ return view.extend({ else exp = '%t'.format(lease.expires); + var hint = lease.macaddr ? hosts[lease.macaddr] : null, + name = hint ? hint.name : null, + host = null; + + if (name && lease.hostname && lease.hostname != name) + host = '%s (%s)'.format(lease.hostname, name); + else if (lease.hostname) + host = lease.hostname; + return [ - lease.hostname || '?', + host || '-', lease.ipaddr, lease.macaddr, exp diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js old mode 100755 new mode 100644 index 5d6bd4765..1bfa95501 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js @@ -4,6 +4,7 @@ 'require fs'; 'require ui'; 'require uci'; +'require network'; return view.extend({ handleCommand: function(exec, args) { @@ -13,8 +14,7 @@ return view.extend({ buttons[i].setAttribute('disabled', 'true'); return fs.exec(exec, args).then(function(res) { - var out = document.querySelector('.command-output'); - out.style.display = ''; + var out = document.querySelector('textarea'); dom.content(out, [ res.stdout || '', res.stderr || '' ]); }).catch(function(err) { @@ -36,7 +36,7 @@ return view.extend({ handleTraceroute: function(ev, cmd) { var exec = cmd || 'traceroute', addr = ev.currentTarget.parentNode.previousSibling.value, - args = (exec == 'traceroute') ? [ '-q', '1', '-w', '1', '-n', addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; + args = (exec == 'traceroute') ? [ '-4', '-q', '1', '-w', '1', '-n', '-m', String(L.env.rpctimeout || 20), addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; return this.handleCommand(exec, args); }, @@ -47,12 +47,20 @@ return view.extend({ return this.handleCommand('nslookup', [ addr ]); }, + handleArpScan: function(ev, cmd) { + var addr = ev.currentTarget.parentNode.previousSibling.value; + + return this.handleCommand('arp-scan', [ '-l', '-I', addr ]); + }, + load: function() { return Promise.all([ L.resolveDefault(fs.stat('/bin/ping6'), {}), L.resolveDefault(fs.stat('/usr/bin/ping6'), {}), L.resolveDefault(fs.stat('/bin/traceroute6'), {}), L.resolveDefault(fs.stat('/usr/bin/traceroute6'), {}), + L.resolveDefault(fs.stat('/usr/bin/arp-scan'), {}), + network.getDevices(), uci.load('luci') ]); }, @@ -60,15 +68,15 @@ return view.extend({ render: function(res) { var has_ping6 = res[0].path || res[1].path, has_traceroute6 = res[2].path || res[3].path, + has_arpscan = res[4].path, + devices = res[5], dns_host = uci.get('luci', 'diag', 'dns') || 'openwrt.org', ping_host = uci.get('luci', 'diag', 'ping') || 'openwrt.org', route_host = uci.get('luci', 'diag', 'route') || 'openwrt.org'; - return E([], [ - E('h2', {}, [ _('Network Utilities') ]), - E('table', { 'class': 'table' }, [ + var table = E('table', { 'class': 'table' }, [ E('tr', { 'class': 'tr' }, [ - E('td', { 'class': 'td left' }, [ + E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', @@ -91,7 +99,7 @@ return view.extend({ ]) ]), - E('td', { 'class': 'td left' }, [ + E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', @@ -126,11 +134,45 @@ return view.extend({ 'click': ui.createHandlerFn(this, 'handleNslookup') }, [ _('Nslookup') ]) ]) - ]) + ]), + + has_arpscan ? E('td', { 'class': 'td left' }, [ + E('select', { + 'style': 'margin:5px 0' + }, devices.map(function(device) { + if (!device.isUp()) + return E([]); + + return E('option', { 'value': device.getName() }, [ device.getI18n() ]); + })), + E('span', { 'class': 'diag-action' }, [ + E('button', { + 'class': 'cbi-button cbi-button-action', + 'click': ui.createHandlerFn(this, 'handleArpScan') + }, [ _('Arp-scan') ]) + ]) + ]) : E([]), ]) - ]), - E('pre', { 'class': 'command-output', 'style': 'display:none' }) + ]); + + var view = E('div', { 'class': 'cbi-map'}, [ + E('h2', {}, [ _('Diagnostics') ]), + E('div', { 'class': 'cbi-map-descr'}, _('Execution of various network commands to check the connection and name resolution to other systems.')), + table, + E('div', {'class': 'cbi-section'}, [ + E('div', { 'id' : 'command-output'}, + E('textarea', { + 'id': 'widget.command-output', + 'style': 'width: 100%; font-family:monospace; white-space:pre', + 'readonly': true, + 'wrap': 'off', + 'rows': '20' + }) + ) + ]) ]); + + return view; }, handleSaveApply: null, diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js b/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js deleted file mode 100755 index 93ebf5ba6..000000000 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; -'require view'; -'require rpc'; -'require form'; - -return view.extend({ - callHostHints: rpc.declare({ - object: 'luci-rpc', - method: 'getHostHints', - expect: { '': {} } - }), - - load: function() { - return this.callHostHints(); - }, - - render: function(hosts) { - var m, s, o; - - m = new form.Map('dhcp', _('Hostnames')); - - s = m.section(form.GridSection, 'domain', _('Host entries')); - s.addremove = true; - s.anonymous = true; - s.sortable = true; - - o = s.option(form.Value, 'name', _('Hostname')); - o.datatype = 'hostname'; - o.rmempty = true; - - o = s.option(form.Value, 'ip', _('IP address')); - o.datatype = 'ipaddr'; - o.rmempty = true; - - var ipaddrs = {}; - - Object.keys(hosts).forEach(function(mac) { - var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4); - - for (var i = 0; i < addrs.length; i++) - ipaddrs[addrs[i]] = hosts[mac].name || mac; - }); - - L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) { - o.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4])); - }); - - return m.render(); - } -}); diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js old mode 100755 new mode 100644 index ff179d404..ebd9c05c5 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js @@ -228,6 +228,23 @@ function get_netmask(s, use_cfgvalue) { return subnetmask; } +function has_peerdns(proto) { + switch (proto) { + case 'dhcp': + case 'dhcpv6': + case 'qmi': + case 'ppp': + case 'pppoe': + case 'pppoa': + case 'pptp': + case 'openvpn': + case 'sstp': + return true; + } + + return false; +} + var cbiRichListValue = form.ListValue.extend({ renderWidget: function(section_id, option_index, cfgvalue) { var choices = this.transformChoices(); @@ -488,7 +505,7 @@ return view.extend({ }; s.modaltitle = function(section_id) { - return _('Interfaces') + ' » ' + section_id.toUpperCase(); + return _('Interfaces') + ' » ' + section_id; }; s.renderRowActions = function(section_id) { @@ -535,7 +552,7 @@ return view.extend({ var protocols = network.getProtocols(); protocols.sort(function(a, b) { - return a.getProtocol() > b.getProtocol(); + return L.naturalCompare(a.getProtocol(), b.getProtocol()); }); o = s.taboption('general', form.DummyValue, '_ifacestat_modal', _('Status')); @@ -643,7 +660,7 @@ return view.extend({ E('p', _('No DHCP Server configured for this interface') + '   '), E('button', { 'class': 'cbi-button cbi-button-add', - 'title': _('Setup DHCP Server'), + 'title': _('Set up DHCP Server'), 'click': ui.createHandlerFn(this, function(section_id, ev) { this.map.save(function() { uci.add('dhcp', 'dhcp', section_id); @@ -659,7 +676,7 @@ return view.extend({ } }); }, ifc.getName()) - }, _('Setup DHCP Server')) + }, _('Set up DHCP Server')) ]); }; @@ -805,7 +822,14 @@ return view.extend({ return flags.length ? flags : [ 'other-config' ]; }; so.remove = function(section_id) { - uci.set('dhcp', section_id, 'ra_flags', [ 'none' ]); + var existing = L.toArray(uci.get('dhcp', section_id, 'ra_flags')); + if (this.isActive(section_id)) { + if (existing.length != 1 || existing[0] != 'none') + uci.set('dhcp', section_id, 'ra_flags', [ 'none' ]); + } + else if (existing.length) { + uci.unset('dhcp', section_id, 'ra_flags'); + } }; so = ss.taboption('ipv6-ra', form.Value, 'ra_maxinterval', _('Max RA interval'), _('Maximum time allowed between sending unsolicited RA. Default is 600 seconds.')); @@ -835,15 +859,17 @@ return view.extend({ so.depends('ra', 'server'); so.depends({ ra: 'hybrid', master: '0' }); so.load = function(section_id) { - var dev = ifc.getL3Device(); + var dev = ifc.getL3Device(), + path = dev ? "/proc/sys/net/ipv6/conf/%s/mtu".format(dev.getName()) : null; - if (dev) { - var path = "/proc/sys/net/ipv6/conf/%s/mtu".format(dev.getName()); + return Promise.all([ + dev ? L.resolveDefault(fs.read(path), dev.getMTU()) : null, + this.super('load', [section_id]) + ]).then(L.bind(function(res) { + this.placeholder = +res[0]; - return L.resolveDefault(fs.read(path), dev.getMTU()).then(L.bind(function(data) { - this.placeholder = data; - }, this)); - } + return res[1]; + }, this)); }; so = ss.taboption('ipv6-ra', form.Value, 'ra_hoplimit', _('RA Hop Limit'), _('The maximum hops to be published in RA messages. Maximum is 255 hops.')); @@ -852,15 +878,17 @@ return view.extend({ so.depends('ra', 'server'); so.depends({ ra: 'hybrid', master: '0' }); so.load = function(section_id) { - var dev = ifc.getL3Device(); + var dev = ifc.getL3Device(), + path = dev ? "/proc/sys/net/ipv6/conf/%s/hop_limit".format(dev.getName()) : null; - if (dev) { - var path = "/proc/sys/net/ipv6/conf/%s/hop_limit".format(dev.getName()); + return Promise.all([ + dev ? L.resolveDefault(fs.read(path), 64) : null, + this.super('load', [section_id]) + ]).then(L.bind(function(res) { + this.placeholder = +res[0]; - return L.resolveDefault(fs.read(path), 64).then(L.bind(function(data) { - this.placeholder = data; - }, this)); - } + return res[1]; + }, this)); }; @@ -878,18 +906,24 @@ return view.extend({ so = ss.taboption('ipv6', form.DynamicList, 'dns', _('Announced IPv6 DNS servers'), _('Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. If left unspecified, the device will announce itself as IPv6 DNS server unless the Local IPv6 DNS server option is disabled.')); so.datatype = 'ip6addr("nomask")'; /* restrict to IPv6 only for now since dnsmasq (DHCPv4) does not honour this option */ + so.depends('ra', 'server'); + so.depends({ ra: 'hybrid', master: '0' }); so.depends('dhcpv6', 'server'); so.depends({ dhcpv6: 'hybrid', master: '0' }); so = ss.taboption('ipv6', form.Flag, 'dns_service', _('Local IPv6 DNS server'), _('Announce this device as IPv6 DNS server.')); so.default = so.enabled; + so.depends({ ra: 'server', dns: /^$/ }); + so.depends({ ra: 'hybrid', dns: /^$/, master: '0' }); so.depends({ dhcpv6: 'server', dns: /^$/ }); so.depends({ dhcpv6: 'hybrid', dns: /^$/, master: '0' }); so = ss.taboption('ipv6', form.DynamicList, 'domain', _('Announced DNS domains'), _('Specifies a fixed list of DNS search domains to announce via DHCPv6. If left unspecified, the local device DNS search domain will be announced.')); so.datatype = 'hostname'; + so.depends('ra', 'server'); + so.depends({ ra: 'hybrid', master: '0' }); so.depends('dhcpv6', 'server'); so.depends({ dhcpv6: 'hybrid', master: '0' }); @@ -919,13 +953,13 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Flag, 'defaultroute', _('Use default gateway'), _('If unchecked, no default route is configured')); o.default = o.enabled; - if (protoval != 'static') { + if (has_peerdns(protoval)) { o = nettools.replaceOption(s, 'advanced', form.Flag, 'peerdns', _('Use DNS servers advertised by peer'), _('If unchecked, the advertised DNS server addresses are ignored')); o.default = o.enabled; } o = nettools.replaceOption(s, 'advanced', form.DynamicList, 'dns', _('Use custom DNS servers')); - if (protoval != 'static') + if (has_peerdns(protoval)) o.depends('peerdns', '0'); o.datatype = 'ipaddr'; @@ -941,17 +975,6 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Value, 'metric', _('Use gateway metric')); o.datatype = 'uinteger'; o.placeholder = '0'; - - o = nettools.replaceOption(s,'advanced', form.ListValue, 'multipath', _('Multipath setting'), _('Only one interface must be set as Master.')); - o.value('on',_('Enabled')); - o.value('off',_('Disabled')); - o.value('master',_('Master')); - o.value('backup',_('Backup')); - o.default = 'off'; - - o = nettools.replaceOption(s,'advanced', form.Value, 'addlatency', _('Additional latency')); - o.datatype = 'uinteger'; - o.default = '0'; o = nettools.replaceOption(s, 'advanced', form.Value, 'ip4table', _('Override IPv4 routing table')); o.datatype = 'or(uinteger, string)'; @@ -961,7 +984,12 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Value, 'ip6table', _('Override IPv6 routing table')); o.datatype = 'or(uinteger, string)'; for (var i = 0; i < rtTables.length; i++) - o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][0], rtTables[i][1])); + o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); + + if (protoval == 'dhcpv6') { + o = nettools.replaceOption(s, 'advanced', form.Flag, 'sourcefilter', _('IPv6 source routing'), _('Automatically handle multiple uplink interfaces using source-based policy routing.')); + o.default = o.enabled; + } o = nettools.replaceOption(s, 'advanced', form.Flag, 'delegate', _('Delegate IPv6 prefixes'), _('Enable downstream delegation of IPv6 prefixes available on this interface')); o.default = o.enabled; @@ -1080,7 +1108,7 @@ return view.extend({ proto, name, device; protocols.sort(function(a, b) { - return a.getProtocol() > b.getProtocol(); + return L.naturalCompare(a.getProtocol(), b.getProtocol()); }); s2.render = function() { @@ -1154,6 +1182,9 @@ return view.extend({ protoclass.addDevice(device.formvalue('_new_')); m.children[0].addedSection = section_id; + + ui.hideModal(); + ui.showModal(null, E('p', { 'class': 'spinning' }, [ _('Loading data…') ])); }).then(L.bind(m.children[0].renderMoreOptionsModal, m.children[0], nameval)); }); }) @@ -1183,9 +1214,9 @@ return view.extend({ var node = E('div', { 'class': 'ifacebox' }, [ E('div', { 'class': 'ifacebox-head', - 'style': 'background-color:%s'.format(zone ? zone.getColor() : '#EEEEEE'), + 'style': firewall.getZoneColorStyle(zone), 'title': zone ? _('Part of zone %q').format(zone.getName()) : _('No zone assigned') - }, E('strong', net.getName().toUpperCase())), + }, E('strong', net.getName())), E('div', { 'class': 'ifacebox-body', 'id': '%s-ifc-devices'.format(section_id), @@ -1239,7 +1270,7 @@ return view.extend({ s.cfgsections = function() { var sections = uci.sections('network', 'device'), - section_ids = sections.sort(function(a, b) { return a.name > b.name }).map(function(s) { return s['.name'] }); + section_ids = sections.sort(function(a, b) { return L.naturalCompare(a.name, b.name) }).map(function(s) { return s['.name'] }); for (var i = 0; i < netDevs.length; i++) { if (sections.filter(function(s) { return s.name == netDevs[i].getName() }).length) @@ -1284,7 +1315,7 @@ return view.extend({ var trEl = this.super('renderRowActions', [ section_id, _('Configure…') ]), deleteBtn = trEl.querySelector('button:last-child'); - deleteBtn.firstChild.data = _('Reset'); + deleteBtn.firstChild.data = _('Unconfigure'); deleteBtn.setAttribute('title', _('Remove related device settings from the configuration')); deleteBtn.disabled = section_id.match(/^dev:/) ? true : null; @@ -1317,9 +1348,26 @@ return view.extend({ for (var i = 0; i < map.addedVLANs.length; i++) uci.remove('network', map.addedVLANs[i]); + if (this.addedSection) + uci.remove('network', this.addedSection); + return form.GridSection.prototype.handleModalCancel.apply(this, arguments); }; + s.handleRemove = function(section_id /*, ... */) { + var name = uci.get('network', section_id, 'name'), + type = uci.get('network', section_id, 'type'); + + if (name != null && type == 'bridge') { + uci.sections('network', 'bridge-vlan', function(bvs) { + if (bvs.device == name) + uci.remove('network', bvs['.name']); + }); + } + + return form.GridSection.prototype.handleRemove.apply(this, arguments); + }; + function getDevice(section_id) { var m = section_id.match(/^dev:(.+)$/), name = m ? m[1] : uci.get('network', section_id, 'name'); @@ -1422,7 +1470,7 @@ return view.extend({ mac = dev ? dev.getMAC() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mac || _('unknown')) + 'data-tooltip': _('The value is overridden by configuration.') }, [ val.toUpperCase() ]) : (mac || '-'); }; @@ -1434,7 +1482,7 @@ return view.extend({ mtu = dev ? dev.getMTU() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mtu || _('unknown')) + 'data-tooltip': _('The value is overridden by configuration.') }, [ val ]) : (mtu || '-').toString(); }; diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js b/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js old mode 100755 new mode 100644 index 7e11a3cb4..da1330aec --- a/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js @@ -1,22 +1,35 @@ 'use strict'; 'require view'; +'require fs'; +'require uci'; 'require form'; 'require network'; 'require tools.widgets as widgets'; return view.extend({ load: function() { - return network.getDevices(); + return Promise.all([ + network.getDevices(), + fs.lines('/etc/iproute2/rt_tables') + ]); }, - render: function(netdevs) { - var m, s, o; + render: function(data) { + var netDevs = data[0], + m, s, o; - m = new form.Map('network', _('Routes'), _('Routes specify over which interface and gateway a certain host or network can be reached.')); + var rtTables = data[1].map(function(l) { + var m = l.trim().match(/^(\d+)\s+(\S+)$/); + return m ? [ +m[1], m[2] ] : null; + }).filter(function(e) { + return e && e[0] > 0; + }); + + m = new form.Map('network', _('Routing'), _('Routing defines over which interface and gateway a certain host or network can be reached.')); m.tabbed = true; - for (var i = 4; i <= 6; i += 2) { - s = m.section(form.GridSection, (i == 4) ? 'route' : 'route6', (i == 4) ? _('Static IPv4 Routes') : _('Static IPv6 Routes')); + for (var family = 4; family <= 6; family += 2) { + s = m.section(form.GridSection, (family == 6) ? 'route6' : 'route', (family == 6) ? _('Static IPv6 Routes') : _('Static IPv4 Routes')); s.anonymous = true; s.addremove = true; s.sortable = true; @@ -25,44 +38,12 @@ return view.extend({ s.tab('general', _('General Settings')); s.tab('advanced', _('Advanced Settings')); - o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface')); - o.rmempty = false; + o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface'), _('Specifies the logical interface name of the parent (or master) interface this route belongs to')); + o.loopback = true; o.nocreate = true; - o = s.taboption('general', form.Flag, 'disabled', _('Disable'), _('Disable this route')); - o.rmempty = true; - o.default = o.disabled; - - o = s.taboption('general', form.Value, 'target', _('Target'), (i == 4) ? _('Host-IP or Network') : _('IPv6-Address or Network (CIDR)')); - o.datatype = (i == 4) ? 'ip4addr' : 'ip6addr'; - o.rmempty = false; - - if (i == 4) { - o = s.taboption('general', form.Value, 'netmask', _('IPv4-Netmask'), _('if target is a network')); - o.placeholder = '255.255.255.255'; - o.datatype = 'ip4addr'; - o.rmempty = true; - } - - o = s.taboption('general', form.Value, 'gateway', (i == 4) ? _('IPv4-Gateway') : _('IPv6-Gateway')); - o.datatype = (i == 4) ? 'ip4addr' : 'ip6addr'; - o.rmempty = true; - - o = s.taboption('advanced', form.Value, 'metric', _('Metric')); - o.placeholder = 0; - o.datatype = (i == 4) ? 'range(0,255)' : 'range(0,65535)'; - o.rmempty = true; - o.textvalue = function(section_id) { - return this.cfgvalue(section_id) || 0; - }; - - o = s.taboption('advanced', form.Value, 'mtu', _('MTU')); - o.placeholder = 1500; - o.datatype = 'range(64,9000)'; - o.rmempty = true; + o = s.taboption('general', form.ListValue, 'type', _('Route type'), _('Specifies the route type to be created')); o.modalonly = true; - - o = s.taboption('advanced', form.ListValue, 'type', _('Route type')); o.value('', 'unicast'); o.value('local'); o.value('broadcast'); @@ -71,36 +52,155 @@ return view.extend({ o.value('prohibit'); o.value('blackhole'); o.value('anycast'); - o.default = ''; - o.rmempty = true; - o.modalonly = true; - o = s.taboption('advanced', form.Value, 'table', _('Route table')); - o.value('local', 'local (255)'); - o.value('main', 'main (254)'); - o.value('default', 'default (253)'); - o.rmempty = true; - o.modalonly = true; + o = s.taboption('general', form.Value, 'target', _('Target'), _('Network address')); + o.rmempty = false; + o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; + o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; o.cfgvalue = function(section_id) { - var cfgvalue = this.map.data.get('network', section_id, 'table'); - return cfgvalue || 'main'; + var section_type = uci.get('network', section_id, '.type'), + target = uci.get('network', section_id, 'target'), + mask = uci.get('network', section_id, 'netmask'), + v6 = (section_type == 'route6') ? true : false, + bits = mask ? network.maskToPrefix(mask, v6) : (v6 ? 128 : 32); + if (target) { + return target.split('/')[1] ? target : target + '/' + bits; + } + } + o.write = function(section_id, formvalue) { + uci.set('network', section_id, 'target', formvalue); + uci.unset('network', section_id, 'netmask'); + } + + o = s.taboption('general', form.Value, 'gateway', _('Gateway'), _('Specifies the network gateway. If omitted, the gateway from the parent interface is taken if any, otherwise creates a link scope route. If set to 0.0.0.0 no gateway will be specified for the route')); + o.datatype = (family == 6) ? 'ip6addr("nomask")' : 'ip4addr("nomask")'; + o.placeholder = (family == 6) ? 'fe80::1' : '192.168.0.1'; + + o = s.taboption('advanced', form.Value, 'metric', _('Metric'), _('Specifies the route metric to use')); + o.datatype = 'uinteger'; + o.placeholder = 0; + o.textvalue = function(section_id) { + return this.cfgvalue(section_id) || 0; }; - o = s.taboption('advanced', form.Value, 'source', _('Source Address')); - o.placeholder = E('em', _('automatic')); - for (var j = 0; j < netdevs.length; j++) { - var addrs = netdevs[j].getIPAddrs(); - for (var k = 0; k < addrs.length; k++) - o.value(addrs[k].split('/')[0]); - } - o.datatype = (i == 4) ? 'ip4addr' : 'ip6addr'; - o.default = ''; - o.rmempty = true; + o = s.taboption('advanced', form.Value, 'mtu', _('MTU'), _('Defines a specific MTU for this route')); o.modalonly = true; + o.datatype = 'and(uinteger,range(64,9000))'; + o.placeholder = 1500; - o = s.taboption('advanced', form.Flag, 'onlink', _('On-Link route')); + o = s.taboption('advanced', form.Value, 'table', _('Table'), _('The rule target is a table lookup ID: a numeric table index ranging from 0 to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special aliases local (255), main (254) and default (253) are also valid')); + o.datatype = 'or(uinteger, string)'; + for (var i = 0; i < rtTables.length; i++) + o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); + o.textvalue = function(section_id) { + return this.cfgvalue(section_id) || 'main'; + }; + + o = s.taboption('advanced', form.Value, 'source', _('Source'), _('Specifies the preferred source address when sending to destinations covered by the target')); + o.modalonly = true; + o.datatype = (family == 6) ? 'ip6addr' : 'ip4addr'; + o.placeholder = E('em', _('auto')); + for (var i = 0; i < netDevs.length; i++) { + var addrs = (family == 6) ? netDevs[i].getIP6Addrs() : netDevs[i].getIPAddrs(); + for (var j = 0; j < addrs.length; j++) + o.value(addrs[j].split('/')[0]); + } + + o = s.taboption('advanced', form.Flag, 'onlink', _('On-link'), _('When enabled, gateway is on-link even if the gateway does not match any interface prefix')); + o.modalonly = true; + o.default = o.disabled; + + o = s.taboption('advanced', form.Flag, 'disabled', _('Disable')); + o.modalonly = false; + o.editable = true; + o.default = o.disabled; + } + + for (var family = 4; family <= 6; family += 2) { + s = m.section(form.GridSection, (family == 6) ? 'rule6' : 'rule', (family == 6) ? _('IPv6 Rules') : _('IPv4 Rules')); + s.anonymous = true; + s.addremove = true; + s.sortable = true; + s.nodescriptions = true; + + s.tab('general', _('General Settings')); + s.tab('advanced', _('Advanced Settings')); + + o = s.taboption('general', form.Value, 'priority', _('Priority'), _('Specifies the ordering of the IP rules')); + o.datatype = 'uinteger'; + o.placeholder = 30000; + o.textvalue = function(section_id) { + return this.cfgvalue(section_id) || E('em', _('auto')); + }; + + o = s.taboption('general', form.ListValue, 'action', _('Rule type'), _('Specifies the rule target routing action')); + o.modalonly = true; + o.value('', 'unicast'); + o.value('unreachable'); + o.value('prohibit'); + o.value('blackhole'); + o.value('throw'); + + o = s.taboption('general', widgets.NetworkSelect, 'in', _('Incoming interface'), _('Specifies the incoming logical interface name')); + o.loopback = true; + o.nocreate = true; + + o = s.taboption('general', form.Value, 'src', _('Source'), _('Specifies the source subnet to match (CIDR notation)')); + o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; + o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; + o.textvalue = function(section_id) { + return this.cfgvalue(section_id) || E('em', _('any')); + }; + + o = s.taboption('general', widgets.NetworkSelect, 'out', _('Outgoing interface'), _('Specifies the outgoing logical interface name')); + o.loopback = true; + o.nocreate = true; + + o = s.taboption('general', form.Value, 'dest', _('Destination'), _('Specifies the destination subnet to match (CIDR notation)')); + o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; + o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; + o.textvalue = function(section_id) { + return this.cfgvalue(section_id) || E('em', _('any')); + }; + + o = s.taboption('general', form.Value, 'lookup', _('Table'), _('The rule target is a table lookup ID: a numeric table index ranging from 0 to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special aliases local (255), main (254) and default (253) are also valid')); + o.datatype = 'or(uinteger, string)'; + for (var i = 0; i < rtTables.length; i++) + o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); + + o = s.taboption('advanced', form.Value, 'goto', _('Jump to rule'), _('The rule target is a jump to another rule specified by its priority value')); + o.modalonly = true; + o.datatype = 'uinteger'; + o.placeholder = 80000; + + o = s.taboption('advanced', form.Value, 'mark', _('Firewall mark'), _('Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match mark 255 or 0x0/0x1 to match any even mark value')); + o.modalonly = true; + o.datatype = 'string'; + o.placeholder = '0x1/0xf'; + + o = s.taboption('advanced', form.Value, 'tos', _('Type of service'), _('Specifies the TOS value to match in IP headers')); + o.modalonly = true; + o.datatype = 'uinteger'; + o.placeholder = 10; + + o = s.taboption('advanced', form.Value, 'uidrange', _('User identifier'), _('Specifies an individual UID or range of UIDs to match, e.g. 1000 to match corresponding UID or 1000-1005 to inclusively match all UIDs within the corresponding range')); + o.modalonly = true; + o.datatype = 'string'; + o.placeholder = '1000-1005'; + + o = s.taboption('advanced', form.Value, 'suppress_prefixlength', _('Prefix suppressor'), _('Reject routing decisions that have a prefix length less than or equal to the specified value')); + o.modalonly = true; + o.datatype = (family == 6) ? 'ip6prefix' : 'ip4prefix'; + o.placeholder = (family == 6) ? 64 : 24; + + o = s.taboption('advanced', form.Flag, 'invert', _('Invert match'), _('If set, the meaning of the match options is inverted')); + o.modalonly = true; + o.default = o.disabled; + + o = s.taboption('advanced', form.Flag, 'disabled', _('Disable')); + o.modalonly = false; + o.editable = true; o.default = o.disabled; - o.rmempty = true; } return m.render(); diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js b/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js old mode 100755 new mode 100644 index 3133d2725..535a133e7 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js @@ -180,8 +180,10 @@ return view.extend({ s = m.section(form.NamedSection, sid, 'switch', switch_title); s.addremove = false; - if (feat.vlan_option) - s.option(form.Flag, feat.vlan_option, _('Enable VLAN functionality')); + if (feat.vlan_option) { + o = s.option(form.Flag, feat.vlan_option, _('Enable VLAN functionality')); + o.rmempty = false; + } if (feat.learning_option) { o = s.option(form.Flag, feat.learning_option, _('Enable learning and aging')); @@ -222,7 +224,7 @@ return view.extend({ s.filter = function(section_id) { var device = uci.get('network', section_id, 'device'); - return (device == switch_name); + return (device == this.device); }; s.cfgsections = function() { @@ -246,7 +248,7 @@ return view.extend({ max_vid = 0; for (var j = 0; j < sections.length; j++) { - if (sections[j].device != s.device) + if (sections[j].device != this.device) continue; var vlan = +sections[j].vlan, @@ -259,7 +261,7 @@ return view.extend({ max_vid = vid; } - uci.set('network', section_id, 'device', s.device); + uci.set('network', section_id, 'device', this.device); uci.set('network', section_id, 'vlan', max_vlan + 1); if (feat.vid_option) @@ -268,8 +270,6 @@ return view.extend({ return this.map.save(null, true); }; - var port_opts = []; - o = s.option(form.Value, feat.vid_option || 'vlan', 'VLAN ID'); o.rmempty = false; o.forcewrite = true; @@ -297,21 +297,23 @@ return view.extend({ return true; }; + var port_opts = o.port_opts = []; + o.write = function(section_id, value) { var topology = this.section.topology, values = []; - for (var i = 0; i < port_opts.length; i++) { - var tagging = port_opts[i].formvalue(section_id), + for (var i = 0; i < this.port_opts.length; i++) { + var tagging = this.port_opts[i].formvalue(section_id), portspec = Array.isArray(topology.ports) ? topology.ports[i] : null; if (tagging == 't') - values.push(port_opts[i].option + tagging); + values.push(this.port_opts[i].option + tagging); else if (tagging == 'u') - values.push(port_opts[i].option); + values.push(this.port_opts[i].option); if (portspec && portspec.device) { - var old_tag = port_opts[i].cfgvalue(section_id), + var old_tag = this.port_opts[i].cfgvalue(section_id), old_vid = this.cfgvalue(section_id); if (old_tag != tagging || old_vid != value) { diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js b/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js old mode 100755 new mode 100644 index 5115a69eb..6b1bd262f --- a/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js @@ -314,24 +314,16 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.channels = { '2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], - '6g': [], + '6g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '60g': [] }; for (var i = 0; i < data[1].length; i++) { - var band; - - if (data[1][i].mhz >= 2412 && data[1][i].mhz <= 2484) - band = '2g'; - else if (data[1][i].mhz >= 5160 && data[1][i].mhz <= 5885) - band = '5g'; - else if (data[1][i].mhz >= 5925 && data[1][i].mhz <= 7125) - band = '6g'; - else if (data[1][i].mhz >= 58329 && data[1][i].mhz <= 69120) - band = '60g'; - else + if (!data[1][i].band) continue; + var band = '%dg'.format(data[1][i].band); + this.channels[band].push( data[1][i].channel, '%d (%d Mhz)'.format(data[1][i].channel, data[1][i].mhz), @@ -343,10 +335,10 @@ var CBIWifiFrequencyValue = form.Value.extend({ .reduce(function(o, v) { o[v] = true; return o }, {}); this.modes = [ - '', 'Legacy', true, + '', 'Legacy', hwmodelist.a || hwmodelist.b || hwmodelist.g, 'n', 'N', hwmodelist.n, - 'ac', 'AC', hwmodelist.ac, - 'ax', 'AX', hwmodelist.ax + 'ac', 'AC', L.hasSystemFeature('hostapd', '11ac') && hwmodelist.ac, + 'ax', 'AX', L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax ]; var htmodelist = L.toArray(data[0] ? data[0].getHTModes() : null) @@ -375,7 +367,8 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.bands = { '': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, - '5g', '5 GHz', this.channels['5g'].length > 3 + '5g', '5 GHz', this.channels['5g'].length > 3, + '60g', '60 GHz', this.channels['60g'].length > 0 ], 'n': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, @@ -386,7 +379,8 @@ var CBIWifiFrequencyValue = form.Value.extend({ ], 'ax': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, - '5g', '5 GHz', this.channels['5g'].length > 3 + '5g', '5 GHz', this.channels['5g'].length > 3, + '6g', '6 GHz', this.channels['6g'].length > 3 ] }; }, this)); @@ -479,7 +473,7 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.toggleWifiBand(elem); bwdt.value = htval; - chan.value = chval || chan.options[0].value; + chan.value = chval || (chan.options[0] ? chan.options[0].value : 'auto'); return elem; }, @@ -741,7 +735,8 @@ return view.extend({ load: function() { return Promise.all([ uci.changes(), - uci.load('wireless') + uci.load('wireless'), + uci.load('system') ]); }, @@ -941,7 +936,7 @@ return view.extend({ if (hwtype == 'mac80211') { o = ss.taboption('general', form.Flag, 'legacy_rates', _('Allow legacy 802.11b rates'), _('Legacy or badly behaving devices may require legacy 802.11b rates to interoperate. Airtime efficiency may be significantly reduced where these are used. It is recommended to not allow 802.11b rates where possible.')); - o.depends({'_freq': '11g', '!contains': true}); + o.depends({'_freq': '2g', '!contains': true}); o = ss.taboption('general', CBIWifiTxPowerValue, 'txpower', _('Maximum transmit power'), _('Specifies the maximum transmit power the wireless radio may use. Depending on regulatory requirements and wireless usage, the actual transmit power may be reduced by the driver.')); o.wifiNetwork = radioNet; @@ -985,6 +980,7 @@ return view.extend({ ss.tab('encryption', _('Wireless Security')); ss.tab('macfilter', _('MAC-Filter')); ss.tab('advanced', _('Advanced Settings')); + ss.tab('roaming', _('WLAN roaming'), _('Settings for assisting wireless clients in roaming between multiple APs: 802.11r, 802.11k and 802.11v')); o = ss.taboption('general', form.ListValue, 'mode', _('Mode')); o.value('ap', _('Access Point')); @@ -1089,6 +1085,7 @@ return view.extend({ o = ss.taboption('macfilter', form.DynamicList, 'maclist', _('MAC-List')); o.datatype = 'macaddr'; + o.retain = true; o.depends('macfilter', 'allow'); o.depends('macfilter', 'deny'); o.load = function(section_id) { @@ -1144,16 +1141,27 @@ return view.extend({ o.depends('mode', 'ap-wds'); o.default = o.enabled; + /* https://w1.fi/cgit/hostap/commit/?id=34f7c699a6bcb5c45f82ceb6743354ad79296078 */ + /* multicast_to_unicast https://github.com/openwrt/openwrt/commit/7babb978ad9d7fc29acb1ff86afb1eb343af303a */ + o = ss.taboption('advanced', form.Flag, 'multicast_to_unicast', _('Multi To Unicast'), _('ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast to the STA MAC address. Note: This is not Directed Multicast Service (DMS) in 802.11v. Note: might break receiver STA multicast expectations.')); + o.rmempty = true; + o = ss.taboption('advanced', form.Flag, 'isolate', _('Isolate Clients'), _('Prevents client-to-client communication')); o.depends('mode', 'ap'); o.depends('mode', 'ap-wds'); o = ss.taboption('advanced', form.Value, 'ifname', _('Interface name'), _('Override default interface name')); o.optional = true; + o.datatype = 'netdevname'; o.placeholder = radioNet.getIfname(); if (/^radio\d+\.network/.test(o.placeholder)) o.placeholder = ''; + o = ss.taboption('advanced', form.Value, 'macaddr', _('MAC address'), _('Override default MAC address - the range of usable addresses might be limited by the driver')); + o.optional = true; + o.placeholder = radioNet.getActiveBSSID(); + o.datatype = 'macaddr'; + o = ss.taboption('advanced', form.Flag, 'short_preamble', _('Short Preamble')); o.default = o.enabled; @@ -1171,7 +1179,7 @@ return view.extend({ o.optional = true; o.datatype = 'uinteger'; - o = ss.taboption('advanced', form.Value, 'max_inactivity', _('Station inactivity limit'), _('sec')); + o = ss.taboption('advanced', form.Value, 'max_inactivity', _('Station inactivity limit'), _('802.11v: BSS Max Idle. Units: seconds.')); o.optional = true; o.placeholder = 300; o.datatype = 'uinteger'; @@ -1274,7 +1282,7 @@ return view.extend({ if (has_hostapd || has_supplicant) { crypto_modes.push(['psk2', 'WPA2-PSK', 35]); crypto_modes.push(['psk-mixed', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]); - crypto_modes.push(['psk', 'WPA-PSK', 21]); + crypto_modes.push(['psk', 'WPA-PSK', 12]); } else { encr.description = _('WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP and ad-hoc mode) to be installed.'); @@ -1374,7 +1382,7 @@ return view.extend({ else if (hwtype == 'broadcom') { crypto_modes.push(['psk2', 'WPA2-PSK', 33]); crypto_modes.push(['psk+psk2', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]); - crypto_modes.push(['psk', 'WPA-PSK', 21]); + crypto_modes.push(['psk', 'WPA-PSK', 12]); crypto_modes.push(['wep-open', _('WEP Open System'), 11]); crypto_modes.push(['wep-shared', _('WEP Shared Key'), 10]); } @@ -1392,51 +1400,90 @@ return view.extend({ } - o = ss.taboption('encryption', form.Value, 'auth_server', _('Radius-Authentication-Server')); + o = ss.taboption('encryption', form.Value, 'auth_server', _('RADIUS Authentication Server')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'auth_port', _('Radius-Authentication-Port'), _('Default %d').format(1812)); + o = ss.taboption('encryption', form.Value, 'auth_port', _('RADIUS Authentication Port')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; + o.placeholder = '1812'; - o = ss.taboption('encryption', form.Value, 'auth_secret', _('Radius-Authentication-Secret')); + o = ss.taboption('encryption', form.Value, 'auth_secret', _('RADIUS Authentication Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - o = ss.taboption('encryption', form.Value, 'acct_server', _('Radius-Accounting-Server')); + o = ss.taboption('encryption', form.Value, 'acct_server', _('RADIUS Accounting Server')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'acct_port', _('Radius-Accounting-Port'), _('Default %d').format(1813)); + o = ss.taboption('encryption', form.Value, 'acct_port', _('RADIUS Accounting Port')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; + o.placeholder = '1813'; - o = ss.taboption('encryption', form.Value, 'acct_secret', _('Radius-Accounting-Secret')); + o = ss.taboption('encryption', form.Value, 'acct_secret', _('RADIUS Accounting Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client')); + /* extra RADIUS settings start */ + o = ss.taboption('encryption', form.ListValue, 'dynamic_vlan', _('RADIUS Dynamic VLAN Assignment'), _('Required: Rejects auth if RADIUS server does not provide appropriate VLAN attributes.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + o.value('0', _('Disabled')); + o.value('1', _('Optional')); + o.value('2', _('Required')); + o.write = function (section_id, value) { + return this.super('write', [section_id, (value == 0) ? null: value]); + } + + o = ss.taboption('encryption', form.Flag, 'per_sta_vif', _('RADIUS Per STA VLAN'), _('Each STA is assigned its own AP_VLAN interface.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + + //hostapd internally defaults to vlan_naming=1 even with dynamic VLAN off + o = ss.taboption('encryption', form.Flag, 'vlan_naming', _('RADIUS VLAN Naming'), _('Off: vlanXXX, e.g., vlan1. On: vlan_tagged_interface.XXX, e.g. eth0.1.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + + o = ss.taboption('encryption', widgets.DeviceSelect, 'vlan_tagged_interface', _('RADIUS VLAN Tagged Interface'), _('E.g. eth0, eth1')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + o.size = 1; + o.rmempty = true; + o.multiple = false; + o.noaliases = true; + o.nobridges = true; + o.nocreate = true; + o.noinactive = true; + + o = ss.taboption('encryption', form.Value, 'vlan_bridge', _('RADIUS VLAN Bridge Naming Scheme'), _('E.g. br-vlan or brvlan.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); + o.rmempty = true; + /* extra RADIUS settings end */ + + o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client'), _('Dynamic Authorization Extension client.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'dae_port', _('DAE-Port'), _('Default %d').format(3799)); + o = ss.taboption('encryption', form.Value, 'dae_port', _('DAE-Port'), _('Dynamic Authorization Extension port.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; + o.placeholder = '3799'; - o = ss.taboption('encryption', form.Value, 'dae_secret', _('DAE-Secret')); + o = ss.taboption('encryption', form.Value, 'dae_secret', _('DAE-Secret'), _('Dynamic Authorization Extension secret.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; + //WPA(1) has only WPA IE. Only >= WPA2 has RSN IE Preauth frames. + o = ss.taboption('encryption', form.Flag, 'rsn_preauth', _('RSN Preauth'), _('Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks (and advertise it in WLAN beacons). Only works if the specified network interface is a bridge. Shortens the time-critical reassociation process.')); + add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa2', 'wpa3', 'wpa3-mixed'] }); + o = ss.taboption('encryption', form.Value, '_wpa_key', _('Key')); o.depends('encryption', 'psk'); @@ -1500,66 +1547,117 @@ return view.extend({ // Probe 802.11r support (and EAP support as a proxy for Openwrt) var has_80211r = L.hasSystemFeature('hostapd', '11r') || L.hasSystemFeature('hostapd', 'eap'); - o = ss.taboption('encryption', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain')); + o = ss.taboption('roaming', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); if (has_80211r) add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.')); + o = ss.taboption('roaming', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.depends({ ieee80211r: '1' }); o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID')); + o = ss.taboption('roaming', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID')); o.depends({ ieee80211r: '1' }); o.placeholder = '4f57'; o.datatype = 'and(hexstring,length(4))'; o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]')); + o = ss.taboption('roaming', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]')); o.depends({ ieee80211r: '1' }); o.placeholder = '1000'; o.datatype = 'range(1000,65535)'; o.rmempty = true; - o = ss.taboption('encryption', form.ListValue, 'ft_over_ds', _('FT protocol')); + o = ss.taboption('roaming', form.ListValue, 'ft_over_ds', _('FT protocol')); o.depends({ ieee80211r: '1' }); - o.value('1', _('FT over DS')); o.value('0', _('FT over the Air')); + o.value('1', _('FT over DS')); o.rmempty = true; - o = ss.taboption('encryption', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.')); + o = ss.taboption('roaming', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.')); o.depends({ ieee80211r: '1' }); o.default = o.enabled; o.rmempty = false; - o = ss.taboption('encryption', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes')); + o = ss.taboption('roaming', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes')); o.depends({ ieee80211r: '1' }); o.placeholder = '10000'; o.datatype = 'uinteger'; o.rmempty = true; - o = ss.taboption('encryption', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons')); + o = ss.taboption('roaming', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons')); o.depends({ ieee80211r: '1' }); o.placeholder = '00004f577274'; o.datatype = 'and(hexstring,length(12))'; o.rmempty = true; - o = ss.taboption('encryption', form.Flag, 'pmk_r1_push', _('PMK R1 Push')); + o = ss.taboption('roaming', form.Flag, 'pmk_r1_push', _('PMK R1 Push')); o.depends({ ieee80211r: '1' }); o.placeholder = '0'; o.rmempty = true; - o = ss.taboption('encryption', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain.
Format: MAC-address,NAS-Identifier,128-bit key as hex string.
This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.')); + o = ss.taboption('roaming', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain.
Format: MAC-address,NAS-Identifier,128-bit key as hex string.
This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.')); o.depends({ ieee80211r: '1' }); o.rmempty = true; - o = ss.taboption('encryption', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain.
Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string.
This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.')); + o = ss.taboption('roaming', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain.
Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string.
This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.')); o.depends({ ieee80211r: '1' }); o.rmempty = true; // End of 802.11r options + // Probe 802.11k and 802.11v support via EAP support (full hostapd has EAP) + if (L.hasSystemFeature('hostapd', 'eap')) { + /* 802.11k settings start */ o = + ss.taboption('roaming', form.Flag, 'ieee80211k', _('802.11k RRM'), _('Radio Resource Measurement - Sends beacons to assist roaming. Not all clients support this.')); + // add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); + o.depends('mode', 'ap'); + o.depends('mode', 'ap-wds'); + + o = ss.taboption('roaming', form.Flag, 'rrm_neighbor_report', _('Neighbour Report'), _('802.11k: Enable neighbor report via radio measurements.')); + o.depends({ ieee80211k: '1' }); + o.default = o.enabled; + + o = ss.taboption('roaming', form.Flag, 'rrm_beacon_report', _('Beacon Report'), _('802.11k: Enable beacon report via radio measurements.')); + o.depends({ ieee80211k: '1' }); + o.default = o.enabled; + /* 802.11k settings end */ + + /* 802.11v settings start */ + o = ss.taboption('roaming', form.ListValue, 'time_advertisement', _('Time advertisement'), _('802.11v: Time Advertisement in management frames.')); + o.value('0', _('Disabled')); + o.value('2', _('Enabled')); + o.write = function (section_id, value) { + return this.super('write', [section_id, (value == 2) ? value: null]); + } + + //Pull current System TZ setting + var tz = uci.get('system', '@system[0]', 'timezone'); + o = ss.taboption('roaming', form.Value, 'time_zone', _('Time zone'), _('802.11v: Local Time Zone Advertisement in management frames.')); + o.value(tz); + o.rmempty = true; + + o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode', _('WNM Sleep Mode'), _('802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).')); + o.rmempty = true; + + /* wnm_sleep_mode_no_keys: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=bf98faaac8ed24cf7d3d93dd4fcd7304d109363b */ + o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode_no_keys', _('WNM Sleep Mode Fixes'), _('802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents reinstallation attacks.')); + o.rmempty = true; + + o = ss.taboption('roaming', form.Flag, 'bss_transition', _('BSS Transition'), _('802.11v: Basic Service Set (BSS) transition management.')); + o.rmempty = true; + + /* in master, but not 21.02.1: proxy_arp */ + o = ss.taboption('roaming', form.Flag, 'proxy_arp', _('ProxyARP'), _('802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer.')); + o.rmempty = true; + + /* TODO: na_mcast_to_ucast is missing: needs adding to hostapd.sh - nice to have */ + } + /* 802.11v settings end */ + } + + if (hwtype == 'mac80211') { o = ss.taboption('encryption', form.ListValue, 'eap_type', _('EAP-Method')); o.value('tls', 'TLS'); o.value('ttls', 'TTLS'); @@ -1676,7 +1774,7 @@ return view.extend({ if (hwtype == 'mac80211') { // ieee802.11w options o = ss.taboption('encryption', form.ListValue, 'ieee80211w', _('802.11w Management Frame Protection'), _("Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may have problems")); - o.value('', _('Disabled')); + o.value('0', _('Disabled')); o.value('1', _('Optional')); o.value('2', _('Required')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds', 'sta', 'sta-wds'], encryption: ['owe', 'psk2', 'psk-mixed', 'sae', 'sae-mixed', 'wpa2', 'wpa3', 'wpa3-mixed'] }); @@ -1684,7 +1782,14 @@ return view.extend({ o.defaults = { '2': [{ encryption: 'sae' }, { encryption: 'owe' }, { encryption: 'wpa3' }, { encryption: 'wpa3-mixed' }], '1': [{ encryption: 'sae-mixed'}], - '': [] + '0': [] + }; + + o.write = function(section_id, value) { + if (value != this.default) + return form.ListValue.prototype.write.call(this, section_id, value); + else + return form.ListValue.prototype.remove.call(this, section_id); }; o = ss.taboption('encryption', form.Value, 'ieee80211w_max_timeout', _('802.11w maximum timeout'), _('802.11w Association SA Query maximum timeout')); @@ -1956,6 +2061,8 @@ return view.extend({ }); }); }).then(L.bind(function() { + ui.showModal(null, E('p', { 'class': 'spinning' }, [ _('Loading data…') ])); + return this.renderMoreOptionsModal(section_id); }, this)); }; diff --git a/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json b/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json old mode 100755 new mode 100644 index 188c695f3..2fa3cf6ab --- a/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json +++ b/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json @@ -46,35 +46,9 @@ } }, - "admin/network/dhcp": { - "title": "DHCP and DNS", - "order": 30, - "action": { - "type": "view", - "path": "network/dhcp" - }, - "depends": { - "acl": [ "luci-mod-network-dhcp" ], - "uci": { "dhcp": true } - } - }, - - "admin/network/hosts": { - "title": "Hostnames", - "order": 40, - "action": { - "type": "view", - "path": "network/hosts" - }, - "depends": { - "acl": [ "luci-mod-network-dhcp" ], - "uci": { "dhcp": true } - } - }, - "admin/network/routes": { - "title": "Static Routes", - "order": 50, + "title": "Routing", + "order": 30, "action": { "type": "view", "path": "network/routes" @@ -84,9 +58,23 @@ } }, + "admin/network/dhcp": { + "title": "DHCP and DNS", + "order": 40, + "action": { + "type": "view", + "path": "network/dhcp" + }, + "depends": { + "acl": [ "luci-mod-network-dhcp" ], + "fs": { "/usr/sbin/dnsmasq": "executable" }, + "uci": { "dhcp": true } + } + }, + "admin/network/diagnostics": { "title": "Diagnostics", - "order": 60, + "order": 50, "action": { "type": "view", "path": "network/diagnostics" diff --git a/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json b/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json old mode 100755 new mode 100644 index 6943d9563..b377f395f --- a/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json +++ b/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json @@ -8,7 +8,9 @@ "/proc/sys/net/ipv6/conf/*/mtu": [ "read" ], "/proc/sys/net/ipv6/conf/*/hop_limit": [ "read" ], "/usr/libexec/luci-peeraddr": [ "exec" ], - "/usr/lib/opkg/info/netifd.control": [ "read" ] + "/usr/lib/opkg/info/netifd.control": [ "read" ], + "/proc/sys/net/ipv[46]/conf/*": [ "read" ], + "/sys/class/net/*/brport/*": [ "read" ] }, "ubus": { "file": [ "exec" ], @@ -58,7 +60,8 @@ "/usr/bin/ping": [ "exec" ], "/usr/bin/ping6": [ "exec", "list" ], "/usr/bin/traceroute": [ "exec" ], - "/usr/bin/traceroute6": [ "exec", "list" ] + "/usr/bin/traceroute6": [ "exec", "list" ], + "/usr/bin/arp-scan": [ "exec", "list" ] }, "ubus": { "file": [ "exec", "stat" ] diff --git a/luci-proto-mbim/Makefile b/luci-proto-mbim/Makefile old mode 100755 new mode 100644 diff --git a/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js b/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js old mode 100755 new mode 100644 index 72bb9f7ba..f6f548cc6 --- a/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js +++ b/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js @@ -51,7 +51,8 @@ return network.registerProtocol('mbim', { renderFormOptions: function(s) { var dev = this.getL3Device() || this.getDevice(), o; - o = s.taboption('general', form.Value, 'device', _('Modem device')); + o = s.taboption('general', form.Value, '_modem_device', _('Modem device')); + o.ucioption = 'device'; o.rmempty = false; o.load = function(section_id) { return callFileList('/dev/').then(L.bind(function(devices) { @@ -61,14 +62,22 @@ return network.registerProtocol('mbim', { }, this)); }; - s.taboption('general', form.Value, 'apn', _('APN')); - s.taboption('general', form.Value, 'pincode', _('PIN')); + o = s.taboption('general', form.Value, 'apn', _('APN')); + o.validate = function(section_id, value) { + if (!/^[a-zA-Z0-9\-.]*[a-zA-Z0-9]$/.test(value)) + return _('Invalid APN provided'); + + return true; + }; + + o = s.taboption('general', form.Value, 'pincode', _('PIN')); + o.datatype = 'and(uinteger,minlength(4),maxlength(8))'; o = s.taboption('general', form.ListValue, 'auth', _('Authentication Type')); - o.value('both', 'PAP/CHAP'); - o.value('pap', 'PAP'); - o.value('chap', 'CHAP'); - o.value('none', 'NONE'); + o.value('both', _('PAP/CHAP')); + o.value('pap', _('PAP')); + o.value('chap', _('CHAP')); + o.value('none', _('None')); o.default = 'none'; o = s.taboption('general', form.Value, 'username', _('PAP/CHAP username')); @@ -82,19 +91,62 @@ return network.registerProtocol('mbim', { o.depends('auth', 'both'); o.password = true; + o = s.taboption('general', form.ListValue, 'pdptype', _('PDP Type')); + o.value('ipv4v6', _('IPv4/IPv6')); + o.value('ipv4', _('IPv4')); + o.value('ipv6', _('IPv6')); + o.default = 'ipv4v6'; + if (L.hasSystemFeature('ipv6')) { - o = s.taboption('advanced', form.Flag, 'ipv6', _('Enable IPv6 negotiation')); - o.default = o.disabled; + o = s.taboption('advanced', form.Flag, 'mbim_ipv6', _('Enable IPv6 negotiation')); + o.ucioption = 'ipv6'; + o.default = o.enabled; + } + + o = s.taboption('advanced', form.ListValue, 'dhcp', _('Use DHCP')); + o.value('', _('Automatic')); + o.value('0', _('Disabled')); + o.value('1', _('Enabled')); + o.depends('pdptype', 'ipv4'); + o.depends('pdptype', 'ipv4v6'); + o.default = ''; + + if (L.hasSystemFeature('ipv6')) { + o = s.taboption('advanced', form.ListValue, 'dhcpv6', _('Use DHCPv6')); + o.value('', _('Automatic')); + o.value('0', _('Disabled')); + o.value('1', _('Enabled')); + o.depends('pdptype', 'ipv6'); + o.depends('pdptype', 'ipv4v6'); + o.default = ''; } o = s.taboption('advanced', form.Value, 'delay', _('Modem init timeout'), _('Maximum amount of seconds to wait for the modem to become ready')); o.placeholder = '10'; o.datatype = 'min(1)'; - o = s.taboption('general', form.ListValue, 'pdptype', _('PDP Type')); - o.value('ipv4v6', 'IPv4/IPv6'); - o.value('ipv4', 'IPv4'); - o.value('ipv6', 'IPv6'); - o.default = 'ipv4v6'; + o = s.taboption('advanced', form.Value, 'mtu', _('Override MTU')); + o.placeholder = dev ? (dev.getMTU() || '1500') : '1500'; + o.datatype = 'max(9200)'; + + o = s.taboption('advanced', form.Flag, 'defaultroute', + _('Use default gateway'), + _('If unchecked, no default route is configured')); + o.default = o.enabled; + + o = s.taboption('advanced', form.Value, 'metric', + _('Use gateway metric')); + o.placeholder = '0'; + o.datatype = 'uinteger'; + o.depends('defaultroute', '1'); + + o = s.taboption('advanced', form.Flag, 'peerdns', + _('Use DNS servers advertised by peer'), + _('If unchecked, the advertised DNS server addresses are ignored')); + o.default = o.enabled; + + o = s.taboption('advanced', form.DynamicList, 'dns', _('Use custom DNS servers')); + o.depends('peerdns', '0'); + o.datatype = 'ipaddr'; } }); diff --git a/luci-theme-ezengreen/Makefile b/luci-theme-ezengreen/Makefile deleted file mode 100755 index ee17e224f..000000000 --- a/luci-theme-ezengreen/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (C) 2008-2014 The LuCI Team -# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=ezengreen Theme (default) -LUCI_DEPENDS:= - -#include ../luci/luci.mk -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-ezengreen/htdocs/luci-static/ezengreen/1omr-logo-apple.png b/luci-theme-ezengreen/htdocs/luci-static/ezengreen/1omr-logo-apple.png deleted file mode 100755 index 7ee7779108d5a958e17f305962fef3f5715fbafd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8175 zcmXY02Q-||*JiC2H6#(yJJF&OU5H+yMD(y~^b)JHMDNS$B?XBDNtCtviYTirQC63Y z&a$FM|L^ZR-+Rt`-Z}H$nLBguedf+HlWbz7O>^tPEg~W!8eJVtQz9Z_AHr)(K}M+A zq&F8LBI1DSYO0%ul`SyFMppp9`(!nw61Po`>TKZ9{@2(R|^Y6k?7Uu zohg5}r-WC&o~b6%X_gE8Sl>$ssb3ek?n<`ZcxQn-XJ4gKI}LYV3LEWWIg{UA?KqtY z+ha?;8@Zxg{%>kc!dz*y*niZ<_($XC&w??>b$T3iLe2+@cph-;nWweL9lpWFZ$!XNMVYcSj0E3|Mg{!~v${JF1j(MpOHL#DxrP zzDVI8&tGfzgR&YsCV^Xz)qVJ(5o3JI(--Id@DT(G*dw2#$igWg)simYegSry*S}8f z{S8sv+mu#+>I(HRdqBBjF!<~#5dXJR4+Yej)s#d^l~um2aU!XN%Gan^Ky>(>=R7WY zyRRdTPP_e#ZqZLbi-M(vi#aZ-il4l15ji@2Iwv+m$qchl;`i%6gjmZlOnCi#qV$~Q z*p?laaxI2xuQgCqS#79YhrRpWo^|ZMhZ8js`lG=?ZLS?v##l_i}ocpG)4<20pU@9>GD-_~ryK~1|Mo)~TZ+V3e1!_Z&2s%Hd`b`D}q zjuzERzn>j;gOD}@AVzNa%97V|E}5iY*N)xQrm*}?F3>wD{7OA^i_1hfpv_Cp7~ypa zKl{7Qh!9^bS6 zB#dEP3nvWY?DXJJ9tQ)AZn*_~t<0D1_1Iz}KDXUl+xV&RjTUEbkNYm$@vn2Db61g* z^P9OV?iz#N-ck&d!~k5R`J6sjLI`7E|9Y*bNhCx*w@k*&xz>H7A|aa4V2xR zd)dP-Jr$qrvLNyygT(3lFU6%i;}4Z-oEbNN_VK^y$A9b#RHVdqG8Pu54IglQe7h){ z9dbu9rYof8e7K|r5Ir9489BIy>ADn5Wo0q`eY3D4`_BUxcR&{#47JxkTlPi$h=idd zNHK+{hLH1im6UJMnc{>PyEn~qT^^Ts+%W4)g8h;VT^Vi{1LFH zzaP$}E9dtwSSol#?u2Y~GK1Gz?6zz?qe{s#p)|Y7mtq*6G$Z#`N4WF!>=%;$y#w1N zd3lQfypVgeS@4@aJts`l$30cV)#;;^lV53F`Ci7jx3=ZAxlisr{21`16QhG6R*wk0QVH4#k~$5x-xIwUjXF$eAQWPkNh zOLiBZ2b3Egk1!8Va4Q__U27?}UeZ?JUPHU{$syzB+_rY7>Yif_7vI^70 zlRagf?t;_bsD4lPzN?vYbLRTL&z;8VRwriqt#}ftU?aP8;8@v=5Yg0MU*aBo{)$if zH4CaL>OW2YIas>()qih!|8bswv!V6Hxi_7=(Edd8h-LAVHd%{POjA35q<5Y0)zuP) zm03bD+njln=RvD{s9rb}^-dcF)aOtcrVz}1-yj9JDdHH`iu`6p_4hWyaU)^)KB>-@ zw7yIN1|d;)!VE=%!nE2f;E4x}^HpK#w z*Q&g$i722snsK*_GsO?(slX;;bS?u6tS6?C4Y(#NY}OVr>XUiLMn70Gq#NVBlzkg< zRS;H$BmepIuMrVszN4^Tss(bVWWtew2{K{eQ0uP)dX=zV7s~B77Znu_uX0 zWm<6qY$aRdV$^L!zhf2eUk0k2GD5Ls=xmvo4in%?r{qL}4)H<~m$f@GT*`YPnSC99 z9rU;SL>f=uQ!gf_rp@vP+YCI7ZQ=?sUhN&^G83G&KZhHO&Wu*J%ezH>Vqre@Yk1Co zh5j~kpo5{gR3u%RbZN>3y7ktr_zxf)igaYh>THVZlR-B$CMoG!oId!M-oMRyxmVcN z@j65*Ice{QKK!{MmzL@{5zxl#joyE(#0t4+Sxatc>Uw~-N92Ubn?S=;PrANj$h-~A zh+#`GMdh3)VN_|NH|($NnVuHB;|&+eF4^X-zPah5&P2(8Ym5b9GsV_X2hop$3cO~w zQ)5L$=We|2;k&-g*K4Csfkq3k2@ZWm&s}KXp2$K zi@9ZZ#t!kE9dqo-cT$uY+PO5TSC6Wa9N!}H_~f-q2t-+Dk#@}8`UfY2zzkVxaHr3ABR%4ny(IDDfaWg@sCT{z>2f=tH1P(+ zK|8U|OvOKS?&|T0pS2#hN;~t|_*`U36#F}O+W(fl;7>6#?TZxpGSyjtmiV)2xjHDF zF}z+<{@p+{=~b4$Y9Ubm$zM;5SMwFJ($vw(Z zm$z*?#k6%!xh4AIF+s$ZixYkhQbF zOiJ&KN*vorDe?C@FrJh0aoCOKuZsJl&=0JZYPyMkk+tJwEi&?e8Qh-J*ZHCZq_G}j zUf7o%Z=JPcdZ|&lj_gQU2y+Yb7j+3F&U#>WYW9f~C00c%b}XH*2d6wTh|V>Fihb8p zP-7~#Lvk_kw#~5q&8vj!^L=mFO%TG_qr8Q(VoTRboo+3`N?v=?EL2ZsI@p|a1B4!> z^AzhBa^LN(WAvb2sCJ&GDGoH~jPKyZk`fG8oqktX7KgcyFuS+|-%_?4TnBL8oA3>K`~hyWu`Pa*npYnXl97dZOq}o!I8`E;mha>K@X}%eugw?u~erzw-oj zTreLE(JZ+S%L4$ou2!we&OJ>bj!t%EAV6&DZuZ|*c7y=)bdwia!m*Ftc4$`#+L`hx zaDyEoF1goOyNrRqs~5?4 z7lXMgMV}4_>{D#^R9zW^#_FWYCrUlBm@t+jn1q|3V86e!ShZ;Ws`bNX{zyIY;;9>Q zv;-u6ybX4e5XqoBZvF7r(ucEdr(tFirk74q83q@)O#|F4p8^@4VSQ+JVJRSkvUMhn zX99CQt>yAwyRWorTEyH5I3X{Yz8h_4&L7q?g^+<02Y>gVYe&6g=ln5eHS91scRk%} zD{Yk2_W-O5`sa<7Xjx@tWPP-l?BR2RdoSigkC-??eM9^xkZL4=z#_iWo?;;zb`K#u zG(iG})RB5fu@!&I5|XIo^3#?UY6Q=&voey2A*C}!n*Vf(RSVOs-9hLN!&xj7(t*Nr zB&n`a89Vh^CtYHn&szd-Eoe~_@4lR1*TL9{O@#8c(B8aGMzZOmn8AFIc>?}H=s}QF zMjELX04&Ytws04O9_y~U%KQ*Rx$w+@>g%Y?e=(r#qJXE_$ToMLzj@ZAR;Z5^Q=a!} zC>$RtXpo$#3D2D&OtJBUGz$=aSrV8*Dbkk>^E-EN0OFAp3!}4*c?Ahf2p^qfedA>N%{nn4pdh9GQXfX7>E?2j;Ly9`@<#3@GA-3<1p6b5BYXnd% zh!~W)hJBD+Hy|fqI~6cGhu7CqLUH-I$yF*mDt;_WWpPHp5|~M`5bEbYAK{K#wy3wAuCg5FnTme^W*1{ylx>z+ z7x_;%0rB4XJ-H12$Xf)gP1{}2aP;r|(OR7KZ9TrN!zbpMR}EReb} zMKlonn1U=VyH912ct3D`I*X9^zEx#&0l;BSdAf7%bVmY}uiu#4`)+a_BiWn;tX`Rh z@%U#ngij|c_e(HogG~HCS#Lwy8ofB1sPoew`1E?+;7sSj4YVY6s(D3)TveSH@oyey z0tX3OR{}QWG)k`%CkRo>si;c=Lieqp`Dh;MJ()x}#swPm?aO3P$GyKv%|>JH2fFS_#!dTrFw3RpKyu+~h372E5^lj7nLI2`McsB~`mY#hCGkhL&VK2H z_0}o3hs&gS9xSEf7u&Tzd5ydVtte7P@^wH{8cP<2PO@=?ZcpN3vQ<+B|B zuJipBZ9u-G`83sUzNmDS_7P6~f&rFg5r}8&(`fY%{Fu(L|0ax45)n zMbKgRPfwjGOUgSEdui*yUAM{Jj1s_UUS5M+r%nt-hfEaLs8+SNi!6E#y~+RMFpy8R zxb3X~5I-Q8uLKs$)J>W{v&ugDe2{SB-5*@ zgAgKrH%IAZ4=!uSmb8qlN9nrH8%GOwRIW1(Ilw-UHYl9kXKL4rS6-UQkj?~Bp3 z)R**Vqq5>e4BHy~*mi{1#CWYdH0nGw$EI4-6Wf_R$CWUz^N6!J!L^O`b4Eg;(X&L`Kzy2LU25b5ptsG&wd`giL^ykV>luT8Zy3ct*t#n3%LF z8&7~J%zS*g2fz{oGF9d2$XPel)xyxc?dgDnZ0Xim5e;)Rq@4GUb?wlV(3Akm7@m63 z9COlKy@!K*M6{p8bIfl6f*5iE>GV-cce;Snd5FWzcdCGsCbP|vNv0^{W1m4^AzO-=ZXXo9 zJU7eVvV@hw*;||ns>RB$)pxa;twqCWGsIv_q*R%k)}|iLnU!DaJl{*L$GH-fT*ERj zqv>2(He#esl`)v}_15Q$wqhOLPA-LxFTk`;GJ4vgG2#6X)F#Cm|!ivv= zxy7+ix;}Br^PuDk_3EFrcKm7)z41e)YnhDaNGmK%+6WTJF->UOGN0s1tMZ~G(N%V(WeXd&~orTj?0pe*^mWoOmn+9eJJyGQi1qWuD= zJZujt~SoRDoO}pk8Z480Pce8|O zjM2V9DzkU9aJrLgVT0qa>CoGaBs_j?4KFX5Zw2X((Pjp#oz7ImnT~zjCEktkU-+iX zPRi-7t=YFbYLGxz?r}x>tY)-Cd6|wGY&%jNTMXp@elq3oz5MPrR(8PPmx){)eZR5m z$k;wDWUKT@Ln^yt^j8fPGX-@&#ln@B%b)$v{n5vQ;vsXS*YgXX@ zTIyY&OcTp=lBVVjjP1rSXCH^Jq+Uuf`YOHjukSh``g0t^946JW7*YB|oTOw7d^>m3Jivzo!}GEu%+V*sz_6Z`<$gkvt#EhtBReU2>}p z*)t?}R(4T^8nX&tv4wv{5(B`|^Nf%aa7#zY(Z4#wtvA{3NtFt`uVxQ7rjrND1!N0v zBb2%P=mJ0IALq2cyzo*A$(8F4M@7V#bkYc>OQ&XamH$&zv?jhH2!RH9(QD~`zYg2v zh|9}-|G~2*?aGxYVeKlG_oOUQaAj_SOhfpNfe+6`rv!WD#)Wc|Z-^xCP#y1W1vo{h zK{;FAX0i(Y51!V#+-Pl#XDPxyv+MZIr9WJWAPD84xKMI<^-|%g+KuoBj$+E~9)J4n%T6of41yp2?q4f)oY&r-C(x}P z>j6J=2Mhz!j&(^YA6Jx|y)U4C{V)>;dnk}Nl zCf0!Kvv|v3^?No~9)e^m+pB5YeZEvsx3p>~8qv+U^0MfpMX}!{A--K!Ln+gFKI1lG zg(CZPa|fUI?N1f2G_QFQ09dK> zy!GNm^JB({!oj`A;!0V2eDYtd9Xh31zKC(3uH|@#YhW`xVLBd;({mmh7n5*)p7N&a zNyL_$D5Ujj&1T{%N3SKN)0+TE|Ebx5-;{R74T9@m(#Bop28WBI(Us3Tv+3Gkxn1ns zO2Iv&u$c>};<$$<;6GqfPvFexSj|#|cnU8p+*qnvsBHPm=)}K!NTJg+Z zdErYE9dkDx$@W_lpfvVJ&%38p46+ z$3GewBL=0T*G{bYHeHuSb%m62?6(mUf6iwte^V@9+csK148;9#RF@+h@WJFjHw7O2v$CT zD6)+>@pZFs{W{4fupw)9zQZa*dakjPd?5liV&^^N59#@6Gk5(T>0<0=QMuhHrHwUW zB9!PG|D$>7SepDg%DKk`9ol~rsLB;AZRh}Cc8aC@ae1mP6bok|S%L4j4ijq6=D5W8pgxn~$|X-&UibS(KA>0~eJx7E_CV9IAg(t6?_O zDSQPXg0unY4iawC=fHWGgFoTAdFf=3HdcK~tU=CbkI}uNji59vJ)}*o&tT$fqw;qfnL;F z*rzs%F=iyEAkj>5VwSku2!Dfyiv#72a{2H1{rjSc>fP~{s!^9%$QzVq>$7e9J$rqYf(Qp z4vxdHqeBXQduv@h4GD}upEt6wxqr6THC - * Based on Bootstrap v1.4.0 - * - * Copyright 2011 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -/* Reset.less - * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). - * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ -html { - margin: 0; - padding: 0; -} - -body { - margin: 0; - padding: 5px; -} - -h1, h2, h3, h4, h5, h6, p, pre, a, abbr, acronym, code, del, em, img, ins, q, s, -small, strike, strong, sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset, -form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td, -.table, .tbody, .tfoot, .thead, .tr, .th, .td { - margin: 0; - padding: 0; - border: 0; - font-weight: normal; - font-style: normal; - font-size: 100%; - line-height: 1; - font-family: inherit; -} - -abbr[title], acronym[title] { - border-bottom: 1px dotted; - font-weight: inherit; - cursor: help; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -ol, ul { - list-style: none; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -html { - overflow-y: scroll; - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted; -} - -a:hover, a:active { - outline: 0; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; - -ms-interpolation-mode: bicubic; -} - -button, -input, -select, -option, -textarea { - font-size: 100%; - margin: 0; - box-sizing: border-box; - vertical-align: baseline; - *vertical-align: middle; -} - -button, input { - line-height: normal; - *overflow: visible; -} - -button::-moz-focus-inner, input::-moz-focus-inner { - border: 0; - padding: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -input[type="button"][disabled], -input[type="reset"][disabled], -input[type="submit"][disabled] { - opacity: 0.7; -} - -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; -} - -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -/* - * Scaffolding - * Basic and global styles for generating a grid system, structural layout, and page templates - * ------------------------------------------------------------------------------------------- */ -body { - background-color: #fff; - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-weight: normal; - line-height: 18px; - color: #404040; - padding-top: 75px; -} - -.container { - width: 100%; - max-width: 940px; - margin-left: auto; - margin-right: auto; - zoom: 1; -} - -.container:before, .container:after { - display: table; - content: ""; - zoom: 1; -} - -.container:after { - clear: both; -} - -a { - color: #215e21; - text-decoration: none; - line-height: inherit; - font-weight: inherit; -} - -a:hover { - color: #000000; - text-decoration: none; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -/* Typography.less - * Headings, body text, lists, code, and more for a versatile and durable typography system - * ---------------------------------------------------------------------------------------- */ -p, -.cbi-map-descr, -.cbi-section-descr, -.table .tr.cbi-section-table-descr .th { - font-size: 12px; - font-weight: normal; - line-height: 18px; - margin-bottom: 9px; -} - -p small { - font-size: 11px; - color: #bfbfbf; -} - -h1, -h2, -h3, legend, -h4, -h5, -h6 { - font-weight: normal; - color: #404040; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - color: #bfbfbf; -} - -h1 { - margin-bottom: 18px; - font-size: 30px; - line-height: 36px; -} - -h1 small { - font-size: 18px; -} - -h2 { - font-size: 24px; - line-height: 58px; - text-transform: uppercase; - font-weight: normal; -} - -h2 small { - font-size: 14px; -} - -h3, legend, -h4, -h5, -h6 { - line-height: 48px; -} - -h3, legend { - font-size: 18px; -} - -h3 small { - font-size: 14px; -} - -h4 { - font-size: 16px; -} - -h4 small { - font-size: 12px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 13px; - color: #bfbfbf; - text-transform: uppercase; -} - -ul, ol { - margin: 0 0 18px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li { - line-height: 18px; - color: #808080; -} - -ul.unstyled { - list-style: none; - margin-left: 0; -} - -dl { - margin-bottom: 18px; -} - -dl dt, dl dd { - line-height: 18px; -} - -dl dt { - font-weight: bold; -} - -dl dd { - margin-left: 9px; -} - -hr { - margin: 20px 0 19px; - border: 0; - border-bottom: 1px solid #eee; -} - -strong { - font-style: inherit; - font-weight: bold; -} - -em { - font-style: italic; - font-weight: inherit; - line-height: inherit; -} - -small { font-size: 0.9em } - -address { - display: block; - line-height: 18px; - margin-bottom: 18px; -} - -code, pre { - padding: 0 3px 2px; - font-family: Monaco, Andale Mono, Courier New, monospace; - font-size: 12px; - border-radius: 2px; -} - -code { - background-color: #fee9cc; - color: rgba(0, 0, 0, 0.75); - padding: 1px 3px; -} - -pre { - background-color: #f5f5f5; - display: block; - padding: 8.5px; - margin: 0 0 18px; - line-height: 18px; - font-size: 12px; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 2px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* Forms.less - * Base styles for various input types, form layouts, and states - * ------------------------------------------------------------- */ -form { - margin-bottom: 18px; -} - -fieldset { - margin-bottom: 9px; - padding-top: 9px; -} - -fieldset legend { - display: block; - font-size: 19.5px; - line-height: 1; - color: #404040; - padding-top: 20px; - *padding: 0 0 5px 0px; - /* IE6-7 */ - - *line-height: 1.5; - /* IE6-7 */ - -} -form .cbi-tab-descr { - line-height: 18px; - margin-bottom: 18px; -} - -form .clearfix, -form .cbi-value { - margin-bottom: 15px; - margin-top: 15px; - zoom: 1; -} - -form .clearfix:before, form .clearfix:after, -form .cbi-value:before, form .cbi-value:after { - display: table; - content: ""; - zoom: 1; -} - -form .clearfix:after, -form .cbi-value:after { - clear: both; -} - -label, -input, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-weight: normal; - line-height: normal; -} - -form .input, -form .cbi-value-field { - margin-left: 120px; -} - -form .cbi-value label.cbi-value-title { - padding-top: 6px; - font-size: 12px; - line-height: 18px; - float: left; - width: 111px; - text-align: left; - color: #404040; -} - -input[type=checkbox], input[type=radio] { - cursor: pointer; -} - -input, -textarea, -select, -.cbi-dropdown, -.uneditable-input { - display: inline-block; - width: 200px; - height: 30px; - padding: 4px; - font-size: 12px; - line-height: 18px; - color: #808080; - border: 1px solid #ccc; - border-radius: 2px; - box-sizing: border-box; - margin: 2px 0; -} - -.cbi-dropdown { - min-width: 210px; - max-width: 400px; - width: auto; -} - -select { - padding: initial; - background: #fff; - box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.1); -} - -input[type=checkbox], input[type=radio] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE6-7 */ - - line-height: normal; - border: none; -} - -input[type=file] { - background-color: #fff; - padding: initial; - border: initial; - line-height: initial; - box-shadow: none; - width: auto !important; -} - -input[type=button], input[type=reset], input[type=submit] { - width: auto; - height: auto; -} - -select, input[type=file] { - *height: auto; - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ -} - -select[multiple] { - height: inherit; - background-color: #fff; -} - -textarea { - height: auto; -} - -.td > input[type=text], -.td > input[type=password], -.td > select, -.td > .cbi-dropdown { - width: 100%; -} - -.uneditable-input { - background-color: #fff; - display: block; - border-color: #eee; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} - -::-moz-placeholder { - color: #bfbfbf; -} - -::-webkit-input-placeholder { - color: #bfbfbf; -} - -.btn, .cbi-button, input, textarea { - transition: border linear 0.2s, box-shadow linear 0.2s; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); - padding: 12px 6px; -} - -.btn:hover, .cbi-button:hover, -input:focus, textarea:focus { - outline: 0; - border-color: rgba(82, 168, 236, 0.8) !important; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); - text-decoration: none; -} - -input[type=file]:focus, input[type=checkbox]:focus, select:focus { - box-shadow: none; - outline: 1px dotted #666; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - background-color: #194119; - border-color: #ccc; - padding: 5px; - pointer-events: none; - cursor: default; -} - -select[readonly], -textarea[readonly] { - pointer-events: auto; - cursor: auto; -} - -.cbi-optionals, -.cbi-section-create { - padding: 0 0 10px 10px; -} - -.cbi-section-create { - margin: 10px 0 0 -10px; - display: inline-flex; - align-items: center; -} - -.cbi-section-create > * { - margin: 3px; - flex: 1 1 auto; -} - -.cbi-section-create > * > input { - width: 100%; -} - -.actions, -.cbi-page-actions { - background: #f5f5f5; - margin-bottom: 20px; - margin-top: 40px; - padding: 15px 20px 15px 20px; - border-radius: 0 0 2px 2px; - text-align: right; -} - -.actions .secondary-action, -.cbi-page-actions .secondary-action{ - float: right; -} - -.actions .secondary-action a, -.cbi-page-actions .secondary-action a { - line-height: 30px; -} - -.actions .secondary-action a:hover, -.cbi-page-actions .secondary-action a:hover { - text-decoration: none; -} - -.cbi-page-actions > form { - display: inline; - margin: 0; -} - -.help-inline, .help-block { - font-size: 12px; - line-height: 18px; - color: #bfbfbf; -} - -.help-inline { - padding-left: 5px; - *position: relative; - /* IE6-7 */ - - *top: -5px; - /* IE6-7 */ - -} - -.help-block { - display: block; - max-width: 600px; -} - -/* - * Tables.less - * Tables for, you guessed it, tabular data - * ---------------------------------------- */ -.tr { display: table-row; } -.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; } -.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; } - -.table { - display: table; - width: 100%; - margin: 12px 0 24px 0; - padding: 0; - font-size: 12px; - border-collapse: collapse; - position: relative; -} - -.table .th, .table .td { - display: table-cell; - vertical-align: middle; /* Fixme */ - padding: 6px 6px 6px 2px; - line-height: 18px; - text-align: left; -} - -.table .tr:first-child .th { - padding-top: 9px; - font-weight: normal; - vertical-align: top; -} - -.table .td, .table .th { - border-top: 1px solid #e7e7e7; -} - -.tr.placeholder { - height: calc(3em + 20px); -} - -.tr.placeholder > .td { - position: absolute; - left: 0; - right: 0; - bottom: 0; - text-align: center; - line-height: 3em; -} - -/* Patterns.less - * Repeatable UI elements outside the base styles provided from the scaffolding - * ---------------------------------------------------------------------------- */ -header { - height: 40px; - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 10000; - overflow: visible; - color: #BFBFBF; -} - -header a { - color: #c4c4c4; -} - -header h3 a:hover, header .brand:hover, header ul .active > a { - background-color: #333; - background-color: rgba(0, 0, 0, 0.33); - color: #fff; - text-decoration: none; -} - -header h3 { - position: relative; -} - -header h3 a, header .brand { - float: left; - display: block; - padding: 16px 20px 16px; - margin-left: -20px; - color: #fff; - font-size: 24px; - font-weight: 333; - line-height: 1; -} - -header p { - margin: 0; - line-height: 40px; -} - -header .fill { - background-color: #215e21; - background-repeat: repeat-x; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.33), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - padding: 0 5px; -} - -header div > ul, .nav { - display: block; - float: left; - margin: 0 10px 0 20px; - position: relative; - left: 0; -} - -header div > ul > li, .nav > li { - display: block; - float: left; -} - -header div > ul a, .nav a { - display: block; - float: none; - padding: 22px 12px 14px 12px; - line-height: 19px; - letter-spacing: 0.4px; - text-decoration: none; - text-transform: uppercase; -} - -header div > ul a:hover, .nav a:hover { - color: #fff; - text-decoration: none; -} - -header div > ul .active > a, .nav .active > a { - background-color: #222; - background-color: rgba(0, 0, 0, 0.33); -} - -header div > ul.secondary-nav, .nav.secondary-nav { - float: right; - margin-left: 10px; - margin-right: 0; -} - -header div > ul.secondary-nav .menu-dropdown, -.nav.secondary-nav .menu-dropdown, -header div > ul.secondary-nav .dropdown-menu, -.nav.secondary-nav .dropdown-menu { - right: 0; - border: 0; -} - -header div > ul a.menu:hover, -.nav a.menu:hover, -header div > ul li.open .menu, -.nav li.open .menu, -header div > ul .dropdown-toggle:hover, -.nav .dropdown-toggle:hover, -header div > ul .dropdown.open .dropdown-toggle, -.nav .dropdown.open .dropdown-toggle { - background: #444; - background: rgba(0, 0, 0, 0.3); -} - -header div > ul .menu-dropdown, -.nav .menu-dropdown, -header div > ul .dropdown-menu, -.nav .dropdown-menu { - background-color: #003300; -} - -header div > ul .menu-dropdown a.menu, -.nav .menu-dropdown a.menu, -header div > ul .dropdown-menu a.menu, -.nav .dropdown-menu a.menu, -header div > ul .menu-dropdown .dropdown-toggle, -.nav .menu-dropdown .dropdown-toggle, -header div > ul .dropdown-menu .dropdown-toggle, -.nav .dropdown-menu .dropdown-toggle { - color: #fff; -} - -header div > ul .menu-dropdown a.menu.open, -.nav .menu-dropdown a.menu.open, -header div > ul .dropdown-menu a.menu.open, -.nav .dropdown-menu a.menu.open, -header div > ul .menu-dropdown .dropdown-toggle.open, -.nav .menu-dropdown .dropdown-toggle.open, -header div > ul .dropdown-menu .dropdown-toggle.open, -.nav .dropdown-menu .dropdown-toggle.open { - background: #444; - background: rgba(255, 255, 255, 0.05); -} - -header div > ul .menu-dropdown li a, -.nav .menu-dropdown li a, -header div > ul .dropdown-menu li a, -.nav .dropdown-menu li a { - color: #bfbfbf; -} - -header div > ul .menu-dropdown li a:hover, -.nav .menu-dropdown li a:hover, -header div > ul .dropdown-menu li a:hover, -.nav .dropdown-menu li a:hover { - background-color: #215e21; - background-repeat: repeat-x; - color: #fff; -} - -header div > ul .menu-dropdown .active a, -.nav .menu-dropdown .active a, -header div > ul .dropdown-menu .active a, -.nav .dropdown-menu .active a { - color: #fff; -} - -header div > ul .menu-dropdown .divider, -.nav .menu-dropdown .divider, -header div > ul .dropdown-menu .divider, -.nav .dropdown-menu .divider { - background-color: #222; - border-color: #444; -} - -header ul .menu-dropdown li a, header ul .dropdown-menu li a { - padding: 6px 12px; -} - -li.menu, .dropdown { - position: relative; -} - -.menu-dropdown, .dropdown-menu { - background-color: #fff; - float: left; - position: absolute; - top: 55px; - left: -9999px; - z-index: 900; - min-width: 200px; - max-width: 300px; - _width: 160px; - margin-left: 0; - margin-right: 0; - padding: 6px 0; - zoom: 1; - border-radius: 0 0 2px 2px; - background-clip: padding-box; -} - -.menu-dropdown li, .dropdown-menu li { - float: none; - display: block; - background-color: transparent; -} - -.menu-dropdown .divider, .dropdown-menu .divider { - height: 1px; - margin: 5px 0; - overflow: hidden; - background-color: #eee; - border-bottom: 1px solid #fff; -} - -header .dropdown-menu a, .dropdown-menu a { - display: block; - padding: 4px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - text-transform: capitalize; - letter-spacing: 0.2px; - color: #808080; - zoom: 1.1; -} - -header .dropdown-menu a:hover, -.dropdown-menu a:hover, -header .dropdown-menu a.hover, -.dropdown-menu a.hover { - background-color: #ddd; - background-repeat: repeat-x; - color: #404040; - text-decoration: none; - box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); -} - -.open .menu, -.dropdown.open .menu, -.open .dropdown-toggle, -.dropdown.open .dropdown-toggle { - color: #fff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); -} - -.open .menu-dropdown, -.dropdown.open .menu-dropdown, -.open .dropdown-menu, -.dropdown.open .dropdown-menu { - left: 0; -} - -.dropdown:hover ul.dropdown-menu { - left: 0; -} - -.dropdown-menu .dropdown-menu { - position: absolute; - left: 159px; -} - -.dropdown-menu li { - position: relative; -} - -.tabs, .cbi-tabmenu { - margin: 0 0 18px; - padding: 0; - list-style: none; - zoom: 1; -} - -.tabs:before, -.cbi-tabmenu:before, -.tabs:after, -.cbi-tabmenu:after { - display: table; - content: ""; - zoom: 1; -} - -.tabs:after, .cbi-tabmenu:after { - clear: both; -} - -.tabs > li, .cbi-tabmenu > li { - float: left; -} - -.tabs > li > a, .cbi-tabmenu > li > a { - display: block; -} - -.tabs, -.cbi-tabmenu { - border-color: #ddd; - border-style: solid; - border-width: 0 0 1px; -} - -.tabs > li, -.cbi-tabmenu > li { - position: relative; - margin-bottom: -1px; -} - -.cbi-tabmenu.map { - margin: 0; -} - -.cbi-tabmenu.map > li { - font-size: 16.5px; - font-weight: bold; -} - -.cbi-tabcontainer > fieldset.cbi-section[id] > legend { - display: none; -} - -.tabs > li > a, -.cbi-tabmenu > li > a { - padding: 0 15px; - margin-right: 2px; - line-height: 34px; - border: 1px solid transparent; - border-radius: 2px 2px 0 0; -} - -.tabs > li > a:hover, -.cbi-tabmenu > li > a:hover { - text-decoration: none; - background-color: #eee; - border-color: #eee #eee #ddd; -} - -.tabs .active > a, .tabs .active > a:hover, -.cbi-tabmenu .active > a, .cbi-tabmenu .active > a:hover, -.cbi-tab > a:link, .cbi-tab > a:hover { - color: #000000; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} - -.tabs .menu-dropdown, .tabs .dropdown-menu, -.cbi-tabmenu .menu-dropdown, .cbi-tabmenu .dropdown-menu { - top: 35px; - border-width: 1px; - border-radius: 0 2px 2px 2px; -} - -.tabs a.menu:after, .tabs .dropdown-toggle:after, -.cbi-tabmenu a.menu:after, .cbi-tabmenu .dropdown-toggle:after { - border-top-color: #999; - margin-top: 15px; - margin-left: 5px; -} - -.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle, -.cbi-tabmenu li.open.menu .menu, .cbi-tabmenu .open.dropdown .dropdown-toggle { - border-color: #999; -} - -.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after, -.cbi-tabmenu li.open a.menu:after, .cbi-tabmenu .dropdown.open .dropdown-toggle:after { - border-top-color: #555; -} - -.tab-content > .tab-pane, -.tab-content > div { - display: none; -} - -.tab-content > .active { - display: block; -} - -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background-color: #f5f5f5; - background-repeat: repeat-x; - border: 1px solid #ddd; - border-radius: 2px; - box-shadow: inset 0 1px 0 #fff; -} - -.breadcrumb li { - display: inline; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #bfbfbf; -} - -.breadcrumb .active a { - color: #404040; -} - -footer { - margin-top: 30px; - padding-top: 20px; - padding-bottom: 20px; - border-top: 1px solid #404040; -} - -.btn.danger, -.alert-message.danger, -.btn.danger:hover, -.alert-message.danger:hover, -.btn.error, -.alert-message.error, -.btn.error:hover, -.alert-message.error:hover, -.btn.success, -.alert-message.success, -.btn.success:hover, -.alert-message.success:hover, -.btn.info, -.alert-message.info, -.btn.info:hover, -.alert-message.info:hover { - color: #fff; -} - -.btn .close, .alert-message .close { - font-family: Arial, sans-serif; - line-height: 18px; -} - -.btn.danger, -.alert-message.danger, -.btn.error, -.alert-message.error { - background: linear-gradient(to bottom, #ee5f5b, #c43c35) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn.success, .alert-message.success { - background: linear-gradient(to bottom, #62c462, #57a957) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn.info, .alert-message.info { - background: linear-gradient(to bottom, #5bc0de, #339bb9) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.alert-message.notice { - background: linear-gradient(to bottom, #efefef, #fefefe) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn, -.cbi-button { - cursor: pointer; - display: inline-block; - background: linear-gradient(#fff, #fff 25%, #e6e6e6) no-repeat; - padding: 5px 14px 6px; - color: #333; - font-size: 12px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:focus, -.cbi-button:focus { - outline: 1px dotted #666; -} - -.cbi-input-invalid, -.cbi-value-error input { - color: #f00; - border-color: #f00; -} - -.cbi-button-positive, -.cbi-button-fieldadd, -.cbi-button-add, -.cbi-button-save { - border-color: #4a4; - color: #4a4; -} - -.cbi-button-neutral, -.cbi-button-download, -.cbi-button-find, -.cbi-button-link, -.cbi-button-up, -.cbi-button-down { - color: #444; -} - -.btn.primary, -.cbi-button-action, -.cbi-button-apply, -.cbi-button-reload, -.cbi-button-edit { - border-color: #4aa44b; - color: #4aa44b; -} - -.cbi-button-negative, -.cbi-section-remove .cbi-button, -.cbi-button-reset, -.cbi-button-remove { - border-color: #c44; - color: #c44; -} - -.cbi-page-actions::after { - display: table; - content: ""; - clear: both; -} - -.cbi-page-actions > :not([method="post"]):not(.cbi-button-apply):not(.cbi-button-save):not(.cbi-button-reset) { - float: left; - margin-right: .4em; -} - -.btn.primary, -.cbi-button-action.important, -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit { - color: #fff; - background: #4aa44b; -} - -.cbi-button-positive.important, -.cbi-page-actions .cbi-button-save { - color: #fff; - background: linear-gradient(to bottom, #4a4, #484) no-repeat; -} - -.cbi-button-negative.important { - color: #fff; - background: linear-gradient(to bottom, #c44, #c00) no-repeat; -} - -.cbi-page-actions .cbi-button-apply + .cbi-button-save { - background: linear-gradient(#fff, #fff 25%, #e6e6e6); - color: #4a4; -} - -.cbi-dropdown { - border: 1px solid #ccc; - border-radius: 2px; - display: inline-flex; - padding: 0; - cursor: pointer; - height: auto; - background: linear-gradient(#fff 0%, #e9e8e6 100%); - position: relative; - color: #404040; -} - -.cbi-dropdown:focus { - outline: 2px solid #4b6e9b; -} - -.cbi-dropdown > ul { - margin: 0 !important; - padding: 0; - list-style: none; - overflow-x: hidden; - overflow-y: auto; - display: flex; - width: 100%; -} - -.cbi-dropdown > ul.preview { - display: none; -} - -.cbi-dropdown > .open, -.cbi-dropdown > .more { - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - line-height: 2em; - padding: 0 .25em; -} - -.cbi-dropdown > .more, -.cbi-dropdown > ul > li[placeholder] { - color: #777; - font-weight: bold; - display: none; -} - -.cbi-dropdown > ul > li { - display: none; - padding: .25em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 1; - flex-grow: 1; - align-items: center; - align-self: center; - color: #404040; - min-height: 20px; -} - -.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } -.cbi-dropdown > ul > li .hide-close { display: none; } - -.cbi-dropdown > ul > li[display]:not([display="0"]) { - border-left: 1px solid #ccc; -} - -.cbi-dropdown[empty] > ul { - max-width: 1px; -} - -.cbi-dropdown > ul > li > form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown > ul > li img { - vertical-align: middle; - margin-right: .25em; -} - -.cbi-dropdown > ul > li > form > input[type="checkbox"] { - margin: 0; -} - -.cbi-dropdown > ul > li input[type="text"] { - height: 20px; -} - -.cbi-dropdown[open] { - position: relative; -} - -.cbi-dropdown[open] > ul.dropdown { - display: block; - background: #f6f6f5; - border: 1px solid #918e8c; - box-shadow: 0 0 4px #918e8c; - position: absolute; - z-index: 1000; - max-width: none; - min-width: 100%; - width: auto; -} - -.cbi-dropdown > ul > li[display], -.cbi-dropdown[open] > ul.preview, -.cbi-dropdown[open] > ul.dropdown > li, -.cbi-dropdown[multiple] > ul > li > label, -.cbi-dropdown[multiple][open] > ul.dropdown > li, -.cbi-dropdown[multiple][more] > .more, -.cbi-dropdown[multiple][empty] > .more { - flex-grow: 1; - display: flex; -} - -.cbi-dropdown[empty] > ul > li, -.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], -.cbi-dropdown[multiple][open] > ul.dropdown > li > form { - display: block; -} - -.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } -.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } - -.cbi-dropdown[open] > ul.dropdown > li { - border-bottom: 1px solid #ccc; -} - -.cbi-dropdown[open] > ul.dropdown > li[selected] { - background: #b0d0f0; -} - -.cbi-dropdown[open] > ul.dropdown > li.focus { - background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); -} - -.cbi-dropdown[open] > ul.dropdown > li:last-child { - margin-bottom: 0; - border-bottom: none; -} - -.cbi-dropdown[disabled] { - pointer-events: none; - opacity: .6; -} - -input[type="text"] + .cbi-button, -input[type="password"] + .cbi-button, -select + .cbi-button { - border-radius: 2px; - border-color: #ccc; - margin: 2px 0 2px 3px; - padding: 0 12px; - vertical-align: top; - height: 28px; - font-size: 13px; - font-weight: normal; - line-height: 28px; -} - -select + .cbi-button { - #border-left-color: transparent; -} - -.cbi-title-ref { - color: #f39800; -} - -.cbi-title-ref::after { - content: " ➙ "; -} - -.cbi-tooltip-container { - cursor: help; - padding: 5px 3px 5px 3px; -} - -.cbi-tooltip { - position: absolute; - z-index: 1000; - left: -1000px; - opacity: 0; - transition: opacity .25s ease-out; -} - -.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { - left: auto; - opacity: 1; - transition: opacity .25s ease-in; -} - -.zonebadge .cbi-tooltip { - padding: 1px; - background: inherit; - margin: -1.6em 0 0 -5px; - border-radius: 2px; - pointer-events: none; - box-shadow: 0 0 3px #444; -} - -.zonebadge .cbi-tooltip > * { - margin: 1px; -} - -.zone-forwards { - display: flex; - flex-wrap: wrap; -} - -.zone-forwards > * { - flex: 1 1 40%; - padding: 1px; -} - -.zone-forwards > span { - flex-basis: 10%; - text-align: center; -} - -.zone-forwards .zone-src, -.zone-forwards .zone-dest { - display: flex; - flex-direction: column; -} - -.btn.active, .btn:active { - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled { - cursor: default; - background-image: none; - opacity: 0.65; - box-shadow: none; -} - -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - box-shadow: none; -} - -.btn.large { - font-size: 15px; - line-height: normal; - padding: 9px 14px 9px; - border-radius: 2px; -} - -.btn.small { - padding: 7px 9px 7px; - font-size: 11px; -} - -button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -.close { - float: right; - color: #000; - font-size: 20px; - font-weight: bold; - line-height: 13.5px; - opacity: 0.25; -} - -.close:hover { - color: #000; - text-decoration: none; - opacity: 0.4; -} - -.alert-message { - position: relative; - padding: 30px; - margin-top: 25px; - margin-bottom: 25px; - color: #404040; - background: #f0e68c; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-width: 1px; - border-style: solid; - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.alert-message .close { - margin-top: 1px; - *margin-top: 0; -} - -.alert-message a { - font-weight: bold; - color: #404040; -} - -.alert-message.danger p a, -.alert-message.error p a, -.alert-message.success p a, -.alert-message.info p a { - color: #fff; -} - -.alert-message h5 { - line-height: 18px; -} - -.alert-message p { - margin-bottom: 0; -} - -.alert-message div { - margin-top: 15px; - margin-bottom: 10px; - line-height: 28px; -} - -.label { - padding: 3px 3px 3px 3px; - font-size: 8px; - font-weight: normal; - color: #fff !important; - text-transform: uppercase; - white-space: nowrap; - background-color: #bfbfbf; - border-radius: 2px; - text-shadow: none; -} - -a.label:link, -a.label:visited { - color: #fff; -} - -a.label:hover { - text-decoration: none; -} - -.label.important { - background-color: #c43c35; -} - -.label.warning { - background-color: #f89406; -} - -.label.success { - background-color: #46a546; -} - -.label.notice { - background-color: #62cffc; -} - -/* LuCI specific items */ -.hidden { display: none } - -#memtotal > div, -#memfree > div, -#memcache > div, -#membuff > div, -#conns > div { - border: 1px solid #ccc; - border-radius: 2px 2px 2px 2px; - color: #808080; - display: inline-block; - font-size: 12px; - line-height: 18px; -} - -#xhr_poll_status { - cursor: pointer; -} - -form.inline { display: inline; margin-bottom: 0; } - -header .pull-right { padding-top: 21px; } - -#modemenu li:last-child span.divider { display: none } - -#syslog { width: 100%; } - -.cbi-section-table .tr:hover .td, -.cbi-section-table .tr:hover .th, -.cbi-section-table .tr:hover::before { - background-color: #f5f5f5; -} - -.cbi-section-table .tr.cbi-section-table-descr .th { - font-weight: normal; -} - -.cbi-section-table-titles.named::before, -.cbi-section-table-descr.named::before, -.cbi-section-table-row[data-title]::before { - content: attr(data-title) " "; - display: table-cell; - padding: 10px 10px 9px; - line-height: 18px; - font-weight: bold; - vertical-align: middle; -} - -.cbi-section-table-titles.named::before, -.cbi-section-table-descr.named::before, -.cbi-section-table-row[data-title]::before { - border-top: 1px solid #ddd; -} - -.left { text-align: left !important; } -.right { text-align: right !important; } -.center { text-align: center !important; } -.top { vertical-align: top !important; } -.middle { vertical-align: middle !important; } -.bottom { vertical-align: bottom !important; } - -.cbi-value-field { line-height: 1.5em; } - -.cbi-value-field input[type=checkbox], -.cbi-value-field input[type=radio] { - margin-top: 8px; - margin-right: 6px; -} - -table table td, -.cbi-value-field table td { - border: none; -} - -.table.cbi-section-table input[type="password"], -.table.cbi-section-table input[type="text"], -.table.cbi-section-table textarea, -.table.cbi-section-table select { - width: 100%; -} - -.table.cbi-section-table .td.cbi-section-table-cell { - white-space: nowrap; - text-align: right; -} - -.table.cbi-section-table .td.cbi-section-table-cell select { - width: inherit; -} - -.td.cbi-section-actions { - text-align: right; - vertical-align: middle; -} - -.td.cbi-section-actions > * { - display: flex; -} - -.td.cbi-section-actions > * > *, -.td.cbi-section-actions > * > form > * { - flex: 1 1 4em; - margin: 0 1px; -} - -.td.cbi-section-actions > * > form { - display: inline-flex; - margin: 0; -} - -.table.valign-middle .td { - vertical-align: middle; -} - -.cbi-rowstyle-2, -.tr.table-titles, -.tr.cbi-section-table-titles { - background: #f9f9f9; -} - -.cbi-value-description { - background-image: url(/luci-static/resources/cbi/help.gif); - background-position: .25em .2em; - background-repeat: no-repeat; - margin: 10px 0 10px -5px; - padding: 0 0 0 26px; -} - -.cbi-section-error { - border: 1px solid #f00; - border-radius: 2px; - background-color: #fce6e6; - padding: 5px; - margin-bottom: 18px; -} - -.cbi-section-error ul { margin: 0 0 0 20px; } - -.cbi-section-error ul li { - color: #f00; - font-weight: bold; -} - -.ifacebox { - background-color: #fff; - border: 1px solid #ccc; - margin: 6px 4px; - text-align: center; - white-space: nowrap; - background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - display: inline-flex; - flex-direction: column; - line-height: 1.2em; - min-width: 100px; -} - -.ifacebox .ifacebox-head { - border-bottom: 1px solid #ccc; - padding: 10px; - line-height: 1.2em; - background: #eee; -} - -.ifacebox .ifacebox-head.active { - background: #f0e68c; -} - -.ifacebox .ifacebox-body { - padding: .25em; -} - -.ifacebadge { - display: inline-block; - flex-direction: row; - white-space: nowrap; - background-color: #fff; - border: 1px solid #ccc; - padding: 5px 5px 3px 5px; - background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - cursor: default; - line-height: 1.2em; -} - -.ifacebadge img { - width: 16px; - height: 16px; - vertical-align: middle; -} - -.ifacebadge-active { - border-color: #000; - font-weight: bold; -} - -.network-status-table { - display: flex; - flex-wrap: wrap; -} - -.network-status-table .ifacebox { - margin: 10px 10px 15px 2px; - flex-grow: 1; -} - -.network-status-table .ifacebox-body { - display: flex; - flex-direction: column; - height: 100%; - text-align: left; - padding: 8px; -} - -.network-status-table .ifacebox-body > * { - margin: .25em; -} - -.network-status-table .ifacebox-body > span { - flex: 10 10 auto; - height: 100%; -} - -.network-status-table .ifacebox-body > div { - display: flex; - flex-wrap: wrap; - margin: -.125em; -} - -#dsl_status_table .ifacebox-body > span > strong { - display: inline-block; - min-width: 35%; -} - -.ifacebadge.large, -.network-status-table .ifacebox-body .ifacebadge { - display: inline-flex; - flex: 1; - padding: 10px 4px 10px 4px; - min-width: 220px; - margin: 10px 6px 4px 4px; -} - -.ifacebadge > *, -.ifacebadge.large > * { - margin: 0 .125em; -} - -.zonebadge { - padding: 2px; - border-radius: 2px; - display: inline-block; - white-space: nowrap; - color: #666; -} - -.zonebadge > em, -.zonebadge > strong { - margin: 0 2px; - display: inline-block; -} - -.zonebadge input { - width: 6em; -} - -.zonebadge > .ifacebadge { - margin-left: 2px; -} - -.zonebadge-empty { - border: 1px dashed #aaa; - color: #aaa; - font-style: italic; - font-size: smaller; -} - -div.cbi-value var, -.td.cbi-value-field var { - font-style: italic; - color: #215e21; -} - -.uci-change-list { - line-height: 170%; - white-space: pre; -} - -.uci-change-list del, -.uci-change-list ins, -.uci-change-list var, -.uci-change-legend-label del, -.uci-change-legend-label ins, -.uci-change-legend-label var { - text-decoration: none; - font-family: monospace; - font-style: normal; - border: 1px solid #ccc; - background: #eee; - padding: 2px; - display: block; - line-height: 15px; - margin-bottom: 1px; -} - -.uci-change-list ins, -.uci-change-legend-label ins { - border-color: #0f0; - background: #cfc; -} - -.uci-change-list del, -.uci-change-legend-label del { - border-color: #f00; - background: #fcc; -} - -.uci-change-list var, -.uci-change-legend-label var { - border-color: #ccc; - background: #eee; -} - -.uci-change-list var ins, -.uci-change-list var del { - display: inline-block; - border: none; - width: 100%; - padding: 0; -} - -.uci-change-legend { - padding: 5px; -} - -.uci-change-legend-label { - width: 150px; - float: left; -} - -.uci-change-legend-label > ins, -.uci-change-legend-label > del, -.uci-change-legend-label > var { - float: left; - margin-right: 4px; - width: 10px; - height: 10px; - display: block; - position: relative; -} - -.uci-change-legend-label var ins, -.uci-change-legend-label var del { - border: none; - position: absolute; - top: 2px; - left: 2px; - right: 2px; - bottom: 2px; -} - -html body.apply-overlay-active { - height: calc(100vh - 63px); -} - -#applyreboot-section { - line-height: 300%; -} - -.login{ - text-align: center; - background-color: #fff; - border-radius: 20px; - width: 300px; - height: 350px; - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%,-50%); -} diff --git a/luci-theme-ezengreen/htdocs/luci-static/ezengreen/favicon.png b/luci-theme-ezengreen/htdocs/luci-static/ezengreen/favicon.png deleted file mode 100755 index 7ee7779108d5a958e17f305962fef3f5715fbafd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8175 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.createElement("font"),c.setAttribute("data-html5shiv",a.nodeName.toLowerCase())):c=b.createElement("shiv:"+a.nodeName);while(a.firstChild)c.appendChild(a.childNodes[0]);for(d=a.attributes,e=d.length,f=0;f7?e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,'$1font[data-html5shiv="$2"]'):e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,"$1shiv\\:$2"),e[g]=e[g].join("}");return e.join("{")}var c=function(a){return a.innerHTML="",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e;if(c||!a.attachEvent)return;a.attachEvent("onbeforeprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;b.namespaces.shiv||b.namespaces.add("shiv");var c=-1,d=new RegExp("^("+a.html5.elements.join("|")+")$","i"),e=b.getElementsByTagName("*"),g=e.length,j,k=i(h(function(a,b){var c=[],d=a.length;while(d)c.unshift(a[--d]);d=b.length;while(d)c.unshift(b[--d]);c.sort(function(a,b){return a.sourceIndex-b.sourceIndex}),d=c.length;while(d)c[--d]=c[d].styleSheet;return c}(b.getElementsByTagName("style"),b.getElementsByTagName("link"))));while(++c ul, .nav { - display: block; - float: left; - margin: 7px 8px 0 8px; - position: relative; - left: 0; -} - -header div > ul a, .nav a { - display: block; - float: left; - padding: 12px 6px 12px 6px; - line-height: 14px; - letter-spacing: 0.2px; -} - -.menu-dropdown, .dropdown-menu { - top: 38px; - min-width: 180px; - max-width: 260px; -} - -@media screen and (max-device-width: 660px) { - #maincontent.container { - width: 98%; - margin: 30px 0 0 6px; - } -} - -@media screen and (max-device-width: 360px) { - #maincontent.container { - width: 96%; - margin: 30px 0 0 6px; - } -} - -@media screen and (max-device-width: 200px) { - #maincontent.container { - width: 94%; - margin: 40px 0 0 2px; - } -} diff --git a/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/cascade.css b/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/cascade.css deleted file mode 100755 index 740adc320..000000000 --- a/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/cascade.css +++ /dev/null @@ -1,2027 +0,0 @@ -/*! - * LuCI Bootstrap Theme - * Copyright 2012 Nut & Bolt - * By David Menting - * Based on Bootstrap v1.4.0 - * - * Copyright 2011 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -/* Reset.less - * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). - * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ -html { - margin: 0; - padding: 0; -} - -body { - margin: 0; - padding: 5px; -} - -h1, h2, h3, h4, h5, h6, p, pre, a, abbr, acronym, code, del, em, img, ins, q, s, -small, strike, strong, sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset, -form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td, -.table, .tbody, .tfoot, .thead, .tr, .th, .td { - margin: 0; - padding: 0; - border: 0; - font-weight: normal; - font-style: normal; - font-size: 100%; - line-height: 1; - font-family: inherit; -} - -abbr[title], acronym[title] { - border-bottom: 1px dotted; - font-weight: inherit; - cursor: help; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -ol, ul { - list-style: none; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -html { - overflow-y: scroll; - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted; -} - -a:hover, a:active { - outline: 0; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; - -ms-interpolation-mode: bicubic; -} - -button, -input, -select, -option, -textarea { - font-size: 100%; - margin: 0; - box-sizing: border-box; - vertical-align: baseline; - *vertical-align: middle; -} - -button, input { - line-height: normal; - *overflow: visible; -} - -button::-moz-focus-inner, input::-moz-focus-inner { - border: 0; - padding: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -input[type="button"][disabled], -input[type="reset"][disabled], -input[type="submit"][disabled] { - opacity: 0.7; -} - -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; -} - -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -/* - * Scaffolding - * Basic and global styles for generating a grid system, structural layout, and page templates - * ------------------------------------------------------------------------------------------- */ -body { - background-color: #fff; - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-weight: normal; - line-height: 18px; - color: #404040; - padding-top: 75px; -} - -.container { - width: 100%; - max-width: 940px; - margin-left: auto; - margin-right: auto; - zoom: 1; -} - -.container:before, .container:after { - display: table; - content: ""; - zoom: 1; -} - -.container:after { - clear: both; -} - -a { - color: #215e21; - text-decoration: none; - line-height: inherit; - font-weight: inherit; -} - -a:hover { - color: #000000; - text-decoration: none; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -/* Typography.less - * Headings, body text, lists, code, and more for a versatile and durable typography system - * ---------------------------------------------------------------------------------------- */ -p, -.cbi-map-descr, -.cbi-section-descr, -.table .tr.cbi-section-table-descr .th { - font-size: 12px; - font-weight: normal; - line-height: 18px; - margin-bottom: 9px; -} - -p small { - font-size: 11px; - color: #bfbfbf; -} - -h1, -h2, -h3, legend, -h4, -h5, -h6 { - font-weight: normal; - color: #404040; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - color: #bfbfbf; -} - -h1 { - margin-bottom: 18px; - font-size: 30px; - line-height: 36px; -} - -h1 small { - font-size: 18px; -} - -h2 { - font-size: 24px; - line-height: 58px; - text-transform: uppercase; - font-weight: normal; -} - -h2 small { - font-size: 14px; -} - -h3, legend, -h4, -h5, -h6 { - line-height: 48px; -} - -h3, legend { - font-size: 18px; -} - -h3 small { - font-size: 14px; -} - -h4 { - font-size: 16px; -} - -h4 small { - font-size: 12px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 13px; - color: #bfbfbf; - text-transform: uppercase; -} - -ul, ol { - margin: 0 0 18px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li { - line-height: 18px; - color: #808080; -} - -ul.unstyled { - list-style: none; - margin-left: 0; -} - -dl { - margin-bottom: 18px; -} - -dl dt, dl dd { - line-height: 18px; -} - -dl dt { - font-weight: bold; -} - -dl dd { - margin-left: 9px; -} - -hr { - margin: 20px 0 19px; - border: 0; - border-bottom: 1px solid #eee; -} - -strong { - font-style: inherit; - font-weight: bold; -} - -em { - font-style: italic; - font-weight: inherit; - line-height: inherit; -} - -small { font-size: 0.9em } - -address { - display: block; - line-height: 18px; - margin-bottom: 18px; -} - -code, pre { - padding: 0 3px 2px; - font-family: Monaco, Andale Mono, Courier New, monospace; - font-size: 12px; - border-radius: 2px; -} - -code { - background-color: #fee9cc; - color: rgba(0, 0, 0, 0.75); - padding: 1px 3px; -} - -pre { - background-color: #f5f5f5; - display: block; - padding: 8.5px; - margin: 0 0 18px; - line-height: 18px; - font-size: 12px; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 2px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* Forms.less - * Base styles for various input types, form layouts, and states - * ------------------------------------------------------------- */ -form { - margin-bottom: 18px; -} - -fieldset { - margin-bottom: 9px; - padding-top: 9px; -} - -fieldset legend { - display: block; - font-size: 19.5px; - line-height: 1; - color: #404040; - padding-top: 20px; - *padding: 0 0 5px 0px; - /* IE6-7 */ - - *line-height: 1.5; - /* IE6-7 */ - -} -form .cbi-tab-descr { - line-height: 18px; - margin-bottom: 18px; -} - -form .clearfix, -form .cbi-value { - margin-bottom: 15px; - margin-top: 15px; - zoom: 1; -} - -form .clearfix:before, form .clearfix:after, -form .cbi-value:before, form .cbi-value:after { - display: table; - content: ""; - zoom: 1; -} - -form .clearfix:after, -form .cbi-value:after { - clear: both; -} - -label, -input, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-weight: normal; - line-height: normal; -} - -form .input, -form .cbi-value-field { - margin-left: 120px; -} - -form .cbi-value label.cbi-value-title { - padding-top: 6px; - font-size: 12px; - line-height: 18px; - float: left; - width: 111px; - text-align: left; - color: #404040; -} - -input[type=checkbox], input[type=radio] { - cursor: pointer; -} - -input, -textarea, -select, -.cbi-dropdown, -.uneditable-input { - display: inline-block; - width: 200px; - height: 30px; - padding: 4px; - font-size: 12px; - line-height: 18px; - color: #808080; - border: 1px solid #ccc; - border-radius: 2px; - box-sizing: border-box; - margin: 2px 0; -} - -.cbi-dropdown { - min-width: 210px; - max-width: 400px; - width: auto; -} - -select { - padding: initial; - background: #fff; - box-shadow: inset 0 -1px 3px rgba(0, 0, 0, 0.1); -} - -input[type=checkbox], input[type=radio] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE6-7 */ - - line-height: normal; - border: none; -} - -input[type=file] { - background-color: #fff; - padding: initial; - border: initial; - line-height: initial; - box-shadow: none; - width: auto !important; -} - -input[type=button], input[type=reset], input[type=submit] { - width: auto; - height: auto; -} - -select, input[type=file] { - *height: auto; - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ -} - -select[multiple] { - height: inherit; - background-color: #fff; -} - -textarea { - height: auto; -} - -.td > input[type=text], -.td > input[type=password], -.td > select, -.td > .cbi-dropdown { - width: 100%; -} - -.uneditable-input { - background-color: #fff; - display: block; - border-color: #eee; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} - -::-moz-placeholder { - color: #bfbfbf; -} - -::-webkit-input-placeholder { - color: #bfbfbf; -} - -.btn, .cbi-button, input, textarea { - transition: border linear 0.2s, box-shadow linear 0.2s; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); - padding: 12px 6px; -} - -.btn:hover, .cbi-button:hover, -input:focus, textarea:focus { - outline: 0; - border-color: rgba(82, 168, 236, 0.8) !important; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); - text-decoration: none; -} - -input[type=file]:focus, input[type=checkbox]:focus, select:focus { - box-shadow: none; - outline: 1px dotted #666; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - background-color: #194119; - border-color: #ccc; - padding: 5px; - pointer-events: none; - cursor: default; -} - -select[readonly], -textarea[readonly] { - pointer-events: auto; - cursor: auto; -} - -.cbi-optionals, -.cbi-section-create { - padding: 0 0 10px 10px; -} - -.cbi-section-create { - margin: 10px 0 0 -10px; - display: inline-flex; - align-items: center; -} - -.cbi-section-create > * { - margin: 3px; - flex: 1 1 auto; -} - -.cbi-section-create > * > input { - width: 100%; -} - -.actions, -.cbi-page-actions { - background: #f5f5f5; - margin-bottom: 20px; - margin-top: 40px; - padding: 15px 20px 15px 20px; - border-radius: 0 0 2px 2px; - text-align: right; -} - -.actions .secondary-action, -.cbi-page-actions .secondary-action{ - float: right; -} - -.actions .secondary-action a, -.cbi-page-actions .secondary-action a { - line-height: 30px; -} - -.actions .secondary-action a:hover, -.cbi-page-actions .secondary-action a:hover { - text-decoration: none; -} - -.cbi-page-actions > form { - display: inline; - margin: 0; -} - -.help-inline, .help-block { - font-size: 12px; - line-height: 18px; - color: #bfbfbf; -} - -.help-inline { - padding-left: 5px; - *position: relative; - /* IE6-7 */ - - *top: -5px; - /* IE6-7 */ - -} - -.help-block { - display: block; - max-width: 600px; -} - -/* - * Tables.less - * Tables for, you guessed it, tabular data - * ---------------------------------------- */ -.tr { display: table-row; } -.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; } -.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; } - -.table { - display: table; - width: 100%; - margin: 12px 0 24px 0; - padding: 0; - font-size: 12px; - border-collapse: collapse; - position: relative; -} - -.table .th, .table .td { - display: table-cell; - vertical-align: middle; /* Fixme */ - padding: 6px 6px 6px 2px; - line-height: 18px; - text-align: left; -} - -.table .tr:first-child .th { - padding-top: 9px; - font-weight: normal; - vertical-align: top; -} - -.table .td, .table .th { - border-top: 1px solid #e7e7e7; -} - -.tr.placeholder { - height: calc(3em + 20px); -} - -.tr.placeholder > .td { - position: absolute; - left: 0; - right: 0; - bottom: 0; - text-align: center; - line-height: 3em; -} - -/* Patterns.less - * Repeatable UI elements outside the base styles provided from the scaffolding - * ---------------------------------------------------------------------------- */ -header { - height: 40px; - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 10000; - overflow: visible; - color: #BFBFBF; -} - -header a { - color: #c4c4c4; -} - -header h3 a:hover, header .brand:hover, header ul .active > a { - background-color: #333; - background-color: rgba(0, 0, 0, 0.33); - color: #fff; - text-decoration: none; -} - -header h3 { - position: relative; -} - -header h3 a, header .brand { - float: left; - display: block; - padding: 16px 20px 16px; - margin-left: -20px; - color: #fff; - font-size: 24px; - font-weight: 333; - line-height: 1; -} - -header p { - margin: 0; - line-height: 40px; -} - -header .fill { - background-color: #215e21; - background-repeat: repeat-x; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.33), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - padding: 0 5px; -} - -header div > ul, .nav { - display: block; - float: left; - margin: 0 10px 0 20px; - position: relative; - left: 0; -} - -header div > ul > li, .nav > li { - display: block; - float: left; -} - -header div > ul a, .nav a { - display: block; - float: none; - padding: 22px 12px 14px 12px; - line-height: 19px; - letter-spacing: 0.4px; - text-decoration: none; - text-transform: uppercase; -} - -header div > ul a:hover, .nav a:hover { - color: #fff; - text-decoration: none; -} - -header div > ul .active > a, .nav .active > a { - background-color: #222; - background-color: rgba(0, 0, 0, 0.33); -} - -header div > ul.secondary-nav, .nav.secondary-nav { - float: right; - margin-left: 10px; - margin-right: 0; -} - -header div > ul.secondary-nav .menu-dropdown, -.nav.secondary-nav .menu-dropdown, -header div > ul.secondary-nav .dropdown-menu, -.nav.secondary-nav .dropdown-menu { - right: 0; - border: 0; -} - -header div > ul a.menu:hover, -.nav a.menu:hover, -header div > ul li.open .menu, -.nav li.open .menu, -header div > ul .dropdown-toggle:hover, -.nav .dropdown-toggle:hover, -header div > ul .dropdown.open .dropdown-toggle, -.nav .dropdown.open .dropdown-toggle { - background: #444; - background: rgba(0, 0, 0, 0.3); -} - -header div > ul .menu-dropdown, -.nav .menu-dropdown, -header div > ul .dropdown-menu, -.nav .dropdown-menu { - background-color: #003300; -} - -header div > ul .menu-dropdown a.menu, -.nav .menu-dropdown a.menu, -header div > ul .dropdown-menu a.menu, -.nav .dropdown-menu a.menu, -header div > ul .menu-dropdown .dropdown-toggle, -.nav .menu-dropdown .dropdown-toggle, -header div > ul .dropdown-menu .dropdown-toggle, -.nav .dropdown-menu .dropdown-toggle { - color: #fff; -} - -header div > ul .menu-dropdown a.menu.open, -.nav .menu-dropdown a.menu.open, -header div > ul .dropdown-menu a.menu.open, -.nav .dropdown-menu a.menu.open, -header div > ul .menu-dropdown .dropdown-toggle.open, -.nav .menu-dropdown .dropdown-toggle.open, -header div > ul .dropdown-menu .dropdown-toggle.open, -.nav .dropdown-menu .dropdown-toggle.open { - background: #444; - background: rgba(255, 255, 255, 0.05); -} - -header div > ul .menu-dropdown li a, -.nav .menu-dropdown li a, -header div > ul .dropdown-menu li a, -.nav .dropdown-menu li a { - color: #bfbfbf; -} - -header div > ul .menu-dropdown li a:hover, -.nav .menu-dropdown li a:hover, -header div > ul .dropdown-menu li a:hover, -.nav .dropdown-menu li a:hover { - background-color: #215e21; - background-repeat: repeat-x; - color: #fff; -} - -header div > ul .menu-dropdown .active a, -.nav .menu-dropdown .active a, -header div > ul .dropdown-menu .active a, -.nav .dropdown-menu .active a { - color: #fff; -} - -header div > ul .menu-dropdown .divider, -.nav .menu-dropdown .divider, -header div > ul .dropdown-menu .divider, -.nav .dropdown-menu .divider { - background-color: #222; - border-color: #444; -} - -header ul .menu-dropdown li a, header ul .dropdown-menu li a { - padding: 6px 12px; -} - -li.menu, .dropdown { - position: relative; -} - -.menu-dropdown, .dropdown-menu { - background-color: #fff; - float: left; - position: absolute; - top: 55px; - left: -9999px; - z-index: 900; - min-width: 200px; - max-width: 300px; - _width: 160px; - margin-left: 0; - margin-right: 0; - padding: 6px 0; - zoom: 1; - border-radius: 0 0 2px 2px; - background-clip: padding-box; -} - -.menu-dropdown li, .dropdown-menu li { - float: none; - display: block; - background-color: transparent; -} - -.menu-dropdown .divider, .dropdown-menu .divider { - height: 1px; - margin: 5px 0; - overflow: hidden; - background-color: #eee; - border-bottom: 1px solid #fff; -} - -header .dropdown-menu a, .dropdown-menu a { - display: block; - padding: 4px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - text-transform: capitalize; - letter-spacing: 0.2px; - color: #808080; - zoom: 1.1; -} - -header .dropdown-menu a:hover, -.dropdown-menu a:hover, -header .dropdown-menu a.hover, -.dropdown-menu a.hover { - background-color: #ddd; - background-repeat: repeat-x; - color: #404040; - text-decoration: none; - box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); -} - -.open .menu, -.dropdown.open .menu, -.open .dropdown-toggle, -.dropdown.open .dropdown-toggle { - color: #fff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); -} - -.open .menu-dropdown, -.dropdown.open .menu-dropdown, -.open .dropdown-menu, -.dropdown.open .dropdown-menu { - left: 0; -} - -.dropdown:hover ul.dropdown-menu { - left: 0; -} - -.dropdown-menu .dropdown-menu { - position: absolute; - left: 159px; -} - -.dropdown-menu li { - position: relative; -} - -.tabs, .cbi-tabmenu { - margin: 0 0 18px; - padding: 0; - list-style: none; - zoom: 1; -} - -.tabs:before, -.cbi-tabmenu:before, -.tabs:after, -.cbi-tabmenu:after { - display: table; - content: ""; - zoom: 1; -} - -.tabs:after, .cbi-tabmenu:after { - clear: both; -} - -.tabs > li, .cbi-tabmenu > li { - float: left; -} - -.tabs > li > a, .cbi-tabmenu > li > a { - display: block; -} - -.tabs, -.cbi-tabmenu { - border-color: #ddd; - border-style: solid; - border-width: 0 0 1px; -} - -.tabs > li, -.cbi-tabmenu > li { - position: relative; - margin-bottom: -1px; -} - -.cbi-tabmenu.map { - margin: 0; -} - -.cbi-tabmenu.map > li { - font-size: 16.5px; - font-weight: bold; -} - -.cbi-tabcontainer > fieldset.cbi-section[id] > legend { - display: none; -} - -.tabs > li > a, -.cbi-tabmenu > li > a { - padding: 0 15px; - margin-right: 2px; - line-height: 34px; - border: 1px solid transparent; - border-radius: 2px 2px 0 0; -} - -.tabs > li > a:hover, -.cbi-tabmenu > li > a:hover { - text-decoration: none; - background-color: #eee; - border-color: #eee #eee #ddd; -} - -.tabs .active > a, .tabs .active > a:hover, -.cbi-tabmenu .active > a, .cbi-tabmenu .active > a:hover, -.cbi-tab > a:link, .cbi-tab > a:hover { - color: #000000; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} - -.tabs .menu-dropdown, .tabs .dropdown-menu, -.cbi-tabmenu .menu-dropdown, .cbi-tabmenu .dropdown-menu { - top: 35px; - border-width: 1px; - border-radius: 0 2px 2px 2px; -} - -.tabs a.menu:after, .tabs .dropdown-toggle:after, -.cbi-tabmenu a.menu:after, .cbi-tabmenu .dropdown-toggle:after { - border-top-color: #999; - margin-top: 15px; - margin-left: 5px; -} - -.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle, -.cbi-tabmenu li.open.menu .menu, .cbi-tabmenu .open.dropdown .dropdown-toggle { - border-color: #999; -} - -.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after, -.cbi-tabmenu li.open a.menu:after, .cbi-tabmenu .dropdown.open .dropdown-toggle:after { - border-top-color: #555; -} - -.tab-content > .tab-pane, -.tab-content > div { - display: none; -} - -.tab-content > .active { - display: block; -} - -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background-color: #f5f5f5; - background-repeat: repeat-x; - border: 1px solid #ddd; - border-radius: 2px; - box-shadow: inset 0 1px 0 #fff; -} - -.breadcrumb li { - display: inline; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #bfbfbf; -} - -.breadcrumb .active a { - color: #404040; -} - -footer { - margin-top: 30px; - padding-top: 20px; - padding-bottom: 20px; - border-top: 1px solid #404040; -} - -.btn.danger, -.alert-message.danger, -.btn.danger:hover, -.alert-message.danger:hover, -.btn.error, -.alert-message.error, -.btn.error:hover, -.alert-message.error:hover, -.btn.success, -.alert-message.success, -.btn.success:hover, -.alert-message.success:hover, -.btn.info, -.alert-message.info, -.btn.info:hover, -.alert-message.info:hover { - color: #fff; -} - -.btn .close, .alert-message .close { - font-family: Arial, sans-serif; - line-height: 18px; -} - -.btn.danger, -.alert-message.danger, -.btn.error, -.alert-message.error { - background: linear-gradient(to bottom, #ee5f5b, #c43c35) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn.success, .alert-message.success { - background: linear-gradient(to bottom, #62c462, #57a957) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn.info, .alert-message.info { - background: linear-gradient(to bottom, #5bc0de, #339bb9) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.alert-message.notice { - background: linear-gradient(to bottom, #efefef, #fefefe) repeat-x; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn, -.cbi-button { - cursor: pointer; - display: inline-block; - background: linear-gradient(#fff, #fff 25%, #e6e6e6) no-repeat; - padding: 5px 14px 6px; - color: #333; - font-size: 12px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:focus, -.cbi-button:focus { - outline: 1px dotted #666; -} - -.cbi-input-invalid, -.cbi-value-error input { - color: #f00; - border-color: #f00; -} - -.cbi-button-positive, -.cbi-button-fieldadd, -.cbi-button-add, -.cbi-button-save { - border-color: #4a4; - color: #4a4; -} - -.cbi-button-neutral, -.cbi-button-download, -.cbi-button-find, -.cbi-button-link, -.cbi-button-up, -.cbi-button-down { - color: #444; -} - -.btn.primary, -.cbi-button-action, -.cbi-button-apply, -.cbi-button-reload, -.cbi-button-edit { - border-color: #4aa44b; - color: #4aa44b; -} - -.cbi-button-negative, -.cbi-section-remove .cbi-button, -.cbi-button-reset, -.cbi-button-remove { - border-color: #c44; - color: #c44; -} - -.cbi-page-actions::after { - display: table; - content: ""; - clear: both; -} - -.cbi-page-actions > :not([method="post"]):not(.cbi-button-apply):not(.cbi-button-save):not(.cbi-button-reset) { - float: left; - margin-right: .4em; -} - -.btn.primary, -.cbi-button-action.important, -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit { - color: #fff; - background: #4aa44b; -} - -.cbi-button-positive.important, -.cbi-page-actions .cbi-button-save { - color: #fff; - background: linear-gradient(to bottom, #4a4, #484) no-repeat; -} - -.cbi-button-negative.important { - color: #fff; - background: linear-gradient(to bottom, #c44, #c00) no-repeat; -} - -.cbi-page-actions .cbi-button-apply + .cbi-button-save { - background: linear-gradient(#fff, #fff 25%, #e6e6e6); - color: #4a4; -} - -.cbi-dropdown { - border: 1px solid #ccc; - border-radius: 2px; - display: inline-flex; - padding: 0; - cursor: pointer; - height: auto; - background: linear-gradient(#fff 0%, #e9e8e6 100%); - position: relative; - color: #404040; -} - -.cbi-dropdown:focus { - outline: 2px solid #4b6e9b; -} - -.cbi-dropdown > ul { - margin: 0 !important; - padding: 0; - list-style: none; - overflow-x: hidden; - overflow-y: auto; - display: flex; - width: 100%; -} - -.cbi-dropdown > ul.preview { - display: none; -} - -.cbi-dropdown > .open, -.cbi-dropdown > .more { - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - line-height: 2em; - padding: 0 .25em; -} - -.cbi-dropdown > .more, -.cbi-dropdown > ul > li[placeholder] { - color: #777; - font-weight: bold; - display: none; -} - -.cbi-dropdown > ul > li { - display: none; - padding: .25em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 1; - flex-grow: 1; - align-items: center; - align-self: center; - color: #404040; - min-height: 20px; -} - -.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } -.cbi-dropdown > ul > li .hide-close { display: none; } - -.cbi-dropdown > ul > li[display]:not([display="0"]) { - border-left: 1px solid #ccc; -} - -.cbi-dropdown[empty] > ul { - max-width: 1px; -} - -.cbi-dropdown > ul > li > form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown > ul > li img { - vertical-align: middle; - margin-right: .25em; -} - -.cbi-dropdown > ul > li > form > input[type="checkbox"] { - margin: 0; -} - -.cbi-dropdown > ul > li input[type="text"] { - height: 20px; -} - -.cbi-dropdown[open] { - position: relative; -} - -.cbi-dropdown[open] > ul.dropdown { - display: block; - background: #f6f6f5; - border: 1px solid #918e8c; - box-shadow: 0 0 4px #918e8c; - position: absolute; - z-index: 1000; - max-width: none; - min-width: 100%; - width: auto; -} - -.cbi-dropdown > ul > li[display], -.cbi-dropdown[open] > ul.preview, -.cbi-dropdown[open] > ul.dropdown > li, -.cbi-dropdown[multiple] > ul > li > label, -.cbi-dropdown[multiple][open] > ul.dropdown > li, -.cbi-dropdown[multiple][more] > .more, -.cbi-dropdown[multiple][empty] > .more { - flex-grow: 1; - display: flex; -} - -.cbi-dropdown[empty] > ul > li, -.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], -.cbi-dropdown[multiple][open] > ul.dropdown > li > form { - display: block; -} - -.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } -.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } - -.cbi-dropdown[open] > ul.dropdown > li { - border-bottom: 1px solid #ccc; -} - -.cbi-dropdown[open] > ul.dropdown > li[selected] { - background: #b0d0f0; -} - -.cbi-dropdown[open] > ul.dropdown > li.focus { - background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); -} - -.cbi-dropdown[open] > ul.dropdown > li:last-child { - margin-bottom: 0; - border-bottom: none; -} - -.cbi-dropdown[disabled] { - pointer-events: none; - opacity: .6; -} - -input[type="text"] + .cbi-button, -input[type="password"] + .cbi-button, -select + .cbi-button { - border-radius: 2px; - border-color: #ccc; - margin: 2px 0 2px 3px; - padding: 0 12px; - vertical-align: top; - height: 28px; - font-size: 13px; - font-weight: normal; - line-height: 28px; -} - -select + .cbi-button { - #border-left-color: transparent; -} - -.cbi-title-ref { - color: #f39800; -} - -.cbi-title-ref::after { - content: " ➙ "; -} - -.cbi-tooltip-container { - cursor: help; - padding: 5px 3px 5px 3px; -} - -.cbi-tooltip { - position: absolute; - z-index: 1000; - left: -1000px; - opacity: 0; - transition: opacity .25s ease-out; -} - -.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { - left: auto; - opacity: 1; - transition: opacity .25s ease-in; -} - -.zonebadge .cbi-tooltip { - padding: 1px; - background: inherit; - margin: -1.6em 0 0 -5px; - border-radius: 2px; - pointer-events: none; - box-shadow: 0 0 3px #444; -} - -.zonebadge .cbi-tooltip > * { - margin: 1px; -} - -.zone-forwards { - display: flex; - flex-wrap: wrap; -} - -.zone-forwards > * { - flex: 1 1 40%; - padding: 1px; -} - -.zone-forwards > span { - flex-basis: 10%; - text-align: center; -} - -.zone-forwards .zone-src, -.zone-forwards .zone-dest { - display: flex; - flex-direction: column; -} - -.btn.active, .btn:active { - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled { - cursor: default; - background-image: none; - opacity: 0.65; - box-shadow: none; -} - -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - box-shadow: none; -} - -.btn.large { - font-size: 15px; - line-height: normal; - padding: 9px 14px 9px; - border-radius: 2px; -} - -.btn.small { - padding: 7px 9px 7px; - font-size: 11px; -} - -button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -.close { - float: right; - color: #000; - font-size: 20px; - font-weight: bold; - line-height: 13.5px; - opacity: 0.25; -} - -.close:hover { - color: #000; - text-decoration: none; - opacity: 0.4; -} - -.alert-message { - position: relative; - padding: 30px; - margin-top: 25px; - margin-bottom: 25px; - color: #404040; - background: #f0e68c; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-width: 1px; - border-style: solid; - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.alert-message .close { - margin-top: 1px; - *margin-top: 0; -} - -.alert-message a { - font-weight: bold; - color: #404040; -} - -.alert-message.danger p a, -.alert-message.error p a, -.alert-message.success p a, -.alert-message.info p a { - color: #fff; -} - -.alert-message h5 { - line-height: 18px; -} - -.alert-message p { - margin-bottom: 0; -} - -.alert-message div { - margin-top: 15px; - margin-bottom: 10px; - line-height: 28px; -} - -.label { - padding: 3px 3px 3px 3px; - font-size: 8px; - font-weight: normal; - color: #fff !important; - text-transform: uppercase; - white-space: nowrap; - background-color: #bfbfbf; - border-radius: 2px; - text-shadow: none; -} - -a.label:link, -a.label:visited { - color: #fff; -} - -a.label:hover { - text-decoration: none; -} - -.label.important { - background-color: #c43c35; -} - -.label.warning { - background-color: #f89406; -} - -.label.success { - background-color: #46a546; -} - -.label.notice { - background-color: #62cffc; -} - -/* LuCI specific items */ -.hidden { display: none } - -#memtotal > div, -#memfree > div, -#memcache > div, -#membuff > div, -#conns > div { - border: 1px solid #ccc; - border-radius: 2px 2px 2px 2px; - color: #808080; - display: inline-block; - font-size: 12px; - line-height: 18px; -} - -#xhr_poll_status { - cursor: pointer; -} - -form.inline { display: inline; margin-bottom: 0; } - -header .pull-right { padding-top: 21px; } - -#modemenu li:last-child span.divider { display: none } - -#syslog { width: 100%; } - -.cbi-section-table .tr:hover .td, -.cbi-section-table .tr:hover .th, -.cbi-section-table .tr:hover::before { - background-color: #f5f5f5; -} - -.cbi-section-table .tr.cbi-section-table-descr .th { - font-weight: normal; -} - -.cbi-section-table-titles.named::before, -.cbi-section-table-descr.named::before, -.cbi-section-table-row[data-title]::before { - content: attr(data-title) " "; - display: table-cell; - padding: 10px 10px 9px; - line-height: 18px; - font-weight: bold; - vertical-align: middle; -} - -.cbi-section-table-titles.named::before, -.cbi-section-table-descr.named::before, -.cbi-section-table-row[data-title]::before { - border-top: 1px solid #ddd; -} - -.left { text-align: left !important; } -.right { text-align: right !important; } -.center { text-align: center !important; } -.top { vertical-align: top !important; } -.middle { vertical-align: middle !important; } -.bottom { vertical-align: bottom !important; } - -.cbi-value-field { line-height: 1.5em; } - -.cbi-value-field input[type=checkbox], -.cbi-value-field input[type=radio] { - margin-top: 8px; - margin-right: 6px; -} - -table table td, -.cbi-value-field table td { - border: none; -} - -.table.cbi-section-table input[type="password"], -.table.cbi-section-table input[type="text"], -.table.cbi-section-table textarea, -.table.cbi-section-table select { - width: 100%; -} - -.table.cbi-section-table .td.cbi-section-table-cell { - white-space: nowrap; - text-align: right; -} - -.table.cbi-section-table .td.cbi-section-table-cell select { - width: inherit; -} - -.td.cbi-section-actions { - text-align: right; - vertical-align: middle; -} - -.td.cbi-section-actions > * { - display: flex; -} - -.td.cbi-section-actions > * > *, -.td.cbi-section-actions > * > form > * { - flex: 1 1 4em; - margin: 0 1px; -} - -.td.cbi-section-actions > * > form { - display: inline-flex; - margin: 0; -} - -.table.valign-middle .td { - vertical-align: middle; -} - -.cbi-rowstyle-2, -.tr.table-titles, -.tr.cbi-section-table-titles { - background: #f9f9f9; -} - -.cbi-value-description { - background-image: url(/luci-static/resources/cbi/help.gif); - background-position: .25em .2em; - background-repeat: no-repeat; - margin: 10px 0 10px -5px; - padding: 0 0 0 26px; -} - -.cbi-section-error { - border: 1px solid #f00; - border-radius: 2px; - background-color: #fce6e6; - padding: 5px; - margin-bottom: 18px; -} - -.cbi-section-error ul { margin: 0 0 0 20px; } - -.cbi-section-error ul li { - color: #f00; - font-weight: bold; -} - -.ifacebox { - background-color: #fff; - border: 1px solid #ccc; - margin: 6px 4px; - text-align: center; - white-space: nowrap; - background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - display: inline-flex; - flex-direction: column; - line-height: 1.2em; - min-width: 100px; -} - -.ifacebox .ifacebox-head { - border-bottom: 1px solid #ccc; - padding: 10px; - line-height: 1.2em; - background: #eee; -} - -.ifacebox .ifacebox-head.active { - background: #f0e68c; -} - -.ifacebox .ifacebox-body { - padding: .25em; -} - -.ifacebadge { - display: inline-block; - flex-direction: row; - white-space: nowrap; - background-color: #fff; - border: 1px solid #ccc; - padding: 5px 5px 3px 5px; - background-image: linear-gradient(#fff, #fff 25%, #f9f9f9); - border-radius: 2px; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - cursor: default; - line-height: 1.2em; -} - -.ifacebadge img { - width: 16px; - height: 16px; - vertical-align: middle; -} - -.ifacebadge-active { - border-color: #000; - font-weight: bold; -} - -.network-status-table { - display: flex; - flex-wrap: wrap; -} - -.network-status-table .ifacebox { - margin: 10px 10px 15px 2px; - flex-grow: 1; -} - -.network-status-table .ifacebox-body { - display: flex; - flex-direction: column; - height: 100%; - text-align: left; - padding: 8px; -} - -.network-status-table .ifacebox-body > * { - margin: .25em; -} - -.network-status-table .ifacebox-body > span { - flex: 10 10 auto; - height: 100%; -} - -.network-status-table .ifacebox-body > div { - display: flex; - flex-wrap: wrap; - margin: -.125em; -} - -#dsl_status_table .ifacebox-body > span > strong { - display: inline-block; - min-width: 35%; -} - -.ifacebadge.large, -.network-status-table .ifacebox-body .ifacebadge { - display: inline-flex; - flex: 1; - padding: 10px 4px 10px 4px; - min-width: 220px; - margin: 10px 6px 4px 4px; -} - -.ifacebadge > *, -.ifacebadge.large > * { - margin: 0 .125em; -} - -.zonebadge { - padding: 2px; - border-radius: 2px; - display: inline-block; - white-space: nowrap; - color: #666; -} - -.zonebadge > em, -.zonebadge > strong { - margin: 0 2px; - display: inline-block; -} - -.zonebadge input { - width: 6em; -} - -.zonebadge > .ifacebadge { - margin-left: 2px; -} - -.zonebadge-empty { - border: 1px dashed #aaa; - color: #aaa; - font-style: italic; - font-size: smaller; -} - -div.cbi-value var, -.td.cbi-value-field var { - font-style: italic; - color: #215e21; -} - -.uci-change-list { - line-height: 170%; - white-space: pre; -} - -.uci-change-list del, -.uci-change-list ins, -.uci-change-list var, -.uci-change-legend-label del, -.uci-change-legend-label ins, -.uci-change-legend-label var { - text-decoration: none; - font-family: monospace; - font-style: normal; - border: 1px solid #ccc; - background: #eee; - padding: 2px; - display: block; - line-height: 15px; - margin-bottom: 1px; -} - -.uci-change-list ins, -.uci-change-legend-label ins { - border-color: #0f0; - background: #cfc; -} - -.uci-change-list del, -.uci-change-legend-label del { - border-color: #f00; - background: #fcc; -} - -.uci-change-list var, -.uci-change-legend-label var { - border-color: #ccc; - background: #eee; -} - -.uci-change-list var ins, -.uci-change-list var del { - display: inline-block; - border: none; - width: 100%; - padding: 0; -} - -.uci-change-legend { - padding: 5px; -} - -.uci-change-legend-label { - width: 150px; - float: left; -} - -.uci-change-legend-label > ins, -.uci-change-legend-label > del, -.uci-change-legend-label > var { - float: left; - margin-right: 4px; - width: 10px; - height: 10px; - display: block; - position: relative; -} - -.uci-change-legend-label var ins, -.uci-change-legend-label var del { - border: none; - position: absolute; - top: 2px; - left: 2px; - right: 2px; - bottom: 2px; -} - -html body.apply-overlay-active { - height: calc(100vh - 63px); -} - -#applyreboot-section { - line-height: 300%; -} - -.login{ - text-align: center; - background-color: #fff; - border-radius: 20px; - width: 300px; - height: 350px; - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%,-50%); -} diff --git a/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/ezenlink.png b/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/ezenlink.png deleted file mode 100755 index 070a12b7da56ad334a98ffb87ca1a382af985ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmV+^0@nSBP)5Rm*L{Kop!rxswj!voA{raViK6tZ*v8R6tTepaO_o zK%jz<3ScijlMX@!jz*fb7UN%5LM!a|X5Y-td%h{l5<`};@jZaZ<;8JG{Ov%{2>=2f zjE$E=aylzEHXZ{Y&?A5!fj0+a};rI%Z*jv2iL{ zMgq8CqI=*$2EfYY1rNJ&#m0k@fwA!kz*?8~dk$t1{z70E8s|4@}f?f1JGsh-A*IZ+iaOa7=K r8C)FHmOJQUD(bA18eYuZ#s%OHNQeZcR0cH!00000NkvXXu0mjf(L3<` diff --git a/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/favicon.ico b/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/favicon.ico deleted file mode 100755 index dd14062c9b9520f0de40f938a7cfa0ecc0edc154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHHJ5Iwu5M3%tvJDcVz;u*8f+a4HirPo;4cI_I3Zw{$CRJKGAHg+Mj$mq<$Q=ce zdC!`0R+i(~2|^TJ^jObl=gqveW6TNug23>Zj8AB;4%?Ff3*-B*Qmg#!2eR< z;`K8IBJHZhPFmtq&A*#phCl?=U%1$Tms7_P3xJq0)&)x95L~^=?%Qz7N%1V5ct3Q9IyS=|P{_Q}6eY=TUFv z)zsRt#1<0E#nyMRvgz~JA@iet?(uVey@%NISKq6b>wI2)K7?P->JAQS?mX@lW1f$9 zQ~y@zIqu+}01k-7?z|7?uoe&rsJE|&a)v-au18Vx?>;EajH$xWNFbst{M z>B*mJZR~uGfl6QO2~cyZU+eGN!5;uQkTJK}&#v>}nF1N0daQ?Xx7BXrM_t~%6L5Z= zSGgDPwZ3m{99_O0{7pXPU4b{~sy8$SetsV*Q2n;@JUDpA8NfNILo~GRm_I5oDljVW z*9w#!Yq@-Wx7N(JnB)1wyx5s7>;v$1U08QpTK81i*=cFN&&tAG0rzF`*im^K`T>j! BrMdtB diff --git a/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/footer.png b/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/footer.png deleted file mode 100755 index c7e2e393ac0c035c9a41f7e9d095bd11c4099971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 836 zcmV-K1H1f*P)s+)P~w1iKdod zscmgBclR0#Sg?&vEJUVn^1i)(IdXxJpLs9u?q+vpXJ@`|cJpR99AZ)8d^j>!S(>!f zrSoAMz#c#E;xkK=yLpygSn$q=&j5D$d6lKfCG{HsS^(BcOm6|)WNGqe)-~VG74f)y zkS~3I0MMIaw*}zP`EcfZ*qLR)cXI^$BFWO^5kS-Vu*vyWi7Ej5u8NNeH(}K~&(fs3 zl;E8Yw&+fT#tS!*V_p2%Mz#sJ3f1Pj<$Sn!4oWj)o`Ihb!<|S@=R*@fjnnS4G--*= zdx26vOOq!say}f8)XI&kX$g8w=0C~;bpY*W=9@GXBF={aE07a4OOv0@hYo;-%-wZ9 zJlfbKr;8-)L}8^i3S(;pqHc2oJ$9yhnY$myR~|fxcWMw|P(>md)*H@;V}q9woRHIb zU&)U#nF}X{HEv>5Rc_!`#t-nn z1F1gmJfq;vf%Bm~>)qld!tT+|(!_}WjTs)$)L?ncLkvplLYDQU9S>ek%)^+8WeACC zfi$EQRtj0}ObAr3&hZq_gV!T@ebI4SMeX>Hm6cW)E1(s>k@roR-xYsVtcb8pc9MNo zHvVC;fUY@hO$e%oQ$^nOoLOIb@XS!Hpsov+HPF$;t#D~m2>&hmUv}opAQ&?`%c=cj zZVY}P&pzM#1$`9FK(|CcdgmQpZNV$?r2npJA8pDYG#0#FoGjSWST;U$eKg3@#0X{W z&K&2b9q--NDeR7~EzfLYpSI_j*jVQ=KR*f^I;Z}-=**|->`%%a0Q>{Ia7QjydhGlF O0000 ul, .nav { - display: block; - float: left; - margin: 7px 8px 0 8px; - position: relative; - left: 0; -} - -header div > ul a, .nav a { - display: block; - float: left; - padding: 12px 6px 12px 6px; - line-height: 14px; - letter-spacing: 0.2px; -} - -.menu-dropdown, .dropdown-menu { - top: 38px; - min-width: 180px; - max-width: 260px; -} - -@media screen and (max-device-width: 660px) { - #maincontent.container { - width: 98%; - margin: 30px 0 0 6px; - } -} - -@media screen and (max-device-width: 360px) { - #maincontent.container { - width: 96%; - margin: 30px 0 0 6px; - } -} - -@media screen and (max-device-width: 200px) { - #maincontent.container { - width: 94%; - margin: 40px 0 0 2px; - } -} diff --git a/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/omr-logo.png b/luci-theme-ezengreen/htdocs/luci-static/resources/ezengreen/images/omr-logo.png deleted file mode 100755 index 3d532aec038b0c7bf504b1583606b1139a43a037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19149 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

bVaUL}!q88y{QQ?r(PMb$$ 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 GOZW$!hAhAU diff --git a/luci-theme-ezengreen/htdocs/luci-static/resources/menu-ezengreen.js b/luci-theme-ezengreen/htdocs/luci-static/resources/menu-ezengreen.js deleted file mode 100755 index 5400276b0..000000000 --- a/luci-theme-ezengreen/htdocs/luci-static/resources/menu-ezengreen.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict'; -'require baseclass'; -'require ui'; - -return baseclass.extend({ - __init__: function() { - ui.menu.load().then(L.bind(this.render, this)); - }, - - render: function(tree) { - var node = tree, - url = ''; - - this.renderModeMenu(tree); - - if (L.env.dispatchpath.length >= 3) { - for (var i = 0; i < 3 && node; i++) { - node = node.children[L.env.dispatchpath[i]]; - url = url + (url ? '/' : '') + L.env.dispatchpath[i]; - } - - if (node) - this.renderTabMenu(node, url); - } - - document.addEventListener('poll-start', this.handleBodyMargin); - document.addEventListener('poll-stop', this.handleBodyMargin); - document.addEventListener('uci-new-changes', this.handleBodyMargin); - document.addEventListener('uci-clear-changes', this.handleBodyMargin); - window.addEventListener('resize', this.handleBodyMargin); - - this.handleBodyMargin(); - }, - - renderTabMenu: function(tree, url, level) { - var container = document.querySelector('#tabmenu'), - ul = E('ul', { 'class': 'tabs' }), - children = ui.menu.getChildren(tree), - activeNode = null; - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[3 + (level || 0)] == children[i].name), - activeClass = isActive ? ' active' : '', - className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); - - ul.appendChild(E('li', { 'class': className }, [ - E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] )])); - - if (isActive) - activeNode = children[i]; - } - - if (ul.children.length == 0) - return E([]); - - container.appendChild(ul); - container.style.display = ''; - - if (activeNode) - this.renderTabMenu(activeNode, url + '/' + activeNode.name, (level || 0) + 1); - - return ul; - }, - - renderMainMenu: function(tree, url, level) { - var ul = level ? E('ul', { 'class': 'dropdown-menu' }) : document.querySelector('#topmenu'), - children = ui.menu.getChildren(tree); - - if (children.length == 0 || level > 1) - return E([]); - - for (var i = 0; i < children.length; i++) { - var submenu = this.renderMainMenu(children[i], url + '/' + children[i].name, (level || 0) + 1), - subclass = (!level && submenu.firstElementChild) ? 'dropdown' : null, - linkclass = (!level && submenu.firstElementChild) ? 'menu' : null, - linkurl = submenu.firstElementChild ? '#' : L.url(url, children[i].name); - - var li = E('li', { 'class': subclass }, [ - E('a', { 'class': linkclass, 'href': linkurl }, [ _(children[i].title) ]), - submenu - ]); - - ul.appendChild(li); - } - - ul.style.display = ''; - - return ul; - }, - - renderModeMenu: function(tree) { - var ul = document.querySelector('#modemenu'), - children = ui.menu.getChildren(tree); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); - - ul.appendChild(E('li', { 'class': isActive ? 'active' : null }, [ - E('a', { 'href': L.url(children[i].name) }, [ _(children[i].title) ]), - ' ', - E('span', { 'class': 'divider' }, [ '|' ]) - ])); - - if (isActive) - this.renderMainMenu(children[i], children[i].name); - } - - if (ul.children.length > 1) - ul.style.display = ''; - }, - - handleBodyMargin: function(ev) { - var body = document.querySelector('body'), - head = document.querySelector('header'); - - body.style.marginTop = head.offsetHeight + 'px'; - } -}); diff --git a/luci-theme-ezengreen/luasrc/view/themes/ezengreen/footer.htm b/luci-theme-ezengreen/luasrc/view/themes/ezengreen/footer.htm deleted file mode 100755 index 0fdd0e4d3..000000000 --- a/luci-theme-ezengreen/luasrc/view/themes/ezengreen/footer.htm +++ /dev/null @@ -1,19 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Copyright 2012 David Menting - Licensed to the public under the Apache License 2.0. --%> - -<% local ver = require "luci.version" %> - -

-
- - - - diff --git a/luci-theme-ezengreen/luasrc/view/themes/ezengreen/header.htm b/luci-theme-ezengreen/luasrc/view/themes/ezengreen/header.htm deleted file mode 100755 index f4a63ebaf..000000000 --- a/luci-theme-ezengreen/luasrc/view/themes/ezengreen/header.htm +++ /dev/null @@ -1,90 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2016 Jo-Philipp Wich - Copyright 2012 David Menting - Licensed to the public under the Apache License 2.0. --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - - local boardinfo = util.ubus("system", "board") - - local node = disp.context.dispatched - - -- send as HTML5 - http.prepare_content("text/html") - - -- Get current and latest OMR version - local current_omr_version = luci.model.uci.cursor():get("openmptcprouter","settings","version") or "" - local latest_omr_version = luci.model.uci.cursor():get("openmptcprouter","latest_versions","omr") or "" - --%> - - - - - <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - system - - - - - - - - - <% if node and node.css then %> - - <% end -%> - <% if css then %> - - <% end -%> - - - - - "> -
-
- -
-
- -
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> -
-

<%:No password set!%>

-

<%:There is no password set on this router. Please configure a root password to protect the web interface.%>

- <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
- <%- end -%> - <%- if current_omr_version ~= "" and latest_omr_version ~= "" and current_omr_version < latest_omr_version then -%> -
-

<%=translatef("你的蚂蚁聚合openmptcprouter of china商业版 版本号 %s 最新 版本号 %s 现在可以升级",current_omr_version,latest_omr_version)%>

- -
- <%- end -%> -
- - -
- - - - diff --git a/luci-theme-ezengreen/root/etc/uci-defaults/luci-theme-ezengreen b/luci-theme-ezengreen/root/etc/uci-defaults/luci-theme-ezengreen deleted file mode 100755 index e1c8313d2..000000000 --- a/luci-theme-ezengreen/root/etc/uci-defaults/luci-theme-ezengreen +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -if [ "$(uci -q get luci.themes.ezengreen)" = "" ]; then - uci batch <<-EOF - set luci.themes.ezengreen=/luci-static/ezengreen - set luci.main.mediaurlbase=/luci-static/ezengreen - commit luci - EOF -fi -exit 0 diff --git a/luci-theme-openwrt-2020/Makefile b/luci-theme-openwrt-2020/Makefile old mode 100755 new mode 100644 index e5ef95832..0e18a5f43 --- a/luci-theme-openwrt-2020/Makefile +++ b/luci-theme-openwrt-2020/Makefile @@ -9,6 +9,14 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI modern OpenWrt theme LUCI_DEPENDS:= +define Package/luci-theme-openwrt-2020/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.OpenWrt2020 + uci commit luci +} +endef + include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css old mode 100755 new mode 100644 index b412764d4..ff3b90917 --- a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css +++ b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css @@ -5,6 +5,7 @@ --secondary-dark-color: #212322; --danger-color: #CC1111; --warning-color: #CC8800; + --success-color: #5CB85C; --regular-font: "GalanoGrotesqueW00-Regular"; --base-font-size: 16px; } @@ -14,6 +15,10 @@ src: url("GalanoGrotesqueW00-Regular.woff2") format("woff2"); } +:root[lang="bg"], :root[lang="ru"], :root[lang="uk"], :root[lang="el"], :root[lang="he"] { + --regular-font: "Helvetica"; +} + /* * resets and base style */ @@ -53,13 +58,17 @@ body { min-width: 100%; } +abbr[title], acronym[title] { + text-decoration: dotted underline; +} + /* * scaffholding */ #menubar { background-color: var(--main-bright-color); - background-image: url("omr-logo.png"); + background-image: url("logo.svg"); background-position: 10px center; background-size: 50px 50px; background-repeat: no-repeat; @@ -147,7 +156,8 @@ body { } #mainmenu { - flex: 1 1 200px; + flex: 1 1 100px; + max-width: 250px; background: var(--main-dark-color); color: var(--main-bright-color); padding: 1em; @@ -166,7 +176,7 @@ body { #mainmenu ul { padding: 0; - margin: 0 0 .5em .5em; + margin: 0 0 0 .5em; line-height: 1.5em; } @@ -188,6 +198,7 @@ body { #mainmenu li.active > ul { max-height: 3000px; transition: max-height 1s ease-in-out; + margin: 0 0 .5em .5em; } #mainmenu .l1 > li > a { @@ -269,74 +280,69 @@ body.modal-overlay-active #modal_overlay { * table layout */ -.table { - display: table; +table { width: 100%; margin: 0 0 1rem 0; position: relative; + border-collapse: collapse; } -.tr { - display: table-row; -} - -.tr.cbi-section-table-titles[data-title]::before { +tr.cbi-section-table-titles[data-title]::before { font-weight: bold; border-top: none; } -.tr[data-title]::before { +tr[data-title]::before { content: attr(data-title); display: table-cell; border-top: 1px solid var(--main-dark-color); padding: .5em; } -.th { +th { + text-align: left; font-weight: bold; - display: table-cell; padding: .5em; /* word-break: break-word; */ } -.cbi-section-table-descr .th { +.cbi-section-table-descr th { opacity: .8; font-size: 90%; font-weight: normal; } -.td { - display: table-cell; +td { border-top: 1px solid var(--main-dark-color); padding: .5em; vertical-align: middle; } -.td input:not([type]), -.td input[type="text"], -.td input[type="password"], -.td select, -.td .cbi-dropdown:not(.btn):not(.cbi-button), -.td .cbi-dynlist, -.td .control-group { +td input:not([type]), +td input[type="text"], +td input[type="password"], +td select, +td .cbi-dropdown:not(.btn):not(.cbi-button), +td .cbi-dynlist, +td .control-group { min-width: auto; width: 100%; } -.tr.drag-over-above { +tr.drag-over-above { box-shadow: 0 -6px 6px var(--main-bright-color); } -.tr.drag-over-below { +tr.drag-over-below { box-shadow: 0 6px 6px var(--main-bright-color); } -.tr.placeholder { +tr.placeholder { height: 4em; position: relative; } -.tr.placeholder > .td { +tr.placeholder > td { position: absolute; left: 0; right: 0; @@ -356,51 +362,51 @@ body.modal-overlay-active #modal_overlay { justify-content: space-around; } -.assoclist .td, -[data-page="admin-status-overview"] .td { +.assoclist td, +[data-page="admin-status-overview"] td { font-size: .9rem; vertical-align: middle; } -.assoclist .td:nth-of-type(3) > span { +.assoclist td:nth-of-type(3) > span { display: block; max-width: 270px; font-size: .8rem; } -.assoclist .td:nth-of-type(5) > span { +.assoclist td:nth-of-type(5) > span { font-size: .8rem; } -.assoclist .td > .ifacebadge { +.assoclist td > .ifacebadge { flex-wrap: wrap; justify-content: space-around; max-width: 120px; padding: .2em; } -.assoclist .td > .ifacebadge::after { +.assoclist td > .ifacebadge::after { overflow: hidden; text-overflow: ellipsis; } -.assoclist .td > .ifacebadge > img { +.assoclist td > .ifacebadge > img { margin: 0 25px; } -.assoclist .td > .ifacebadge[data-ssid][data-ifname] > span { +.assoclist td > .ifacebadge[data-ssid][data-ifname] > span { display: none; } -.assoclist .td > .ifacebadge[data-ssid][data-ifname]::after { +.assoclist td > .ifacebadge[data-ssid][data-ifname]::after { content: attr(data-ssid) " (" attr(data-ifname) ")"; } -[data-page="admin-status-overview"] .td:nth-of-type(3) { +[data-page="admin-status-overview"] td:nth-of-type(3) { min-width: 100px; } -[data-page="admin-network-firewall"] .table > .tr > *:nth-child(1) { +[data-page="admin-network-firewall"] table > tr > *:nth-child(1) { flex: 1 1 30%; } @@ -412,8 +418,8 @@ body.modal-overlay-active #modal_overlay { flex: 1; } -[data-page="admin-status-processes"] .table .td:nth-of-type(3), -[data-tab="leases"] .table .td[data-name="duid"] { +[data-page="admin-status-processes"] table td:nth-of-type(3), +[data-tab="leases"] table td[data-name="duid"] { word-break: break-word; } @@ -630,6 +636,10 @@ ul > li { list-style: disc; } +p > a { + text-decoration: underline; +} + /* * widgets */ @@ -666,7 +676,7 @@ ul > li { padding: 0; text-align: center; width: 100%; - max-width: 100px; + max-width: 150px; } .ifacebox-head { @@ -853,8 +863,11 @@ ul > li { background: var(--danger-color); } +.alert-message.success { + background: var(--success-color); +} + .alert-message .btn { - background: inherit; box-shadow: 0 0 2px var(--secondary-bright-color); } @@ -885,7 +898,7 @@ ul > li { * forms */ -.cbi-button, button, .btn { +button, .btn { background: var(--main-bright-color); color: var(--secondary-bright-color); line-height: 1.5em; @@ -896,7 +909,7 @@ ul > li { display: inline-block; } -.cbi-button:hover, button:hover, .btn:hover { +button:hover, .btn:hover { box-shadow: 0 0 6px var(--main-bright-color); } @@ -1517,11 +1530,12 @@ div[id$=".editlist"] { top: 0; bottom: 0; left: .4em; - width: 1.3em; - height: 1.3em; + width: 1.4em; + height: 1.4em; animation: spin 1s linear infinite; content: url("spinner.svg"); margin: auto; + line-height: 0; } button.spinning, .btn.spinning { @@ -1555,6 +1569,10 @@ button.spinning::before, .btn.spinning::before { background: var(--danger-color); } +.label.success { + background: var(--success-color); +} + ul.deps { margin: 0; padding: 0; @@ -1660,25 +1678,25 @@ ul.errors { display: none !important; } - .table { + table { display: flex; flex-direction: column; } - .tr { + tr { display: block; border-bottom: 1px solid var(--main-dark-color); margin-bottom: .5em; padding-bottom: .5em; } - .tr.cbi-section-table-titles[data-title]::before, - .tr.cbi-section-table-titles, - .tr.cbi-section-table-descr { + tr.cbi-section-table-titles[data-title]::before, + tr.cbi-section-table-titles, + tr.cbi-section-table-descr { display: none; } - .tr[data-title]::before { + tr[data-title]::before { display: block; font-weight: bold; border-top: none; @@ -1686,23 +1704,23 @@ ul.errors { font-size: 110%; } - .td { + td { display: block; border-top: none; text-align: left !important; padding: .2em 0; } - .th, .table-titles { + th, table-titles { display: none; } - .td[data-title] { + td[data-title] { position: relative; padding: .2em 0 .2em 40%; } - .td[data-title]::before { + td[data-title]::before { content: attr(data-title) ": "; white-space: nowrap; font-weight: bold; @@ -1719,7 +1737,7 @@ ul.errors { align-items: center; } - .td[data-title]::after { + td[data-title]::after { content: ""; width: 2em; position: absolute; @@ -1730,93 +1748,93 @@ ul.errors { background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--secondary-bright-color) 90%); } - [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) .td:first-of-type, - [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) .td:first-of-type { + [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) td:first-of-type, + [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) td:first-of-type { font-weight: bold; max-width: none; width: 100%; } - [data-page="admin-status-overview"] .td > span > span { font-size: .9rem; } + [data-page="admin-status-overview"] td > span > span { font-size: .9rem; } - [data-page="admin-status-routes"] .table:nth-of-type(3) .td:nth-of-type(1) { word-break: break-all; } + [data-page="admin-status-routes"] table:nth-of-type(3) td:nth-of-type(1) { word-break: break-all; } - [data-page="admin-network-firewall-zones"] .td[data-name="_info"] { + [data-page="admin-network-firewall-zones"] td[data-name="_info"] { padding: .2em 0; line-height: 2.2rem; } - [data-page="admin-network-firewall-zones"] .td[data-name="_info"]::before, - [data-page="admin-network-firewall-zones"] .td[data-name="_info"]::after { + [data-page="admin-network-firewall-zones"] td[data-name="_info"]::before, + [data-page="admin-network-firewall-zones"] td[data-name="_info"]::after { display: none; } - [data-page="admin-network-firewall-zones"] .td[data-name="_info"] label { + [data-page="admin-network-firewall-zones"] td[data-name="_info"] label { font-size: 1rem; } - #cbi-wireless-wifi-device .tr { display: flex; flex-wrap: wrap; } - #cbi-wireless-wifi-device .tr > *:nth-child(1) { flex: 1 1 20%; align-self: center; } - #cbi-wireless-wifi-device .tr > *:nth-child(2) { flex: 2 2 75%; } - #cbi-wireless-wifi-device .tr > *:nth-child(3) { flex: 3 3 100%; } + #cbi-wireless-wifi-device tr { display: flex; flex-wrap: wrap; } + #cbi-wireless-wifi-device tr > *:nth-child(1) { flex: 1 1 20%; align-self: center; } + #cbi-wireless-wifi-device tr > *:nth-child(2) { flex: 2 2 75%; } + #cbi-wireless-wifi-device tr > *:nth-child(3) { flex: 3 3 100%; } - #cbi-network-interface .tr { display: flex; flex-wrap: wrap; } - #cbi-network-interface .tr > *:nth-child(1) { flex: 1 1 33%; align-self: center; } - #cbi-network-interface .tr > *:nth-child(2) { flex: 2 2 60%; align-self: center; font-size: .9rem; overflow: hidden; } - #cbi-network-interface .tr > *:nth-child(3) { flex: 3 3 100%; } - #cbi-network-interface .tr > *:nth-child(2) > div { overflow: hidden; text-overflow: ellipsis; } + #cbi-network-interface tr { display: flex; flex-wrap: wrap; } + #cbi-network-interface tr > *:nth-child(1) { flex: 1 1 33%; align-self: center; } + #cbi-network-interface tr > *:nth-child(2) { flex: 2 2 60%; align-self: center; font-size: .9rem; overflow: hidden; } + #cbi-network-interface tr > *:nth-child(3) { flex: 3 3 100%; } + #cbi-network-interface tr > *:nth-child(2) > div { overflow: hidden; text-overflow: ellipsis; } - .assoclist .tr { + .assoclist tr { display: flex; flex-wrap: wrap; } - .assoclist .td > .ifacebadge { + .assoclist td > .ifacebadge { max-width: 90px; } - .assoclist .td > .ifacebadge > img { + .assoclist td > .ifacebadge > img { margin: 0 35px; } - .assoclist .td > .ifacebadge > span { + .assoclist td > .ifacebadge > span { display: none; } - .assoclist .td > .ifacebadge[data-ifname]::after { + .assoclist td > .ifacebadge[data-ifname]::after { content: attr(data-ifname); } - .assoclist .td > .ifacebadge[data-signal]::after { + .assoclist td > .ifacebadge[data-signal]::after { content: attr(data-signal) " dBm"; } - .assoclist .td:nth-of-type(3) { + .assoclist td:nth-of-type(3) { font-weight: bold; font-size: 1rem; } - .assoclist .td:nth-of-type(1), .assoclist .td:nth-of-type(4) { + .assoclist td:nth-of-type(1), .assoclist td:nth-of-type(4) { flex: 1 1 100px; margin-right: .5em; } - .assoclist .td:nth-of-type(3), .assoclist .td:nth-of-type(5) { + .assoclist td:nth-of-type(3), .assoclist td:nth-of-type(5) { flex: 2 2 calc(100% - 110px); overflow: hidden; text-overflow: ellipsis; align-self: center; } - .assoclist .td:nth-of-type(6) { flex: 1; text-align: right !important; } - .assoclist .td[data-title] { padding: .2em 0; } - .assoclist .td[data-title]::before, - .assoclist .td[data-title]::after { display: none; } + .assoclist td:nth-of-type(6) { flex: 1; text-align: right !important; } + .assoclist td[data-title] { padding: .2em 0; } + .assoclist td[data-title]::before, + .assoclist td[data-title]::after { display: none; } - .leases6 .td:nth-of-type(3) { word-wrap: break-word; } + .leases6 td:nth-of-type(3) { word-wrap: break-word; } - .td.cbi-section-actions > div { display: flex; } - .td.cbi-section-actions > div > * { flex: 1; } + td.cbi-section-actions > div { display: flex; } + td.cbi-section-actions > div > * { flex: 1; } body.modal-overlay-active #modal_overlay > .modal { width: 95%; @@ -1919,7 +1937,7 @@ ul.errors { } @media only screen and (min-width: 800px) and (max-width: 1200px) { - .assoclist .tr > *:nth-of-type(2) { + .assoclist tr > *:nth-of-type(2) { display: none; } } diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png deleted file mode 100755 index 7c3f3acb1f0c7c142d0dbd3f42a4926b07f8eb38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535 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 + + + + + + diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png deleted file mode 100755 index f8584ac11a5020cc2dfe049b6b87025ab7c35782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50790 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 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js b/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm deleted file mode 100755 index fb0842df0..000000000 --- a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm +++ /dev/null @@ -1,63 +0,0 @@ -<%# - Copyright 2020 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - local ver = require "luci.version" - - local boardinfo = util.ubus("system", "board") or { } - - local node = disp.context.dispatched - local path = table.concat(disp.context.path, "-") - - http.prepare_content("text/html; charset=UTF-8") --%> - - - - - - - - - - -<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI - - - - - - - - - -
- - -
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and category ~= "failsafe" and path ~= "admin-system-admin-password" then -%> -
-

<%:No password set!%>

-

<%:There is no password set on this router. Please configure a root password to protect the web interface.%>

- <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
- <%- end -%> - - diff --git a/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 b/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 index cd41631de..7c49acfda 100755 --- a/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 +++ b/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 @@ -4,6 +4,7 @@ if [ "$PKG_UPGRADE" != 1 ]; then uci get luci.themes.OpenWrt2020 >/dev/null 2>&1 || \ uci batch <<-EOF set luci.themes.OpenWrt2020=/luci-static/openwrt2020 + set luci.main.mediaurlbase=/luci-static/openwrt2020 commit luci EOF fi diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm b/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut old mode 100755 new mode 100644 similarity index 67% rename from luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm rename to luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut index e9122f0b5..5899f2a9d --- a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm +++ b/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut @@ -1,14 +1,13 @@ -<%# +{# Copyright 2020 Jo-Philipp Wich Licensed to the public under the Apache License 2.0. --%> +-#}

- <% local ver = require "luci.version" -%> - Powered by <%= ver.luciname %> (<%= ver.luciversion %>) + Powered by {{ version.luciname }} ({{ version.luciversion }})

diff --git a/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut b/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut new file mode 100644 index 000000000..2b7c58138 --- /dev/null +++ b/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut @@ -0,0 +1,72 @@ +{# + Copyright 2020 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + import { getuid, getspnam } from 'luci.core'; + + const boardinfo = ubus.call('system', 'board'); + + http.prepare_content('text/html; charset=UTF-8'); +-%} + + + + + + + + + + + + + +{{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI +{% if (css): %} + +{% endif %} + + + + + + + + + +
+ + +
+ {% if (getuid() == 0 && getspnam('root')?.pwdp === '' && join('-', ctx.request_path) != 'admin-system-admin'): %} +
+

{{ _('No password set!') }}

+

{{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

+ {% if (dispatcher.lookup("admin/system/admin")): %} + + {% endif %} +
+ {% endif %} + + {% if (boardinfo.rootfs_type == "initramfs"): %} +
+

{{ _('System running in recovery (initramfs) mode.') }}

+

{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

+ {% if (dispatcher.lookup("admin/system/flash")): %} + + {% endif %} +
+ {% endif %} + + diff --git a/msmtp/Makefile b/msmtp/Makefile old mode 100755 new mode 100644 index d4588bbcf..e953eb4e5 --- a/msmtp/Makefile +++ b/msmtp/Makefile @@ -1,7 +1,6 @@ # # Copyright (C) 2009 David Cooper # Copyright (C) 2009-2016 OpenWrt.org -# Copyright (C) 2021 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -10,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=msmtp -PKG_VERSION:=1.8.14 -PKG_RELEASE:=2 +PKG_VERSION:=1.8.19 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://marlam.de/msmtp/releases -PKG_HASH:=d56f065d711486e9c234618515a02a48a48dab4051b34f3e108fbecb6fb773b4 +PKG_HASH:=34a1e1981176874dbe4ee66ee0d9103c90989aa4dcdc4861e4de05ce7e44526b PKG_MAINTAINER:= PKG_LICENSE:=GPL-3.0-or-later @@ -109,7 +108,7 @@ CONFIGURE_ARGS += \ --without-msmtpd ifeq ($(BUILD_VARIANT),ssl) - CONFIGURE_ARGS += --with-tls=openssl + CONFIGURE_ARGS += --with-tls=gnutls else CONFIGURE_ARGS += --without-tls endif diff --git a/net-tools/Makefile b/net-tools/Makefile old mode 100755 new mode 100644 index 6336c57e5..e620d4e2a --- a/net-tools/Makefile +++ b/net-tools/Makefile @@ -1,7 +1,6 @@ # # Copyright (C) 2006-2010 OpenWrt.org # Copyright (C) 2016 Stijn Segers -# Copyright (C) 2020 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -10,15 +9,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=net-tools -PKG_SOURCE_DATE:=2018-11-03 -PKG_SOURCE_VERSION:=0eebece8c964e3cfa8a018f42b2e7e751a7009a0 -PKG_RELEASE:=2 +PKG_VERSION:=2.10 +PKG_RELEASE:=1 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://git.code.sf.net/p/net-tools/code -PKG_MIRROR_HASH:=9d978b9f8ccae4af623a299155c62d9b3d31213182c785f925bf8704d48a04c9 +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://sourceforge.net/projects/net-tools/files/ +PKG_HASH:=b262435a5241e89bfa51c3cabd5133753952f7a7b7b93f32e08cb9d96f580d69 -PKG_MAINTAINER:=Yannick Chabanois +PKG_MAINTAINER:=Stijn Segers PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=COPYING diff --git a/net-tools/patches/mptcp-support.patch b/net-tools/patches/mptcp-support.patch deleted file mode 100755 index b9f69d0f8..000000000 --- a/net-tools/patches/mptcp-support.patch +++ /dev/null @@ -1,338 +0,0 @@ -diff -aurN net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/lib/pathnames.h net-tools-mptcp_v0.95/lib/pathnames.h ---- net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/lib/pathnames.h 2018-11-03 14:23:32.000000000 +0100 -+++ net-tools-mptcp_v0.95/lib/pathnames.h 2019-06-22 22:52:42.000000000 +0200 -@@ -14,6 +14,7 @@ - #define _PATH_PROCNET_IGMP6 "/proc/net/igmp6" - #define _PATH_PROCNET_TCP "/proc/net/tcp" - #define _PATH_PROCNET_TCP6 "/proc/net/tcp6" -+#define _PATH_PROCNET_MPTCP "/proc/net/mptcp_net/mptcp" - #define _PATH_PROCNET_UDP "/proc/net/udp" - #define _PATH_PROCNET_UDP6 "/proc/net/udp6" - #define _PATH_PROCNET_UDPLITE "/proc/net/udplite" -diff -aurN net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/netstat.c net-tools-mptcp_v0.95/netstat.c ---- net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/netstat.c 2018-11-03 14:23:32.000000000 +0100 -+++ net-tools-mptcp_v0.95/netstat.c 2019-06-22 22:52:42.000000000 +0200 -@@ -115,7 +115,7 @@ - #endif - - /* prototypes for statistics.c */ --void parsesnmp(int, int, int, int); -+void parsesnmp(int, int, int, int, int); - void parsesnmp6(int, int, int); - - typedef enum { -@@ -155,6 +155,7 @@ - int flag_opt = 0; - int flag_raw = 0; - int flag_tcp = 0; -+int flag_mptcp = 0; - int flag_sctp= 0; - int flag_udp = 0; - int flag_udplite = 0; -@@ -1206,6 +1207,83 @@ - tcp_do_one, "tcp", "tcp6"); - } - -+static void mptcp_do_one(int lnr, const char *line, const char *prot) -+{ -+ int d, ipv6, num, local_port, rem_port, state, nsub; -+ unsigned long txq, rxq, local_token, remote_token, inode; -+ char rem_addr[128], local_addr[128]; -+ struct sockaddr_storage localsas, remsas; -+ struct sockaddr_in *localaddr = (struct sockaddr_in *)&localsas; -+ struct sockaddr_in *remaddr = (struct sockaddr_in *)&remsas; -+ const struct aftype *ap; -+#if HAVE_AFINET6 -+ char addr6[INET6_ADDRSTRLEN]; -+ struct in6_addr in6; -+ extern struct aftype inet6_aftype; -+#endif -+ -+ if (lnr == 0) -+ return; -+ -+ num = sscanf(line, "%d: %lX %lX %d %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X " -+ "%X %X %lX:%lX %lu\n", &d, &local_token, &remote_token, -+ &ipv6, local_addr, &local_port, rem_addr, &rem_port, -+ &state, &nsub, &txq, &rxq, &inode); -+ -+ if (strlen(local_addr) > 8) { -+#if HAVE_AFINET6 -+ /* Demangle what the kernel gives us */ -+ sscanf(local_addr, "%08X%08X%08X%08X", -+ &in6.s6_addr32[0], &in6.s6_addr32[1], -+ &in6.s6_addr32[2], &in6.s6_addr32[3]); -+ inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6)); -+ inet6_aftype.input(1, addr6, &localsas); -+ sscanf(rem_addr, "%08X%08X%08X%08X", -+ &in6.s6_addr32[0], &in6.s6_addr32[1], -+ &in6.s6_addr32[2], &in6.s6_addr32[3]); -+ inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6)); -+ inet6_aftype.input(1, addr6, &remsas); -+ localsas.ss_family = AF_INET6; -+ remsas.ss_family = AF_INET6; -+#endif -+ } else { -+ sscanf(local_addr, "%X", -+ &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr); -+ sscanf(rem_addr, "%X", -+ &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr); -+ localsas.ss_family = AF_INET; -+ remsas.ss_family = AF_INET; -+ } -+ -+ if (num < 12) { -+ fprintf(stderr, _("warning, got bogus mptcp line.\n")); -+ return; -+ } -+ -+ if ((ap = get_afntype(localsas.ss_family)) == NULL) { -+ fprintf(stderr, _("netstat: unsupported address family %d !\n"), -+ localsas.ss_family); -+ return; -+ } -+ -+ addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localsas, local_port, "tcp"); -+ addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remsas, rem_port, "tcp"); -+ -+ printf("%-4s %6ld %6ld %-*s %-*s %-11s", -+ prot, rxq, txq, (int)netmax(23,strlen(local_addr)), local_addr, -+ (int)netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state])); -+ -+ if (flag_mptcp) -+ printf(" %-11lu %-12lu", local_token, remote_token); -+ -+ finish_this_one(0, inode, NULL); -+} -+ -+static int mptcp_info(void) -+{ -+ INFO_GUTS(_PATH_PROCNET_MPTCP, "AF INET (mptcp)", mptcp_do_one, "mptcp"); -+} -+ - static int notnull(const struct sockaddr_storage *sas) - { - const struct sockaddr_in *sin = (const struct sockaddr_in *)sas; -@@ -1994,7 +2072,7 @@ - fprintf(fp, _(" -Z, --context display SELinux security context for sockets\n")); - #endif - -- fprintf(fp, _("\n ={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}\n")); -+ fprintf(fp, _("\n ={-t|--tcp} {-m|--mptcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}\n")); - fprintf(fp, _(" {-x|--unix} --ax25 --ipx --netrom\n")); - fprintf(fp, _(" =Use '-6|-4' or '-A ' or '--'; default: %s\n"), DFLT_AF); - fprintf(fp, _(" List of possible address families (which support routing):\n")); -@@ -2019,6 +2097,7 @@ - #endif - {"protocol", 1, 0, 'A'}, - {"tcp", 0, 0, 't'}, -+ {"mptcp", 0, 0, 'm'}, - {"sctp", 0, 0, 'S'}, - {"udp", 0, 0, 'u'}, - {"udplite", 0, 0, 'U'}, -@@ -2055,7 +2134,7 @@ - getroute_init(); /* Set up AF routing support */ - - afname[0] = '\0'; -- while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStuUvVWw2fx64?Z", longopts, &lop)) != EOF) -+ while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStmuUvVWw2fx64?Z", longopts, &lop)) != EOF) - switch (i) { - case -1: - break; -@@ -2146,6 +2225,9 @@ - case 't': - flag_tcp++; - break; -+ case 'm': -+ flag_mptcp++; -+ break; - case 'S': - flag_sctp++; - break; -@@ -2194,17 +2276,17 @@ - usage(E_OPTERR); - - if ((flag_inet || flag_inet6 || flag_sta) && -- !(flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw)) -- flag_noprot = flag_tcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; -+ !(flag_tcp || flag_sctp || flag_mptcp || flag_udp || flag_udplite || flag_raw)) -+ flag_noprot = flag_tcp = flag_mptcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; - -- if ((flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw || flag_igmp) && -+ if ((flag_tcp || flag_sctp || flag_mptcp || flag_udp || flag_udplite || flag_raw || flag_igmp) && - !(flag_inet || flag_inet6)) - flag_inet = flag_inet6 = 1; - - if (flag_bluetooth && !(flag_l2cap || flag_rfcomm)) - flag_l2cap = flag_rfcomm = 1; - -- flag_arg = flag_tcp + flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx -+ flag_arg = flag_tcp + flag_mptcp +flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx - + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose - + flag_l2cap + flag_rfcomm; - -@@ -2234,7 +2316,7 @@ - - if (!strcmp(afname, "inet")) { - #if HAVE_AFINET -- parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp); -+ parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp, flag_mptcp); - #else - ENOSUPP("netstat", "AF INET"); - #endif -@@ -2284,7 +2366,7 @@ - return (i); - } - for (;;) { -- if (!flag_arg || flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw) { -+ if (!flag_arg || flag_tcp || flag_mptcp || flag_sctp || flag_udp || flag_udplite || flag_raw) { - #if HAVE_AFINET - prg_cache_load(); - printf(_("Active Internet connections ")); /* xxx */ -@@ -2298,6 +2380,8 @@ - printf(_("(w/o servers)")); - } - printf(_("\nProto Recv-Q Send-Q Local Address Foreign Address State ")); /* xxx */ -+ if (flag_mptcp) -+ printf(_(" Local Token Remote Token ")); - if (flag_exp > 1) - printf(_(" User Inode ")); - print_progname_banner(); -@@ -2318,6 +2402,12 @@ - if (i) - return (i); - } -+ -+ if (!flag_arg || flag_mptcp) { -+ i = mptcp_info(); -+ if (i) -+ return (i); -+ } - - if (!flag_arg || flag_sctp) { - i = sctp_info(); -diff -aurN net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/statistics.c net-tools-mptcp_v0.95/statistics.c ---- net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/statistics.c 2018-11-03 14:23:32.000000000 +0100 -+++ net-tools-mptcp_v0.95/statistics.c 2019-06-22 22:52:42.000000000 +0200 -@@ -13,7 +13,7 @@ - #include "intl.h" - #include "proc.h" - --static int print_static,f_raw,f_tcp,f_udp,f_sctp,f_unknown = 1; -+static int print_static,f_raw,f_tcp,f_udp,f_sctp,f_mptcp,f_unknown = 1; - - enum State { - number = 0, opt_number, i_forward, i_inp_icmp, i_outp_icmp, i_rto_alg, -@@ -295,6 +295,51 @@ - {"SctpShutdowns", N_("%llu Number of Graceful Terminations"), number}, - }; - -+static const struct entry Mptcptab[] = -+{ /* Keep the entries sorted! */ -+ {"AddAddrRx", N_("%llu Number of ADD_ADDRs received"), number}, -+ {"AddAddrTx", N_("%llu Number of ADD_ADDRs sent"), number}, -+ {"DSSNoMatchTCP", N_("%llu Number of DSS-mapping/TCP sequence number mismatches"), number}, -+ {"DSSNotMatching", N_("%llu Number of new mismatched mappings"), number}, -+ {"DSSPurgeOldSubSegs", N_("%llu Number of skbs removed from the rcv-queue due to missing DSS-mapping"), number}, -+ {"DSSSplitTail", N_("%llu Number of trimmed segments at the tail"), number}, -+ {"DSSTrimHead", N_("%llu Number of trimmed segments at the head"), number}, -+ {"InfiniteMapRx", N_("%llu Number of infinite mappings received"), number}, -+ {"MPCapableACKRX", N_("%llu Number of received third ACKs with MP_CAPABLE"), number}, -+ {"MPCapableFallbackACK", N_("%llu Number of server-side fallbacks during the 3-way handshake"), number}, -+ {"MPCapableFallbackSYNACK", N_("%llu Number of client-side fallbacks during the 3-way handshake"), number}, -+ {"MPCapableRetransFallback", N_("%llu Number of times the client-side stopped sending MP_CAPABLE after too many SYN-retransmissions"), -+ number}, -+ {"MPCapableSYNACKRX", N_("%llu Number of received SYN/ACKs with MP_CAPABLE"), number}, -+ {"MPCapableSYNRX", N_("%llu Number of received SYNs with MP_CAPABLE"), number}, -+ {"MPCapableSYNTX", N_("%llu Number of sent SYNs with MP_CAPABLE"), number}, -+ {"MPCsumFail", N_("%llu Number of received segments with an invalid checksum"), number}, -+ {"MPFailRX", N_("%llu Number of MP_FAILs received"), number}, -+ {"MPFallbackAckInit", N_("%llu Number of fallbacks upon ack without data-ack on initial subflow"), number}, -+ {"MPFallbackAckSub", N_("%llu Number of fallbacks upon ack without data-ack on new subflow"), number}, -+ {"MPFallbackDataInit", N_("%llu Number of fallbacks upon data without DSS at the beginning on initial subflow"), number}, -+ {"MPFallbackDataSub", N_("%llu Number of fallbacks upon data without DSS at the beginning on new subflow"), number}, -+ {"MPFastcloseRX", N_("%llu Number of FAST_CLOSEs received"), number}, -+ {"MPFastcloseTX", N_("%llu Number of FAST_CLOSEs sent"), number}, -+ {"MPJoinAckHMacFailure", N_("%llu Number of HMAC mismatches on ACK + MP_JOIN"), number}, -+ {"MPJoinAckMissing", N_("%llu Number of third ACKs on a new subflow not containing a MP_JOIN"), number}, -+ {"MPJoinAckRTO", N_("%llu Number of retransmission timeouts for third ACK + MP_JOIN"), number}, -+ {"MPJoinAckRexmit", N_("%llu Number of retransmitted ACK + MP_JOINs"), number}, -+ {"MPJoinAckRx", N_("%llu Number of ACK + MP_JOINs received"), number}, -+ {"MPJoinAlreadyFallenback", N_("%llu Number of received MP_JOINs on a session that has fallen back to reg. TCP"), number}, -+ {"MPJoinNoTokenFound", N_("%llu Number of received MP_JOINs without a token"), number}, -+ {"MPJoinSynAckHMacFailure", N_("%llu Number of received SYN/ACK + MP_JOINs with a HMAC mismatch"), number}, -+ {"MPJoinSynAckRx", N_("%llu Number of SYN/ACK + MP_JOINs received"), number}, -+ {"MPJoinSynRx", N_("%llu Number of SYN + MP_JOINs received"), number}, -+ {"MPJoinSynTx", N_("%llu Number of SYN + MP_JOINs sent"), number}, -+ {"MPRemoveAddrSubDelete", N_("%llu Number of subflows removed due to REMOVE_ADDR"), number}, -+ {"MPTCPCsumEnabled", N_("%llu Number of MPTCP connections created with DSS-checksum enabled"), number}, -+ {"MPTCPRetrans", N_("%llu Number of segments retransmitted at the MPTCP level"), number}, -+ {"NoDSSInWindow", N_("%llu Number of too many packets received without a DSS option errors"), number}, -+ {"RemAddrRx", N_("%llu Number of REMOVE_ADDRs received"), number}, -+ {"RemAddrTx", N_("%llu Number of REMOVE_ADDRs sent"), number}, -+}; -+ - struct tabtab { - const char *title; - const struct entry *tab; -@@ -310,6 +355,7 @@ - {"Udp", Udptab, sizeof(Udptab), &f_udp}, - {"Sctp", Sctptab, sizeof(Sctptab), &f_sctp}, - {"TcpExt", Tcpexttab, sizeof(Tcpexttab), &f_tcp}, -+ {"Mptcp", Mptcptab, sizeof(Mptcptab), &f_mptcp}, - {NULL} - }; - -@@ -503,13 +549,13 @@ - } - - /* Process a file with name-value lines (like /proc/net/sctp/snmp) */ --static void process_fd2(FILE *f, const char *filename) -+static void process_fd2(FILE *f, const char *filename, const char *tablename) - { - char buf1[1024]; - char *sp; - const struct tabtab *tab; - -- tab = newtable(snmptabs, "Sctp"); -+ tab = newtable(snmptabs, tablename); - - while (fgets(buf1, sizeof buf1, f)) { - sp = buf1 + strcspn(buf1, " \t\n"); -@@ -527,11 +573,11 @@ - } - } - --void parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp) -+void parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp, int flag_mptcp) - { - FILE *f; - -- f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; f_sctp = flag_sctp; -+ f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; f_sctp = flag_sctp; f_mptcp = flag_mptcp; - - f = proc_fopen("/proc/net/snmp"); - if (!f) { -@@ -561,12 +607,21 @@ - - f = proc_fopen("/proc/net/sctp/snmp"); - if (f) { -- process_fd2(f,"/proc/net/sctp/snmp"); -+ process_fd2(f,"/proc/net/sctp/snmp", "Sctp"); - if (ferror(f)) { - perror("/proc/net/sctp/snmp"); - fclose(f); - } - } -+ -+ f = proc_fopen("/proc/net/mptcp_net/snmp"); -+ if (f) { -+ process_fd2(f,"/proc/net/mptcp_net/snmp", "Mptcp"); -+ if (ferror(f)) { -+ perror("/proc/net/mptcp_net/snmp"); -+ fclose(f); -+ } -+ } - } - - void parsesnmp6(int flag_raw, int flag_tcp, int flag_udp) diff --git a/netifd/Makefile b/netifd/Makefile old mode 100755 new mode 100644 index 4b5f110da..31fd0838a --- a/netifd/Makefile +++ b/netifd/Makefile @@ -5,15 +5,15 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git -PKG_SOURCE_DATE:=2021-07-26 -PKG_SOURCE_VERSION:=440eb0647708274cc8d7d9e7c2bb0cfdfba90023 -PKG_MIRROR_HASH:=eed957036ab608fdc49bdf801fc5b4405fcd2a3a5e5d3343ec39898e156c10e9 +PKG_SOURCE_DATE:=2023-06-04 +PKG_SOURCE_VERSION:=ec9dba72124597b7224bbfe75960386dc320f4bd +PKG_MIRROR_HASH:=baee39a3882a2b03fc83a3a6a8963c340fa8d884c7a8c9e80e7d2dddc50e24bd PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= -PKG_BUILD_PARALLEL:=1 +PKG_BUILD_FLAGS:=lto include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -32,10 +32,7 @@ endef TARGET_CFLAGS += \ -I$(STAGING_DIR)/usr/include/libnl-tiny \ - -I$(STAGING_DIR)/usr/include \ - -flto - -TARGET_LDFLAGS += -flto -fuse-linker-plugin + -I$(STAGING_DIR)/usr/include CMAKE_OPTIONS += \ -DLIBNL_LIBS=-lnl-tiny \ diff --git a/netifd/files/etc/hotplug.d/iface/00-netstate b/netifd/files/etc/hotplug.d/iface/00-netstate old mode 100755 new mode 100644 diff --git a/netifd/files/etc/init.d/packet_steering b/netifd/files/etc/init.d/packet_steering new file mode 100755 index 000000000..9d8f791e2 --- /dev/null +++ b/netifd/files/etc/init.d/packet_steering @@ -0,0 +1,18 @@ +#!/bin/sh /etc/rc.common + +START=25 +USE_PROCD=1 + +start_service() { + reload_service +} + +service_triggers() { + procd_add_reload_trigger "network" + procd_add_reload_trigger "firewall" + procd_add_raw_trigger "interface.*" 1000 /etc/init.d/packet_steering reload +} + +reload_service() { + /usr/libexec/network/packet-steering.sh +} diff --git a/netifd/files/etc/uci-defaults/14_migrate-dhcp-release b/netifd/files/etc/uci-defaults/14_migrate-dhcp-release old mode 100755 new mode 100644 diff --git a/netifd/files/etc/udhcpc.user b/netifd/files/etc/udhcpc.user old mode 100755 new mode 100644 diff --git a/netifd/files/lib/netifd/dhcp.script b/netifd/files/lib/netifd/dhcp.script index c857c9fc0..6fcf139be 100755 --- a/netifd/files/lib/netifd/dhcp.script +++ b/netifd/files/lib/netifd/dhcp.script @@ -13,7 +13,7 @@ set_classless_routes() { done } -setup_interface() { +setup_interface () { proto_init_update "*" 1 proto_add_ipv4_address "$ip" "${subnet:-255.255.255.0}" # TODO: apply $broadcast @@ -27,7 +27,6 @@ setup_interface() { eval "$(ipcalc.sh "$i/$mask")";gw_net="$NETWORK" [ "$ip_net" != "$gw_net" ] && proto_add_ipv4_route "$i" 32 "" "$ip" - #[ "$DEFAULTROUTE" = 0 ] || proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip" proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip" local r @@ -61,6 +60,7 @@ setup_interface() { [ -n "$message" ] && json_add_string message "$message" [ -n "$timezone" ] && json_add_int timezone "$timezone" [ -n "$lease" ] && json_add_int leasetime "$lease" + [ -n "$serverid" ] && json_add_string dhcpserver "$serverid" proto_close_data proto_send_update "$INTERFACE" diff --git a/netifd/files/lib/netifd/proto/dhcp.sh b/netifd/files/lib/netifd/proto/dhcp.sh index 8db848260..636b4654f 100755 --- a/netifd/files/lib/netifd/proto/dhcp.sh +++ b/netifd/files/lib/netifd/proto/dhcp.sh @@ -1,6 +1,6 @@ #!/bin/sh -[ -L /sbin/udhcpc ] || exit 0 +[ -x /sbin/udhcpc ] || exit 0 . /lib/functions.sh . ../netifd-proto.sh @@ -35,8 +35,8 @@ proto_dhcp_setup() { local config="$1" local iface="$2" - local ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes classlessroute defaultroute - json_get_vars ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd delegate zone6rd zone mtu6rd customroutes classlessroute defaultroute + local ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes classlessroute + json_get_vars ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd delegate zone6rd zone mtu6rd customroutes classlessroute local opt dhcpopts for opt in $reqopts; do @@ -58,7 +58,6 @@ proto_dhcp_setup() { [ -n "$zone" ] && proto_export "ZONE=$zone" [ -n "$mtu6rd" ] && proto_export "MTU6RD=$mtu6rd" [ -n "$customroutes" ] && proto_export "CUSTOMROUTES=$customroutes" - [ -n "$defaultroute" ] && proto_export "DEFAULTROUTE=$defaultroute" [ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0" # Request classless route option (see RFC 3442) by default [ "$classlessroute" = "0" ] || append dhcpopts "-O 121" @@ -68,7 +67,7 @@ proto_dhcp_setup() { -p /var/run/udhcpc-$iface.pid \ -s /lib/netifd/dhcp.script \ -f -t 0 -i "$iface" \ - ${ipaddr:+-r $ipaddr} \ + ${ipaddr:+-r ${ipaddr/\/*/}} \ ${hostname:+-x "hostname:$hostname"} \ ${vendorid:+-V "$vendorid"} \ $clientid $defaultreqopts $broadcast $norelease $dhcpopts diff --git a/netifd/files/etc/hotplug.d/net/20-smp-packet-steering b/netifd/files/usr/libexec/network/packet-steering.sh similarity index 92% rename from netifd/files/etc/hotplug.d/net/20-smp-packet-steering rename to netifd/files/usr/libexec/network/packet-steering.sh index 8a86bf75f..799c08080 100755 --- a/netifd/files/etc/hotplug.d/net/20-smp-packet-steering +++ b/netifd/files/usr/libexec/network/packet-steering.sh @@ -1,6 +1,4 @@ #!/bin/sh -[ "$ACTION" = add ] || exit - NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)" [ "$NPROCS" -gt 1 ] || exit @@ -40,6 +38,11 @@ packet_steering="$(uci get "network.@globals[0].packet_steering")" exec 512>/var/lock/smp_tune.lock flock 512 || exit 1 +[ -e "/usr/libexec/platform/packet-steering.sh" ] && { + /usr/libexec/platform/packet-steering.sh + exit 0 +} + for dev in /sys/class/net/*; do [ -d "$dev" ] || continue diff --git a/netmaker-openwrt/LICENSE b/netmaker-openwrt/LICENSE deleted file mode 100755 index 472ac2361..000000000 --- a/netmaker-openwrt/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -MIT License -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/netmaker-openwrt/README.md b/netmaker-openwrt/README.md deleted file mode 100755 index 60b189cce..000000000 --- a/netmaker-openwrt/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Netmaker-OpenWRT - -[Netmaker](https://github.com/gravitl/netmaker) is a platform for creating and managing fast, secure, and dynamic virtual overlay networks using WireGuard. This project offers OpenWRT packages for Netmaker. - -## Installing package - -Download the prebuild package and copy it onto your OpenWRT installation, preferably into the `/tmp` folder. - -Then install the ipk package file: - -```bash -opkg install netmaker_*.ipk -``` - -Now start `netclient` of Netmaker: - -```bash -/etc/init.d/netclient start -``` - -## Compiling from Sources - -To include Netmaker into your OpenWRT image or to create an `.ipk` package (equivalent to Debians .deb files), you have to build an OpenWRT image. - -Now prepare OpenWRT: - -```bash -git clone https://github.com/openwrt/openwrt -cd openwrt - -./scripts/feeds update -a -./scripts/feeds install -a -``` - -To build Netmaker for OpenWRT, you need to have Golang with OpenWRT build envirment. Then, you can insert the Netmaker package using a package feed or add the package manually. - -### Add package by feed - -A feed is the standard way packages are made available to the OpenWRT build system. - -Put this line in your feeds list file (e.g. feeds.conf.default) - -```bash -src-git netmaker http://github.com/sbilly/netmaker-openwrt.git -``` - -Update and install the new feed - -```bash -./scripts/feeds update netmaker -./scripts/feeds install netmaker -``` - -Now continue with the building packages section. - -## Building Packages - -Configure packages: - -```bash -make menuconfig -``` - -Now select the appropiate "Target System" and "Target Profile" depending on what target chipset/router you want to build for. Also mark the Netmaker package under `Network ---> VPN ---> <*> netmaker`. - -Now compile/build everything: - -```bash -make -``` - -The images and all *.ipk packages are now inside the bin/ folder, including the netmaker package. You can install the Netmaker .ipk on the target device using opkg install . - -For details please check the OpenWRT documentation. - -## Build bulk packages - -For a release, it is useful the build packages at a bulk for multiple targets: - -```shell -#!/bin/sh - -# dump-target-info.pl is used to get all targets configurations: -# https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob;f=scripts/dump-target-info.pl - -./scripts/dump-target-info.pl architectures | while read pkgarch target1 rest; do - echo "CONFIG_TARGET_${target1%/*}=y" > .config - echo "CONFIG_TARGET_${target1%/*}_${target1#*/}=y" >> .config - echo "CONFIG_PACKAGE_example1=y" >> .config - - # Debug output - echo "pkgarch: $pkgarch, target1: $target1" - - make defconfig - make -j4 tools/install - make -j4 toolchain/install - - # Build package - make package/netmaker/{clean,compile} - - # Free space (optional) - rm -rf build_dir/target-* - rm -rf build_dir/toolchain-* -done -``` - -## Thanks - -- [netmaker](https://github.com/gravitl/netmaker) -- [zerotier-openwrt](https://github.com/mwarning/zerotier-openwrt) -- [openwrt-golang-package-test-feed](https://github.com/jefferyto/openwrt-golang-package-test-feed) diff --git a/netmaker-openwrt/netmaker/Makefile b/netmaker-openwrt/netmaker/Makefile deleted file mode 100755 index 903dd2beb..000000000 --- a/netmaker-openwrt/netmaker/Makefile +++ /dev/null @@ -1,93 +0,0 @@ -# -# Copyright (C) 2019 sbilly -# -# This is free software, licensed under the MIT License. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=netmaker -PKG_VERSION:=0.9.4 -PKG_RELEASE:=1 - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://github.com/gravitl/netmaker.git -PKG_SOURCE_VERSION:=e9bce264719f88c30e252ecc754d08f422f4c080 -PKG_SOURCE_DATE:=20220117 -PKG_MIRROR_HASH:=skip - -PKG_LICENSE:=MIT -PKG_LICENSE_FILES:=LICENSE -PKG_MAINTAINER:=sbilly - -PKG_BUILD_DEPENDS:=golang/host -PKG_BUILD_PARALLEL:=1 -PKG_USE_MIPS16:=0 - -GO_PKG:=github.com/gravitl/netmaker -GO_PKG_INSTALL_EXTRA:=extra/file extra/dir -GO_PKG_EXCLUDES:=excluded -GO_PKG_LDFLAGS:=-s -w - -include $(INCLUDE_DIR)/package.mk -include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk - -define Package/netmaker -$(call Package/netmaker/Default) -$(call GoPackage/GoSubMenu) - SECTION:=net - CATEGORY:=Network - SUBMENU:=VPN -endef - -define Package/netmaker/Default - TITLE:=Netmaker for OpenWRT - URL:=https://github.com/gravitl/netmaker - DEPENDS:=$(GO_ARCH_DEPENDS) - MAINTAINER:=sbilly -endef - -define Package/netmaker/Default/description -Netmaker is a platform for creating and managing fast, secure, and -dynamic virtual overlay networks using WireGuard. This project offers -OpenWRT packages for Netmaker. -endef - -define Package/netmaker/description -$(call Package/netmaker/Default/description) - -This package contains the binaries. -endef - -define Package/netmaker-dev - TITLE+= (source files) - SECTION:=net - CATEGORY:=Network - SUBMENU:=VPN - PKGARCH:=all -endef - -define Package/netmaker-dev/description -$(call Package/netmaker/Default/description) - -This package provides the source files. -endef - -define Package/netmaker/install - $(INSTALL_DIR) $(1)/etc/netclient/ - $(INSTALL_DIR) $(1)/etc/netclient/config - $(INSTALL_DIR) $(1)/etc/systemd/ - $(INSTALL_DIR) $(1)/etc/systemd/system - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/netmaker $(1)/usr/bin/ - $(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/netclient $(1)/usr/bin/ - $(CP) ./root/* $(1)/ - $(LN) netclient $(1)/etc/netclient/netclient -endef - -$(eval $(call GoBinPackage,netmaker)) -$(eval $(call BuildPackage,netmaker)) - -$(eval $(call GoSrcPackage,netmaker-dev)) -$(eval $(call BuildPackage,netmaker-dev)) diff --git a/netmaker-openwrt/netmaker/root/etc/init.d/netclient b/netmaker-openwrt/netmaker/root/etc/init.d/netclient deleted file mode 100755 index c04977f24..000000000 --- a/netmaker-openwrt/netmaker/root/etc/init.d/netclient +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh /etc/rc.common -#Created by oycol - -EXTRA_COMMANDS="status" -EXTRA_HELP=" status Check service is running" -START=99 - -LOG_FILE="/tmp/netclient.logs" - -start() { - mkdir -p /etc/netclient/config - mkdir -p /etc/systemd/system - - if [ ! -f "${LOG_FILE}" ];then - touch "${LOG_FILE}" - fi - local PID=$(ps|grep "netclient checkin -n all"|grep -v grep|awk '{print $1}') - if [ "${PID}" ];then - echo "service is running" - return - fi - /bin/sh -c "while [ 1 ]; do netclient checkin -n all >> ${LOG_FILE} 2>&1;sleep 15;\ - if [ $(ls -l ${LOG_FILE}|awk '{print $5}') -gt 10240000 ];then tar zcf "${LOG_FILE}.tar" -C / "tmp/netclient.logs" && > $LOG_FILE;fi;done &" - echo "start" -} - -stop() { - local PID=$(ps|grep "netclient checkin -n all"|grep -v grep|awk '{print $1}') - if [ "${PID}" ];then - kill "${PID}" - fi - echo "stop" -} - -status() { - local PID=$(ps|grep "netclient checkin -n all"|grep -v grep|awk '{print $1}') - if [ "${PID}" ];then - echo -e "netclient[${PID}] is running \n" - else - echo -e "netclient is not running \n" - fi -} diff --git a/netmaker-openwrt/scripts/build_ipk.sh b/netmaker-openwrt/scripts/build_ipk.sh deleted file mode 100755 index 1ee25de06..000000000 --- a/netmaker-openwrt/scripts/build_ipk.sh +++ /dev/null @@ -1,177 +0,0 @@ -#!/bin/bash - -# setting working directory -WORK_DIR="/home/user" - -# setting branch -if [ "${OPENWRT_BRANCH}" = "" ] -then - DEFAULT_OPENWRT_BRANCH="openwrt-21.02" -else - DEFAULT_OPENWRT_BRANCH="${OPENWRT_BRANCH}" -fi - -download_openwrt() { - cd ${WORK_DIR} - - # pull code - if [ ! -d "openwrt" ]; then - git clone https://git.openwrt.org/openwrt/openwrt.git - fi -} - -change_openwrt_branch() { - cd ${WORK_DIR}/openwrt - - if [ "${1}" = "" ] - then - echo "Building ${DEFAULT_OPENWRT_BRANCH}" - git checkout -B ${DEFAULT_OPENWRT_BRANCH} origin/${DEFAULT_OPENWRT_BRANCH} - else - echo "Building ${1}" - git checkout -B ${1} origin/${1} - fi -} - -init_openwrt_branch() { - cd ${WORK_DIR}/openwrt - - git stash - git pull --all - git pull --tags -} - -init_openwrt_link() { - cd ${WORK_DIR}/openwrt - - sudo chown 1000:1000 /src -R - - mkdir -p /src/dl - mkdir -p /src/staging_dir - mkdir -p /src/build_dir - mkdir -p /src/tmp - mkdir -p /src/bin - - ln -s /src/dl ${WORK_DIR}/openwrt/dl - ln -s /src/staging_dir ${WORK_DIR}/openwrt/staging_dir - ln -s /src/build_dir ${WORK_DIR}/openwrt/build_dir - ln -s /src/tmp ${WORK_DIR}/openwrt/tmp -} - -update_install_openwrt_feeds() { - cd ${WORK_DIR}/openwrt - - ./scripts/feeds update -a - ./scripts/feeds install -a -} - -openwrt_init_config() { - cd ${WORK_DIR}/openwrt - - echo "CONFIG_TARGET_x86=y" > ${WORK_DIR}/openwrt/.config - echo "CONFIG_TARGET_x86_64=y" >> ${WORK_DIR}/openwrt/.config -} - -openwrt_make_build_env() { - cd ${WORK_DIR}/openwrt - - make defconfig - make -j4 download - make -j4 tools/install - make -j4 toolchain/install -} - -openwrt_make() { - cd ${WORK_DIR}/openwrt - - make -j4 -} - -openwrt_install_netmaker_feeds() { - cd ${WORK_DIR}/openwrt - - echo "src-git netmaker http://github.com/sbilly/netmaker-openwrt.git" >> feeds.conf.default - - ./scripts/feeds update netmaker - ./scripts/feeds install netmaker -} - -openwrt_install_package_netmaker_config() { - cd ${WORK_DIR}/openwrt - - echo "CONFIG_FEED_netmaker=y" >> ${WORK_DIR}/openwrt/.config - echo "CONFIG_PACKAGE_netmaker=m" >> ${WORK_DIR}/openwrt/.config - echo "CONFIG_PACKAGE_netmaker-dev=m" >> ${WORK_DIR}/openwrt/.config -} - - -openwrt_patch_golang_host() { - cd ${WORK_DIR}/openwrt - echo "patching ${1}" - - if [ "${1}" = "openwrt-19.07" ] - then - sed -i 's/5fb43171046cf8784325e67913d55f88a683435071eef8e9da1aa8a1588fcf5d/2255eb3e4e824dd7d5fcdc2e7f84534371c186312e546fb1086a34c17752f431/g' ${WORK_DIR}/openwrt/feeds/packages/lang/golang/golang/Makefile - sed -i 's/1.13/1.17/g' ${WORK_DIR}/openwrt/feeds/packages/lang/golang/golang-version.mk - sed -i 's/15/2/g' ${WORK_DIR}/openwrt/feeds/packages/lang/golang/golang-version.mk - fi - - if [ "${1}" = "openwrt-18.06" ] - then - sed -i 's/6faf74046b5e24c2c0b46e78571cca4d65e1b89819da1089e53ea57539c63491/2255eb3e4e824dd7d5fcdc2e7f84534371c186312e546fb1086a34c17752f431/g' ${WORK_DIR}/openwrt/feeds/packages/lang/golang/golang/Makefile - sed -i 's/1.10/1.17/g' ${WORK_DIR}/openwrt/feeds/packages/lang/golang/golang-version.mk - sed -i 's/8/2/g' ${WORK_DIR}/openwrt/feeds/packages/lang/golang/golang-version.mk - fi -} - -openwrt_make_netmaker_package() { - cd ${WORK_DIR}/openwrt - - make defconfig - make toolchain/gcc/final/compile - make package/netmaker/clean - find ./ -type d | xargs -n1 sudo chmod 755 -R - make package/netmaker/compile V=s -} - - -openwrt_copy_pacage() { - echo ${1} - echo > /tmp/copy.sh - - cd ${WORK_DIR}/openwrt/bin/packages/x86_64/netmaker/ - - for ipk in ./*.ipk - do - if [ -f "$ipk" ] - then - echo ${ipk} | gawk -F".ipk" -v BRANCH=${1} '{ print "cp -rfv "$0" /src/bin/"$1"-"BRANCH".ipk" }' >> /tmp/copy.sh - fi - done - - /bin/bash /tmp/copy.sh -} - -download_openwrt - -change_openwrt_branch ${DEFAULT_OPENWRT_BRANCH} - -init_openwrt_branch - -init_openwrt_link - -openwrt_install_netmaker_feeds - -update_install_openwrt_feeds - -openwrt_init_config - -openwrt_install_package_netmaker_config - -openwrt_patch_golang_host ${DEFAULT_OPENWRT_BRANCH} - -openwrt_make_netmaker_package - -openwrt_copy_pacage ${DEFAULT_OPENWRT_BRANCH} - -ls -alF ${WORK_DIR}/openwrt/bin/ /src/bin diff --git a/nginx/Config.in b/nginx/Config.in deleted file mode 100755 index 68b037098..000000000 --- a/nginx/Config.in +++ /dev/null @@ -1,247 +0,0 @@ -# -# Copyright (C) 2010-2016 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -menu "Configuration" - depends on PACKAGE_nginx - -config NGINX_SSL - bool - prompt "Enable SSL module" - help - Enable HTTPS/SSL support. - default n - -config NGINX_DAV - bool - prompt "Enable WebDAV module" - help - Enable the HTTP and WebDAV methods PUT, DELETE, MKCOL, COPY and MOVE. - default n - -config NGINX_FLV - bool - prompt "Enable FLV module" - help - Provides the ability to seek within FLV (Flash) files using time-based offsets. - default n - -config NGINX_STUB_STATUS - bool - prompt "Enable stub status module" - help - Enable the stub status module which gives some status from the server. - default n - -config NGINX_HTTP_CHARSET - bool - prompt "Enable HTTP charset module" - default y - -config NGINX_HTTP_GZIP - bool - prompt "Enable HTTP gzip module" - default y - -config NGINX_HTTP_SSI - bool - prompt "Enable HTTP ssi module" - default y - -config NGINX_HTTP_USERID - bool - prompt "Enable HTTP userid module" - default y - -config NGINX_HTTP_ACCESS - bool - prompt "Enable HTTP access module" - default y - -config NGINX_HTTP_AUTH_BASIC - bool - prompt "Enable HTTP auth basic" - default y - -config NGINX_HTTP_AUTH_REQUEST - bool - prompt "Enable HTTP auth request module" - default n - -config NGINX_HTTP_AUTOINDEX - bool - prompt "Enable HTTP autoindex module" - default y - -config NGINX_HTTP_GEO - bool - prompt "Enable HTTP geo module" - default y - -config NGINX_HTTP_MAP - bool - prompt "Enable HTTP map module" - default y - -config NGINX_HTTP_SPLIT_CLIENTS - bool - prompt "Enable HTTP split clients" - default y - -config NGINX_HTTP_REFERER - bool - prompt "Enable HTTP referer module" - default y - -config NGINX_HTTP_REWRITE - bool - prompt "Enable HTTP rewrite module" - select NGINX_PCRE - default y - -config NGINX_HTTP_PROXY - bool - prompt "Enable HTTP proxy module" - default y - -config NGINX_HTTP_FASTCGI - bool - prompt "Enable HTTP fastcgi module" - default y - -config NGINX_HTTP_UWSGI - bool - prompt "Enable HTTP uwsgi module" - default y - -config NGINX_HTTP_SCGI - bool - prompt "Enable HTTP scgi module" - default y - -config NGINX_HTTP_MEMCACHED - bool - prompt "Enable HTTP memcached module" - default y - -config NGINX_HTTP_LIMIT_CONN - bool - prompt "Enable HTTP limit conn" - default y - -config NGINX_HTTP_LIMIT_REQ - bool - prompt "Enable HTTP limit req" - default y - -config NGINX_HTTP_EMPTY_GIF - bool - prompt "Enable HTTP empty gif" - default y - -config NGINX_HTTP_BROWSER - bool - prompt "Enable HTTP browser module" - default y - -config NGINX_HTTP_UPSTREAM_HASH - bool - prompt "Enable HTTP hash module" - default y - -config NGINX_HTTP_UPSTREAM_IP_HASH - bool - prompt "Enable HTTP IP hash module" - default y - -config NGINX_HTTP_UPSTREAM_LEAST_CONN - bool - prompt "Enable HTTP least conn module" - default y - -config NGINX_HTTP_UPSTREAM_KEEPALIVE - bool - prompt "Enable HTTP keepalive module" - default y - -config NGINX_HTTP_CACHE - bool - prompt "Enable HTTP cache" - default y - -config NGINX_HTTP_V2 - bool - prompt "Enable HTTP_V2 module" - default n - -config NGINX_PCRE - bool - prompt "Enable PCRE library usage" - default y - -config NGINX_NAXSI - bool - prompt "Enable NAXSI module" - default y - -config NGINX_LUA - bool - prompt "Enable Lua module" - default n - -config NGINX_HTTP_REAL_IP - bool - prompt "Enable HTTP real ip module" - default n - -config NGINX_HTTP_SECURE_LINK - bool - prompt "Enable HTTP secure link module" - default n - -config NGINX_HTTP_SUB - bool - prompt "Enable HTTP sub module" - default n - -config NGINX_HEADERS_MORE - bool - prompt "Enable Headers_more module" - help - Set and clear input and output headers...more than "add"! - default y - -config NGINX_HTTP_BROTLI - bool - prompt "Enable Brotli compression module" - help - Add support for brotli compression module. - default n - -config NGINX_STREAM_CORE_MODULE - bool - prompt "Enable stream support" - help - Add support for NGINX request streaming. - default y - -config NGINX_RTMP_MODULE - bool - prompt "Enable RTMP module" - depends on NGINX_SSL - help - Add support for NGINX-based Media Streaming Server module. - DASH enhanced - https://github.com/ut0mt8/nginx-rtmp-module - default n - -config NGINX_TS_MODULE - bool - prompt "Enable TS module" - help - Add support for MPEG-TS Live Module module. - default n - -endmenu diff --git a/nginx/Config_ssl.in b/nginx/Config_ssl.in deleted file mode 100755 index 9325fba51..000000000 --- a/nginx/Config_ssl.in +++ /dev/null @@ -1,239 +0,0 @@ -# -# Copyright (C) 2010-2016 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -menu "Configuration" - depends on PACKAGE_nginx-ssl - -config NGINX_DAV - bool - prompt "Enable WebDAV module" - help - Enable the HTTP and WebDAV methods PUT, DELETE, MKCOL, COPY and MOVE. - default n - -config NGINX_FLV - bool - prompt "Enable FLV module" - help - Provides the ability to seek within FLV (Flash) files using time-based offsets. - default n - -config NGINX_STUB_STATUS - bool - prompt "Enable stub status module" - help - Enable the stub status module which gives some status from the server. - default n - -config NGINX_HTTP_CHARSET - bool - prompt "Enable HTTP charset module" - default y - -config NGINX_HTTP_GZIP - bool - prompt "Enable HTTP gzip module" - default y - -config NGINX_HTTP_SSI - bool - prompt "Enable HTTP ssi module" - default y - -config NGINX_HTTP_USERID - bool - prompt "Enable HTTP userid module" - default y - -config NGINX_HTTP_ACCESS - bool - prompt "Enable HTTP access module" - default y - -config NGINX_HTTP_AUTH_BASIC - bool - prompt "Enable HTTP auth basic" - default y - -config NGINX_HTTP_AUTH_REQUEST - bool - prompt "Enable HTTP auth request module" - default n - -config NGINX_HTTP_AUTOINDEX - bool - prompt "Enable HTTP autoindex module" - default y - -config NGINX_HTTP_GEO - bool - prompt "Enable HTTP geo module" - default y - -config NGINX_HTTP_MAP - bool - prompt "Enable HTTP map module" - default y - -config NGINX_HTTP_SPLIT_CLIENTS - bool - prompt "Enable HTTP split clients" - default y - -config NGINX_HTTP_REFERER - bool - prompt "Enable HTTP referer module" - default y - -config NGINX_HTTP_REWRITE - bool - prompt "Enable HTTP rewrite module" - select NGINX_PCRE - default y - -config NGINX_HTTP_PROXY - bool - prompt "Enable HTTP proxy module" - default y - -config NGINX_HTTP_FASTCGI - bool - prompt "Enable HTTP fastcgi module" - default y - -config NGINX_HTTP_UWSGI - bool - prompt "Enable HTTP uwsgi module" - default y - -config NGINX_HTTP_SCGI - bool - prompt "Enable HTTP scgi module" - default y - -config NGINX_HTTP_MEMCACHED - bool - prompt "Enable HTTP memcached module" - default y - -config NGINX_HTTP_LIMIT_CONN - bool - prompt "Enable HTTP limit conn" - default y - -config NGINX_HTTP_LIMIT_REQ - bool - prompt "Enable HTTP limit req" - default y - -config NGINX_HTTP_EMPTY_GIF - bool - prompt "Enable HTTP empty gif" - default y - -config NGINX_HTTP_BROWSER - bool - prompt "Enable HTTP browser module" - default y - -config NGINX_HTTP_UPSTREAM_HASH - bool - prompt "Enable HTTP hash module" - default y - -config NGINX_HTTP_UPSTREAM_IP_HASH - bool - prompt "Enable HTTP IP hash module" - default y - -config NGINX_HTTP_UPSTREAM_LEAST_CONN - bool - prompt "Enable HTTP least conn module" - default y - -config NGINX_HTTP_UPSTREAM_KEEPALIVE - bool - prompt "Enable HTTP keepalive module" - default y - -config NGINX_HTTP_CACHE - bool - prompt "Enable HTTP cache" - default y - -config NGINX_HTTP_V2 - bool - prompt "Enable HTTP_V2 module" - default n - -config NGINX_PCRE - bool - prompt "Enable PCRE library usage" - default y - -config NGINX_NAXSI - bool - prompt "Enable NAXSI module" - default y - -config NGINX_LUA - bool - prompt "Enable Lua module" - default n - -config NGINX_HTTP_REAL_IP - bool - prompt "Enable HTTP real ip module" - default n - -config NGINX_HTTP_SECURE_LINK - bool - prompt "Enable HTTP secure link module" - default n - -config NGINX_HTTP_SUB - bool - prompt "Enable HTTP sub module" - default n - -config NGINX_HEADERS_MORE - bool - prompt "Enable Headers_more module" - help - Set and clear input and output headers...more than "add"! - default y - -config NGINX_HTTP_BROTLI - bool - prompt "Enable Brotli compression module" - help - Add support for brotli compression module. - default n - -config NGINX_STREAM_CORE_MODULE - bool - prompt "Enable stream support" - help - Add support for NGINX request streaming. - default n - -config NGINX_RTMP_MODULE - bool - prompt "Enable RTMP module" - help - Add support for NGINX-based Media Streaming Server module. - DASH enhanced - https://github.com/ut0mt8/nginx-rtmp-module - default n - -config NGINX_TS_MODULE - bool - prompt "Enable TS module" - help - Add support for MPEG-TS Live Module module. - default n - -endmenu diff --git a/nginx/Makefile b/nginx/Makefile deleted file mode 100755 index dc32fbb04..000000000 --- a/nginx/Makefile +++ /dev/null @@ -1,532 +0,0 @@ -# -# Copyright (C) 2012-2016 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=nginx -PKG_VERSION:=1.16.1 -PKG_RELEASE:=2 - -PKG_SOURCE:=nginx-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=http://nginx.org/download/ -PKG_HASH:=f11c2a6dd1d3515736f0324857957db2de98be862461b5a542a3ac6188dbe32b - -PKG_MAINTAINER:=Thomas Heil \ - Ansuel Smith -PKG_LICENSE:=2-clause BSD-like license - -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION) - -PKG_FIXUP:=autoreconf -PKG_BUILD_PARALLEL:=1 -PKG_INSTALL:=1 - -PKG_CONFIG_DEPENDS := \ - CONFIG_NGINX_SSL \ - CONFIG_NGINX_DAV \ - CONFIG_NGINX_FLV \ - CONFIG_NGINX_STUB_STATUS \ - CONFIG_NGINX_HTTP_CHARSET \ - CONFIG_NGINX_HTTP_GZIP \ - CONFIG_NGINX_HTTP_SSI \ - CONFIG_NGINX_HTTP_USERID \ - CONFIG_NGINX_HTTP_ACCESS \ - CONFIG_NGINX_HTTP_AUTH_BASIC \ - CONFIG_NGINX_HTTP_AUTH_REQUEST \ - CONFIG_NGINX_HTTP_AUTOINDEX \ - CONFIG_NGINX_HTTP_GEO \ - CONFIG_NGINX_HTTP_MAP \ - CONFIG_NGINX_HTTP_SPLIT_CLIENTS \ - CONFIG_NGINX_HTTP_REFERER \ - CONFIG_NGINX_HTTP_REWRITE \ - CONFIG_NGINX_HTTP_PROXY \ - CONFIG_NGINX_HTTP_FASTCGI \ - CONFIG_NGINX_HTTP_UWSGI \ - CONFIG_NGINX_HTTP_SCGI \ - CONFIG_NGINX_HTTP_MEMCACHED \ - CONFIG_NGINX_HTTP_LIMIT_CONN \ - CONFIG_NGINX_HTTP_LIMIT_REQ \ - CONFIG_NGINX_HTTP_EMPTY_GIF \ - CONFIG_NGINX_HTTP_BROWSER \ - CONFIG_NGINX_HTTP_UPSTREAM_HASH \ - CONFIG_NGINX_HTTP_UPSTREAM_IP_HASH \ - CONFIG_NGINX_HTTP_UPSTREAM_LEAST_CONN \ - CONFIG_NGINX_HTTP_UPSTREAM_KEEPALIVE \ - CONFIG_NGINX_HTTP_UPSTREAM_ZONE \ - CONFIG_NGINX_HTTP_CACHE \ - CONFIG_NGINX_HTTP_V2 \ - CONFIG_NGINX_PCRE \ - CONFIG_NGINX_NAXSI \ - CONFIG_NGINX_LUA \ - CONFIG_NGINX_HTTP_REAL_IP \ - CONFIG_NGINX_HTTP_SECURE_LINK \ - CONFIG_NGINX_HTTP_BROTLI \ - CONFIG_NGINX_HEADERS_MORE \ - CONFIG_NGINX_STREAM_CORE_MODULE \ - CONFIG_NGINX_RTMP_MODULE \ - CONFIG_NGINX_TS_MODULE \ - -include $(INCLUDE_DIR)/package.mk - -define Package/nginx/default - SECTION:=net - CATEGORY:=Network - SUBMENU:=Web Servers/Proxies - TITLE:=Nginx web server - URL:=http://nginx.org/ - DEPENDS:=+NGINX_PCRE:libpcre +(NGINX_SSL||NGINX_HTTP_CACHE||NGINX_HTTP_AUTH_BASIC):libopenssl \ - +NGINX_HTTP_GZIP:zlib +NGINX_LUA:liblua +libpthread +NGINX_DAV:libexpat -endef - -define Package/nginx/description - nginx is an HTTP and reverse proxy server, as well as a mail proxy server, \ - written by Igor Sysoev. (Some module require SSL module enable to show up in \ - config menu) -endef - -define Package/nginx - $(Package/nginx/default) - VARIANT:=no-ssl -endef - -define Package/nginx-ssl - $(Package/nginx/default) - TITLE += with SSL support - DEPENDS +=+libopenssl - VARIANT:=ssl - PROVIDES:=nginx -endef - -Package/nginx-ssl/description = $(Package/nginx/description) \ - This varian is compiled with SSL support enabled. To enable additional module \ - select them in the nginx default configuration menu. - -define Package/nginx-all-module - $(Package/nginx/default) - TITLE += with ALL module selected - DEPENDS:=+libpcre +libopenssl +zlib +liblua +libpthread +libexpat - VARIANT:=all-module - PROVIDES:=nginx -endef - -Package/nginx-all-module/description = $(Package/nginx/description) \ - This varian is compiled with ALL module selected. - -define Package/nginx/config - source "$(SOURCE)/Config.in" -endef - -define Package/nginx-ssl/config - source "$(SOURCE)/Config_ssl.in" -endef - -config_files=nginx.conf mime.types - -define Package/nginx/conffiles -/etc/nginx/ -endef - -Package/nginx-ssl/conffiles = $(Package/nginx/conffiles) -Package/nginx-all-module/conffiles = $(Package/nginx/conffiles) - - -ADDITIONAL_MODULES:= - -ifneq ($(BUILD_VARIANT),all-module) - ifneq ($(CONFIG_NGINX_HTTP_CACHE),y) - ADDITIONAL_MODULES += --without-http-cache - endif - ifneq ($(CONFIG_NGINX_PCRE),y) - ADDITIONAL_MODULES += --without-pcre - endif - ifneq ($(CONFIG_NGINX_HTTP_CHARSET),y) - ADDITIONAL_MODULES += --without-http_charset_module - else - config_files += koi-utf koi-win win-utf - endif - ifneq ($(CONFIG_NGINX_HTTP_GZIP),y) - ADDITIONAL_MODULES += --without-http_gzip_module - endif - ifneq ($(CONFIG_NGINX_HTTP_SSI),y) - ADDITIONAL_MODULES += --without-http_ssi_module - endif - ifneq ($(CONFIG_NGINX_HTTP_USERID),y) - ADDITIONAL_MODULES += --without-http_userid_module - endif - ifneq ($(CONFIG_NGINX_HTTP_ACCESS),y) - ADDITIONAL_MODULES += --without-http_access_module - endif - ifneq ($(CONFIG_NGINX_HTTP_AUTH_BASIC),y) - ADDITIONAL_MODULES += --without-http_auth_basic_module - endif - ifneq ($(CONFIG_NGINX_HTTP_AUTOINDEX),y) - ADDITIONAL_MODULES += --without-http_autoindex_module - endif - ifneq ($(CONFIG_NGINX_HTTP_GEO),y) - ADDITIONAL_MODULES += --without-http_geo_module - endif - ifneq ($(CONFIG_NGINX_HTTP_MAP),y) - ADDITIONAL_MODULES += --without-http_map_module - endif - ifneq ($(CONFIG_NGINX_HTTP_SPLIT_CLIENTS),y) - ADDITIONAL_MODULES += --without-http_split_clients_module - endif - ifneq ($(CONFIG_NGINX_HTTP_REFERER),y) - ADDITIONAL_MODULES += --without-http_referer_module - endif - ifneq ($(CONFIG_NGINX_HTTP_REWRITE),y) - ADDITIONAL_MODULES += --without-http_rewrite_module - endif - ifneq ($(CONFIG_NGINX_HTTP_PROXY),y) - ADDITIONAL_MODULES += --without-http_proxy_module - endif - ifneq ($(CONFIG_NGINX_HTTP_FASTCGI),y) - ADDITIONAL_MODULES += --without-http_fastcgi_module - else - config_files += fastcgi_params - endif - ifneq ($(CONFIG_NGINX_HTTP_UWSGI),y) - ADDITIONAL_MODULES += --without-http_uwsgi_module - endif - ifneq ($(CONFIG_NGINX_HTTP_SCGI),y) - ADDITIONAL_MODULES += --without-http_scgi_module - endif - ifneq ($(CONFIG_NGINX_HTTP_MEMCACHED),y) - ADDITIONAL_MODULES += --without-http_memcached_module - endif - ifneq ($(CONFIG_NGINX_HTTP_LIMIT_CONN),y) - ADDITIONAL_MODULES += --without-http_limit_conn_module - endif - ifneq ($(CONFIG_NGINX_HTTP_LIMIT_REQ),y) - ADDITIONAL_MODULES += --without-http_limit_req_module - endif - ifneq ($(CONFIG_NGINX_HTTP_EMPTY_GIF),y) - ADDITIONAL_MODULES += --without-http_empty_gif_module - endif - ifneq ($(CONFIG_NGINX_HTTP_BROWSER),y) - ADDITIONAL_MODULES += --without-http_browser_module - endif - ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_HASH),y) - ADDITIONAL_MODULES += --without-http_upstream_hash_module - endif - ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_IP_HASH),y) - ADDITIONAL_MODULES += --without-http_upstream_ip_hash_module - endif - ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_LEAST_CONN),y) - ADDITIONAL_MODULES += --without-http_upstream_least_conn_module - endif - ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_KEEPALIVE),y) - ADDITIONAL_MODULES += --without-http_upstream_keepalive_module - endif - - ifeq ($(BUILD_VARIANT),ssl) - ifneq ($(CONFIG_NGINX_SSL),y) - ADDITIONAL_MODULES += --with-http_ssl_module - endif - endif - - ifeq ($(CONFIG_NGINX_SSL),y) - ADDITIONAL_MODULES += --with-http_ssl_module - endif - ifeq ($(CONFIG_NGINX_NAXSI),y) - ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/nginx-naxsi/naxsi_src - endif - ifeq ($(CONFIG_NGINX_LUA),y) - ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/lua-nginx - endif - ifeq ($(CONFIG_IPV6),y) - ADDITIONAL_MODULES += --with-ipv6 - endif - ifeq ($(CONFIG_NGINX_STUB_STATUS),y) - ADDITIONAL_MODULES += --with-http_stub_status_module - endif - ifeq ($(CONFIG_NGINX_FLV),y) - ADDITIONAL_MODULES += --with-http_flv_module - endif - ifeq ($(CONFIG_NGINX_DAV),y) - ADDITIONAL_MODULES += --with-http_dav_module --add-module=$(PKG_BUILD_DIR)/nginx-dav-ext-module - endif - ifeq ($(CONFIG_NGINX_HTTP_AUTH_REQUEST),y) - ADDITIONAL_MODULES += --with-http_auth_request_module - endif - ifeq ($(CONFIG_NGINX_HTTP_V2),y) - ADDITIONAL_MODULES += --with-http_v2_module - endif - ifeq ($(CONFIG_NGINX_HTTP_REAL_IP),y) - ADDITIONAL_MODULES += --with-http_realip_module - endif - ifeq ($(CONFIG_NGINX_HTTP_SECURE_LINK),y) - ADDITIONAL_MODULES += --with-http_secure_link_module - endif - ifeq ($(CONFIG_NGINX_HTTP_SUB),y) - ADDITIONAL_MODULES += --with-http_sub_module - endif - ifeq ($(CONFIG_NGINX_STREAM_CORE_MODULE),y) - ADDITIONAL_MODULES += --with-stream - endif - ifeq ($(CONFIG_NGINX_HEADERS_MORE),y) - ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/nginx-headers-more - endif - ifeq ($(CONFIG_NGINX_HTTP_BROTLI),y) - ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/nginx-brotli - endif - ifeq ($(CONFIG_NGINX_RTMP_MODULE),y) - ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/nginx-rtmp - endif - ifeq ($(CONFIG_NGINX_TS_MODULE),y) - ADDITIONAL_MODULES += --add-module=$(PKG_BUILD_DIR)/nginx-ts - endif -else - CONFIG_NGINX_HEADERS_MORE:=y - CONFIG_NGINX_HTTP_BROTLI:=y - CONFIG_NGINX_RTMP_MODULE:=y - CONFIG_NGINX_TS_MODULE:=y - CONFIG_NGINX_NAXSI:=y - CONFIG_NGINX_LUA:=y - CONFIG_NGINX_DAV:=y - ADDITIONAL_MODULES += --with-http_ssl_module --add-module=$(PKG_BUILD_DIR)/nginx-naxsi/naxsi_src \ - --add-module=$(PKG_BUILD_DIR)/lua-nginx --with-ipv6 --with-http_stub_status_module --with-http_flv_module \ - --with-http_dav_module --add-module=$(PKG_BUILD_DIR)/nginx-dav-ext-module \ - --with-http_auth_request_module --with-http_v2_module --with-http_realip_module \ - --with-http_secure_link_module --with-http_sub_module --add-module=$(PKG_BUILD_DIR)/nginx-headers-more \ - --with-stream \ - --add-module=$(PKG_BUILD_DIR)/nginx-brotli --add-module=$(PKG_BUILD_DIR)/nginx-rtmp \ - --add-module=$(PKG_BUILD_DIR)/nginx-ts - config_files += koi-utf koi-win win-utf fastcgi_params -endif - -define Package/nginx-mod-luci/default - TITLE:=Nginx on LuCI - SECTION:=net - CATEGORY:=Network - SUBMENU:=Web Servers/Proxies - TITLE:=Support file for Nginx - URL:=http://nginx.org/ - DEPENDS:=+uwsgi-cgi +uwsgi-cgi-luci-support -endef - -define Package/nginx-mod-luci - $(Package/nginx-mod-luci/default) - DEPENDS += +nginx -endef - -define Package/nginx-mod-luci/description - Support file for LuCI in nginx. Include custom nginx configuration, autostart script for uwsgi. -endef - -define Package/nginx-mod-luci-ssl - $(Package/nginx-mod-luci/default) - TITLE += with HTTPS support - DEPENDS += +nginx-ssl -endef - -Package/nginx-mod-luci-ssl/description = $(define Package/nginx-mod-luci/description) \ - This also include redirect from http to https and cert autogeneration. - -TARGET_CFLAGS += -fvisibility=hidden -ffunction-sections -fdata-sections -DNGX_LUA_NO_BY_LUA_BLOCK -TARGET_LDFLAGS += -Wl,--gc-sections - -ifeq ($(CONFIG_NGINX_LUA),y) - CONFIGURE_VARS += LUA_INC=$(STAGING_DIR)/usr/include \ - LUA_LIB=$(STAGING_DIR)/usr/lib -endif - -CONFIGURE_ARGS += \ - --crossbuild=Linux::$(ARCH) \ - --prefix=/usr \ - --conf-path=/etc/nginx/nginx.conf \ - $(ADDITIONAL_MODULES) \ - --error-log-path=/var/log/nginx/error.log \ - --pid-path=/var/run/nginx.pid \ - --lock-path=/var/lock/nginx.lock \ - --http-log-path=/var/log/nginx/access.log \ - --http-client-body-temp-path=/var/lib/nginx/body \ - --http-proxy-temp-path=/var/lib/nginx/proxy \ - --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ - --with-cc="$(TARGET_CC)" \ - --with-cc-opt="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ - --with-ld-opt="$(TARGET_LDFLAGS)" \ - --without-http_upstream_zone_module - -define Package/nginx-mod-luci/install - $(INSTALL_DIR) $(1)/etc/nginx - $(INSTALL_BIN) ./files-luci-support/luci_uwsgi.conf $(1)/etc/nginx/luci_uwsgi.conf - $(INSTALL_BIN) ./files-luci-support/luci_nginx.conf $(1)/etc/nginx/luci_nginx.conf - $(INSTALL_DIR) $(1)/etc/uci-defaults - $(INSTALL_BIN) ./files-luci-support/60_nginx-luci-support $(1)/etc/uci-defaults/60_nginx-luci-support -endef - -define Package/nginx-mod-luci-ssl/install - $(Package/nginx-mod-luci/install) - $(INSTALL_DIR) $(1)/etc/nginx - $(INSTALL_BIN) ./files-luci-support/luci_nginx_ssl.conf $(1)/etc/nginx/luci_nginx_ssl.conf - $(INSTALL_DIR) $(1)/etc/uci-defaults - $(INSTALL_BIN) ./files-luci-support/70_nginx-luci-support-ssl $(1)/etc/uci-defaults/70_nginx-luci-support-ssl -endef - -define Package/nginx/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/nginx $(1)/usr/sbin/ - $(INSTALL_DIR) $(1)/etc/nginx - $(INSTALL_DATA) $(addprefix $(PKG_INSTALL_DIR)/etc/nginx/,$(config_files)) $(1)/etc/nginx/ - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/nginx.init $(1)/etc/init.d/nginx -ifeq ($(CONFIG_NGINX_NAXSI),y) - $(INSTALL_DIR) $(1)/etc/nginx - $(INSTALL_BIN) $(PKG_BUILD_DIR)/nginx-naxsi/naxsi_config/naxsi_core.rules $(1)/etc/nginx - chmod 0640 $(1)/etc/nginx/naxsi_core.rules -endif - $(if $(CONFIG_NGINX_NAXSI),$($(INSTALL_BIN) $(PKG_BUILD_DIR)/nginx-naxsi/naxsi_config/naxsi_core.rules $(1)/etc/nginx)) - $(if $(CONFIG_NGINX_NAXSI),$(chmod 0640 $(1)/etc/nginx/naxsi_core.rules)) -endef - -Package/nginx-ssl/install = $(Package/nginx/install) -Package/nginx-all-module/install = $(Package/nginx/install) - -define Build/Prepare - $(Build/Prepare/Default) - $(Prepare/nginx-naxsi) - $(Prepare/lua-nginx) - $(Prepare/nginx-brotli) - $(Prepare/nginx-headers-more) - $(Prepare/nginx-rtmp) - $(Prepare/nginx-ts) - $(Prepare/nginx-dav-ext-module) -endef - - -ifeq ($(CONFIG_NGINX_HEADERS_MORE),y) - define Download/nginx-headers-more - VERSION:=a9f7c7e86cc7441d04e2f11f01c2e3a9c4b0301d - SUBDIR:=nginx-headers-more - FILE:=headers-more-nginx-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/openresty/headers-more-nginx-module.git - MIRROR_HASH:=432609015719aaa7241e5166c7cda427acbe004f725887f78ef629d51bd9cb3f - PROTO:=git - endef - $(eval $(call Download,nginx-headers-more)) - - define Prepare/nginx-headers-more - $(eval $(Download/nginx-headers-more)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - endef -endif - - -ifeq ($(CONFIG_NGINX_HTTP_BROTLI),y) - define Download/nginx-brotli - VERSION:=e26248ee361c04e25f581b92b85d95681bdffb39 - SUBDIR:=nginx-brotli - FILE:=ngx-brotli-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/eustas/ngx_brotli.git - MIRROR_HASH:=76b891ba49f82f0cfbc9cba875646e26ee986b522373e0aa2698a9923a4adcdb - PROTO:=git - endef - $(eval $(call Download,nginx-brotli)) - - define Prepare/nginx-brotli - $(eval $(Download/nginx-brotli)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - endef -endif - - -ifeq ($(CONFIG_NGINX_RTMP_MODULE),y) - define Download/nginx-rtmp - VERSION:=f0ea62342a4eca504b311cd5df910d026c3ea4cf - SUBDIR:=nginx-rtmp - FILE:=ngx-rtmp-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/ut0mt8/nginx-rtmp-module.git - MIRROR_HASH:=9ba7625718d21f658c4878729271832a07bd989165f1d1c720b3a9b54cf738cc - PROTO:=git - endef - $(eval $(call Download,nginx-rtmp)) - - define Prepare/nginx-rtmp - $(eval $(Download/nginx-rtmp)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - endef -endif - - -ifeq ($(CONFIG_NGINX_TS_MODULE),y) - define Download/nginx-ts - VERSION:=ef2f874d95cc75747eb625a292524a702aefb0fd - SUBDIR:=nginx-ts - FILE:=ngx-ts-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/arut/nginx-ts-module.git - MIRROR_HASH:=31ecc9968b928886b54884138eafe2fa747648bca5094d4c3132e8ae9509d1d3 - PROTO:=git - endef - $(eval $(call Download,nginx-ts)) - - define Prepare/nginx-ts - $(eval $(Download/nginx-ts)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - endef -endif - - -ifeq ($(CONFIG_NGINX_NAXSI),y) - define Download/nginx-naxsi - VERSION:=951123ad456bdf5ac94e8d8819342fe3d49bc002 - SUBDIR:=nginx-naxsi - FILE:=nginx-naxsi-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/nbs-system/naxsi.git - MIRROR_HASH:=7ab791f2ff38096f48013141bbfe20ba213d5e04dcac08ca82e0cac07d5c30f0 - PROTO:=git - endef - $(eval $(call Download,nginx-naxsi)) - - define Prepare/nginx-naxsi - $(eval $(Download/nginx-naxsi)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - endef -endif - - -ifeq ($(CONFIG_NGINX_LUA),y) - define Download/lua-nginx - VERSION:=e94f2e5d64daa45ff396e262d8dab8e56f5f10e0 - SUBDIR:=lua-nginx - FILE:=lua-nginx-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/openresty/lua-nginx-module.git - MIRROR_HASH:=ae439f9a8b3c34d7240735b844db72ee721af4791bbaff5692bca20e6785f541 - PROTO:=git - endef - $(eval $(call Download,lua-nginx)) - - define Prepare/lua-nginx - $(eval $(Download/lua-nginx)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - $(call PatchDir,$(PKG_BUILD_DIR),./patches-lua-nginx) - endef -endif - - -ifeq ($(CONFIG_NGINX_DAV),y) - define Download/nginx-dav-ext-module - VERSION:=430fd774fe838a04f1a5defbf1dd571d42300cf9 - SUBDIR:=nginx-dav-ext-module - FILE:=nginx-dav-ext-module-$(PKG_VERSION)-$$(VERSION).tar.gz - URL:=https://github.com/arut/nginx-dav-ext-module.git - MIRROR_HASH:=0566053a8756423ecab455fd9d218cec1e017598fcbb3d6415a06f816851611e - PROTO:=git - endef - $(eval $(call Download,nginx-dav-ext-module)) - - define Prepare/nginx-dav-ext-module - $(eval $(Download/nginx-dav-ext-module)) - gzip -dc $(DL_DIR)/$(FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) - endef -endif - -$(eval $(call BuildPackage,nginx)) -$(eval $(call BuildPackage,nginx-ssl)) -$(eval $(call BuildPackage,nginx-all-module)) -#$(eval $(call BuildPackage,nginx-mod-luci)) -#$(eval $(call BuildPackage,nginx-mod-luci-ssl)) diff --git a/nginx/files-luci-support/60_nginx-luci-support b/nginx/files-luci-support/60_nginx-luci-support deleted file mode 100755 index dd076d260..000000000 --- a/nginx/files-luci-support/60_nginx-luci-support +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -if [ -f "/etc/nginx/luci_nginx.conf" ] && [ -f "/etc/nginx/nginx.conf" ]; then - if [ ! "$(cat '/etc/nginx/nginx.conf' | grep 'luci_uwsgi.conf')" ]; then - mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_old - mv /etc/nginx/luci_nginx.conf /etc/nginx/nginx.conf - core_number=$(grep -c ^processor /proc/cpuinfo) - sed -i "3s/.*/worker_processes "$core_number";/" /etc/nginx/nginx.conf - if [ -n "$(pgrep uhttpd)" ]; then - /etc/init.d/uhttpd stop - /etc/init.d/uhttpd disable - fi - if [ -n "$(pgrep nginx)" ]; then - /etc/init.d/nginx restart - else - /etc/init.d/nginx start - fi - if [ -n "$(pgrep uwsgi)" ]; then - /etc/init.d/uwsgi restart - else - /etc/init.d/uwsgi start - fi - else - rm /etc/nginx/luci_nginx.conf - fi -fi - -exit 0 diff --git a/nginx/files-luci-support/70_nginx-luci-support-ssl b/nginx/files-luci-support/70_nginx-luci-support-ssl deleted file mode 100755 index 76ce3a819..000000000 --- a/nginx/files-luci-support/70_nginx-luci-support-ssl +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - - -if [ -f "/etc/nginx/luci_nginx_ssl.conf" ] && [ -f "/etc/nginx/nginx.conf" ]; then - if [ ! "$(cat '/etc/nginx/nginx.conf' | grep 'return 301 https://$host$request_uri;')" ]; then - if [ -f "/etc/nginx/nginx.conf_old" ]; then - rm /etc/nginx/nginx.conf - else - mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_old - fi - mv /etc/nginx/luci_nginx_ssl.conf /etc/nginx/nginx.conf - core_number=$(grep -c ^processor /proc/cpuinfo) - sed -i "3s/.*/worker_processes "$core_number";/" /etc/nginx/nginx.conf - if [ -n "$(pgrep nginx)" ]; then - /etc/init.d/nginx restart - else - /etc/init.d/nginx start - fi - else - rm /etc/nginx/luci_nginx_ssl.conf - fi -fi - - -if [ ! -f "/etc/nginx/nginx.key" ]; then - - NGINX_KEY=/etc/nginx/nginx.key - NGINX_CER=/etc/nginx/nginx.cer - OPENSSL_BIN=/usr/bin/openssl - PX5G_BIN=/usr/sbin/px5g - - # Prefer px5g for certificate generation (existence evaluated last) - GENKEY_CMD="" - UNIQUEID=$(dd if=/dev/urandom bs=1 count=4 | hexdump -e '1/1 "%02x"') - [ -x "$OPENSSL_BIN" ] && GENKEY_CMD="$OPENSSL_BIN req -x509 -nodes" - [ -x "$PX5G_BIN" ] && GENKEY_CMD="$PX5G_BIN selfsigned" - [ -n "$GENKEY_CMD" ] && { - $GENKEY_CMD \ - -days 730 -newkey rsa:2048 -keyout "${NGINX_KEY}.new" -out "${NGINX_CER}.new" \ - -subj /C="ZZ"/ST="Somewhere"/L="Unknown"/O="OpenWrt""$UNIQUEID"/CN="OpenWrt" - sync - mv "${NGINX_KEY}.new" "${NGINX_KEY}" - mv "${NGINX_CER}.new" "${NGINX_CER}" - } -fi - - -exit 0 diff --git a/nginx/files-luci-support/luci_nginx.conf b/nginx/files-luci-support/luci_nginx.conf deleted file mode 100755 index 31af664a2..000000000 --- a/nginx/files-luci-support/luci_nginx.conf +++ /dev/null @@ -1,51 +0,0 @@ - -user nobody nogroup; -worker_processes 1; - -#error_log logs/error.log; -#error_log logs/error.log notice; -#error_log logs/error.log info; - -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include mime.types; - default_type application/octet-stream; - - sendfile on; - keepalive_timeout 0; - - client_body_buffer_size 10K; - client_header_buffer_size 1k; - client_max_body_size 1G; - large_client_header_buffers 2 1k; - - gzip on; - gzip_http_version 1.1; - gzip_vary on; - gzip_comp_level 1; - gzip_proxied any; - - root /www; - - server { - listen 80 default_server; - listen [::]:80 default_server; - server_name localhost; - - location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { - expires 365d; - } - - include luci_uwsgi.conf; - - } - - include /etc/nginx/conf.d/*.conf; -} diff --git a/nginx/files-luci-support/luci_nginx_ssl.conf b/nginx/files-luci-support/luci_nginx_ssl.conf deleted file mode 100755 index 318453b54..000000000 --- a/nginx/files-luci-support/luci_nginx_ssl.conf +++ /dev/null @@ -1,66 +0,0 @@ - -user root; -worker_processes 1; - -#error_log logs/error.log; -#error_log logs/error.log notice; -#error_log logs/error.log info; - -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include mime.types; - default_type application/octet-stream; - - sendfile on; - keepalive_timeout 0; - - client_body_buffer_size 10K; - client_header_buffer_size 1k; - client_max_body_size 1G; - large_client_header_buffers 2 1k; - - gzip on; - gzip_http_version 1.1; - gzip_vary on; - gzip_comp_level 1; - gzip_proxied any; - - root /www; - - server { - listen 80 default_server; - listen [::]:80 default_server; - server_name _; - return 301 https://$host$request_uri; - } - - server { - listen 443 ssl default_server; - listen [::]:443 ssl default_server; - server_name localhost; - - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!CAMELLIA:!SEED"; - ssl_session_tickets off; - - ssl_certificate /etc/nginx/nginx.cer; - ssl_certificate_key /etc/nginx/nginx.key; - - location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { - expires 365d; - } - - include luci_uwsgi.conf; - - } - - include /etc/nginx/conf.d/*.conf; -} diff --git a/nginx/files-luci-support/luci_uwsgi.conf b/nginx/files-luci-support/luci_uwsgi.conf deleted file mode 100755 index 6211db74a..000000000 --- a/nginx/files-luci-support/luci_uwsgi.conf +++ /dev/null @@ -1,20 +0,0 @@ -location /cgi-bin/luci { - index index.html; - uwsgi_param QUERY_STRING $query_string; - uwsgi_param REQUEST_METHOD $request_method; - uwsgi_param CONTENT_TYPE $content_type; - uwsgi_param CONTENT_LENGTH $content_length if_not_empty; - uwsgi_param REQUEST_URI $request_uri; - uwsgi_param PATH_INFO $document_uri; - uwsgi_param SERVER_PROTOCOL $server_protocol; - uwsgi_param REMOTE_ADDR $remote_addr; - uwsgi_param REMOTE_PORT $remote_port; - uwsgi_param SERVER_ADDR $server_addr; - uwsgi_param SERVER_PORT $server_port; - uwsgi_param SERVER_NAME $server_name; - uwsgi_modifier1 9; - uwsgi_pass unix:////var/run/uwsgi.sock; -} - -location /luci-static { -} diff --git a/nginx/files/nginx.init b/nginx/files/nginx.init deleted file mode 100755 index 40d389719..000000000 --- a/nginx/files/nginx.init +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2015 OpenWrt.org - -START=80 - -USE_PROCD=1 - -start_service() { - [ -d /var/log/nginx ] || mkdir -p /var/log/nginx - [ -d /var/lib/nginx ] || mkdir -p /var/lib/nginx - - procd_open_instance - procd_set_param command /usr/sbin/nginx -c /etc/nginx/nginx.conf -g 'daemon off;' - procd_set_param file /etc/nginx/nginx.conf - procd_set_param respawn - procd_close_instance -} diff --git a/nginx/patches-lua-nginx/100-no_by_lua_block.patch b/nginx/patches-lua-nginx/100-no_by_lua_block.patch deleted file mode 100755 index 968e12d58..000000000 --- a/nginx/patches-lua-nginx/100-no_by_lua_block.patch +++ /dev/null @@ -1,195 +0,0 @@ ---- a/lua-nginx/src/ngx_http_lua_module.c -+++ b/lua-nginx/src/ngx_http_lua_module.c -@@ -165,14 +165,14 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_lua_loc_conf_t, log_socket_errors), - NULL }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - { ngx_string("init_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_http_lua_init_by_lua_block, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - (void *) ngx_http_lua_init_by_inline }, -- -+#endif - { ngx_string("init_by_lua"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_http_lua_init_by_lua, -@@ -186,14 +186,14 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - (void *) ngx_http_lua_init_by_file }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - { ngx_string("init_worker_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_http_lua_init_worker_by_lua_block, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - (void *) ngx_http_lua_init_worker_by_inline }, -- -+#endif - { ngx_string("init_worker_by_lua"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_http_lua_init_worker_by_lua, -@@ -209,6 +209,7 @@ static ngx_command_t ngx_http_lua_cmds[] - (void *) ngx_http_lua_init_worker_by_file }, - - #if defined(NDK) && NDK -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* set_by_lua $res { inline Lua code } [$arg1 [$arg2 [...]]] */ - { ngx_string("set_by_lua_block"), - NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -217,7 +218,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_filter_set_by_lua_inline }, -- -+#endif - /* set_by_lua $res [$arg1 [$arg2 [...]]] */ - { ngx_string("set_by_lua"), - NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -245,7 +246,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_rewrite_handler_inline }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* rewrite_by_lua_block { } */ - { ngx_string("rewrite_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -254,7 +255,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_rewrite_handler_inline }, -- -+#endif - /* access_by_lua "" */ - { ngx_string("access_by_lua"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -263,7 +264,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_access_handler_inline }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* access_by_lua_block { } */ - { ngx_string("access_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -272,7 +273,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_access_handler_inline }, -- -+#endif - /* content_by_lua "" */ - { ngx_string("content_by_lua"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, -@@ -280,7 +281,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_content_handler_inline }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* content_by_lua_block { } */ - { ngx_string("content_by_lua_block"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, -@@ -288,7 +289,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_content_handler_inline }, -- -+#endif - /* log_by_lua */ - { ngx_string("log_by_lua"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -297,7 +298,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_log_handler_inline }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* log_by_lua_block { } */ - { ngx_string("log_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -306,7 +307,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_log_handler_inline }, -- -+#endif - { ngx_string("rewrite_by_lua_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE1, -@@ -361,7 +362,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_header_filter_inline }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* header_filter_by_lua_block { } */ - { ngx_string("header_filter_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -370,7 +371,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_header_filter_inline }, -- -+#endif - { ngx_string("header_filter_by_lua_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE1, -@@ -386,7 +387,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_body_filter_inline }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - /* body_filter_by_lua_block { } */ - { ngx_string("body_filter_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF -@@ -395,7 +396,7 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_body_filter_inline }, -- -+#endif - { ngx_string("body_filter_by_lua_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE1, -@@ -403,14 +404,14 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - 0, - (void *) ngx_http_lua_body_filter_file }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - { ngx_string("balancer_by_lua_block"), - NGX_HTTP_UPS_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_http_lua_balancer_by_lua_block, - NGX_HTTP_SRV_CONF_OFFSET, - 0, - (void *) ngx_http_lua_balancer_handler_inline }, -- -+#endif - { ngx_string("balancer_by_lua_file"), - NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1, - ngx_http_lua_balancer_by_lua, -@@ -517,14 +518,14 @@ static ngx_command_t ngx_http_lua_cmds[] - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_lua_loc_conf_t, ssl_ciphers), - NULL }, -- -+#ifndef NGX_LUA_NO_BY_LUA_BLOCK - { ngx_string("ssl_certificate_by_lua_block"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_http_lua_ssl_cert_by_lua_block, - NGX_HTTP_SRV_CONF_OFFSET, - 0, - (void *) ngx_http_lua_ssl_cert_handler_inline }, -- -+#endif - { ngx_string("ssl_certificate_by_lua_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_lua_ssl_cert_by_lua, diff --git a/nginx/patches/101-feature_test_fix.patch b/nginx/patches/101-feature_test_fix.patch deleted file mode 100755 index b867c88dd..000000000 --- a/nginx/patches/101-feature_test_fix.patch +++ /dev/null @@ -1,116 +0,0 @@ ---- a/auto/cc/name -+++ b/auto/cc/name -@@ -7,7 +7,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then - - ngx_feature="C compiler" - ngx_feature_name= -- ngx_feature_run=yes -+ ngx_feature_run= - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs= ---- a/auto/cc/conf -+++ b/auto/cc/conf -@@ -183,7 +183,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then - else - ngx_feature="gcc builtin atomic operations" - ngx_feature_name=NGX_HAVE_GCC_ATOMIC -- ngx_feature_run=yes -+ ngx_feature_run=no - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs= -@@ -204,7 +204,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then - else - ngx_feature="C99 variadic macros" - ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS" -- ngx_feature_run=yes -+ ngx_feature_run=no - ngx_feature_incs="#include - #define var(dummy, ...) sprintf(__VA_ARGS__)" - ngx_feature_path= -@@ -218,7 +218,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then - - ngx_feature="gcc variadic macros" - ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS" -- ngx_feature_run=yes -+ ngx_feature_run=no - ngx_feature_incs="#include - #define var(dummy, args...) sprintf(args)" - ngx_feature_path= ---- a/auto/os/linux -+++ b/auto/os/linux -@@ -36,7 +36,7 @@ fi - - ngx_feature="epoll" - ngx_feature_name="NGX_HAVE_EPOLL" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= -@@ -110,7 +110,7 @@ ngx_feature_test="int fd; struct stat sb - CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE" - ngx_feature="sendfile()" - ngx_feature_name="NGX_HAVE_SENDFILE" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include - #include " - ngx_feature_path= -@@ -131,7 +131,7 @@ fi - CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" - ngx_feature="sendfile64()" - ngx_feature_name="NGX_HAVE_SENDFILE64" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include - #include " - ngx_feature_path= -@@ -149,7 +149,7 @@ ngx_include="sys/prctl.h"; . auto/includ - - ngx_feature="prctl(PR_SET_DUMPABLE)" - ngx_feature_name="NGX_HAVE_PR_SET_DUMPABLE" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= ---- a/auto/unix -+++ b/auto/unix -@@ -840,7 +840,7 @@ ngx_feature_test="void *p; p = memalign( - - ngx_feature="mmap(MAP_ANON|MAP_SHARED)" - ngx_feature_name="NGX_HAVE_MAP_ANON" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= -@@ -853,7 +853,7 @@ ngx_feature_test="void *p; - - ngx_feature='mmap("/dev/zero", MAP_SHARED)' - ngx_feature_name="NGX_HAVE_MAP_DEVZERO" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include - #include - #include " -@@ -868,7 +868,7 @@ ngx_feature_test='void *p; int fd; - - ngx_feature="System V shared memory" - ngx_feature_name="NGX_HAVE_SYSVSHM" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include - #include " - ngx_feature_path= -@@ -882,7 +882,7 @@ ngx_feature_test="int id; - - ngx_feature="POSIX semaphores" - ngx_feature_name="NGX_HAVE_POSIX_SEM" --ngx_feature_run=yes -+ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= diff --git a/nginx/patches/102-sizeof_test_fix.patch b/nginx/patches/102-sizeof_test_fix.patch deleted file mode 100755 index 7d2430eab..000000000 --- a/nginx/patches/102-sizeof_test_fix.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/auto/types/sizeof -+++ b/auto/types/sizeof -@@ -25,8 +25,14 @@ $NGX_INCLUDE_UNISTD_H - $NGX_INCLUDE_INTTYPES_H - $NGX_INCLUDE_AUTO_CONFIG_H - -+char object_code_block[] = { -+ '\n', 'e', '4', 'V', 'A', -+ '0', 'x', ('0' + sizeof($ngx_type)), -+ 'Y', '3', 'p', 'M', '\n' -+}; -+ - int main(void) { -- printf("%d", (int) sizeof($ngx_type)); -+ printf("dummy use of object_code_block to avoid gc-section: %c", object_code_block[0]); - return 0; - } - -@@ -40,7 +46,7 @@ eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>& - - - if [ -x $NGX_AUTOTEST ]; then -- ngx_size=`$NGX_AUTOTEST` -+ ngx_size=`sed -ne 's/^e4VA0x\(.\)Y3pM$/\1/p' < $NGX_AUTOTEST` - echo " $ngx_size bytes" - fi - diff --git a/nginx/patches/103-sys_nerr.patch b/nginx/patches/103-sys_nerr.patch deleted file mode 100755 index 5f5d106fe..000000000 --- a/nginx/patches/103-sys_nerr.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/src/os/unix/ngx_errno.c -+++ b/src/os/unix/ngx_errno.c -@@ -8,6 +8,9 @@ - #include - #include - -+#ifndef NGX_SYS_NERR -+#define NGX_SYS_NERR 128 -+#endif - - /* - * The strerror() messages are copied because: diff --git a/nginx/patches/200-config.patch b/nginx/patches/200-config.patch deleted file mode 100755 index f35009576..000000000 --- a/nginx/patches/200-config.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/conf/nginx.conf -+++ b/conf/nginx.conf -@@ -1,5 +1,5 @@ - --#user nobody; -+user nobody nogroup; - worker_processes 1; - - #error_log logs/error.log; -@@ -16,7 +16,7 @@ events { - - http { - include mime.types; -- default_type application/octet-stream; -+ #default_type application/octet-stream; - - #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - # '$status $body_bytes_sent "$http_referer" ' diff --git a/nginx/patches/201-ignore-invalid-options.patch b/nginx/patches/201-ignore-invalid-options.patch deleted file mode 100755 index 28be2fb71..000000000 --- a/nginx/patches/201-ignore-invalid-options.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/auto/options -+++ b/auto/options -@@ -397,8 +397,7 @@ $0: warning: the \"--with-sha1-asm\" opt - --test-build-solaris-sendfilev) NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;; - - *) -- echo "$0: error: invalid option \"$option\"" -- exit 1 -+ echo "$0: error: ignoring invalid option \"$option\"" - ;; - esac - done diff --git a/nginx/patches/300-max-processes.patch b/nginx/patches/300-max-processes.patch deleted file mode 100755 index f7465d434..000000000 --- a/nginx/patches/300-max-processes.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/os/unix/ngx_process.h -+++ b/src/os/unix/ngx_process.h -@@ -44,7 +44,7 @@ typedef struct { - } ngx_exec_ctx_t; - - --#define NGX_MAX_PROCESSES 1024 -+#define NGX_MAX_PROCESSES 8 - - #define NGX_PROCESS_NORESPAWN -1 - #define NGX_PROCESS_JUST_SPAWN -2 diff --git a/protobuf/Makefile b/protobuf/Makefile old mode 100755 new mode 100644 index cc314bbea..de6aa5a40 --- a/protobuf/Makefile +++ b/protobuf/Makefile @@ -8,20 +8,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=protobuf -PKG_VERSION:=3.14.0 -PKG_RELEASE:=2 +PKG_VERSION:=3.17.3 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-cpp-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/google/protobuf/releases/download/v$(PKG_VERSION) -PKG_HASH:=50ec5a07c0c55d4ec536dd49021f2e194a26bfdbc531d03d1e9d4d3e27175659 +PKG_HASH:=51cec99f108b83422b7af1170afd7aeb2dd77d2bcbb7b6bad1f92509e9ccf8cb PKG_MAINTAINER:=Ken Keys PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=LICENSE PKG_CPE_ID:=cpe:/a:google:protobuf -HOST_BUILD_PARALLEL:=1 -PKG_BUILD_PARALLEL:=1 CMAKE_SOURCE_SUBDIR:=cmake include $(INCLUDE_DIR)/package.mk diff --git a/protobuf/patches/010-rpath.patch b/protobuf/patches/010-rpath.patch new file mode 100644 index 000000000..ef3e98ab1 --- /dev/null +++ b/protobuf/patches/010-rpath.patch @@ -0,0 +1,24 @@ +--- a/cmake/install.cmake ++++ b/cmake/install.cmake +@@ -16,8 +16,8 @@ foreach(_library ${_protobuf_libraries}) + $ + $) + if (UNIX AND NOT APPLE) +- set_property(TARGET ${_library} +- PROPERTY INSTALL_RPATH "$ORIGIN") ++# set_property(TARGET ${_library} ++# PROPERTY INSTALL_RPATH "$ORIGIN") + elseif (APPLE) + set_property(TARGET ${_library} + PROPERTY INSTALL_RPATH "@loader_path") +@@ -34,8 +34,8 @@ if (protobuf_BUILD_PROTOC_BINARIES) + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT protoc) + if (UNIX AND NOT APPLE) +- set_property(TARGET protoc +- PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") ++# set_property(TARGET protoc ++# PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") + elseif (APPLE) + set_property(TARGET protoc + PROPERTY INSTALL_RPATH "@loader_path/../lib") diff --git a/serdisplib/Makefile b/serdisplib/Makefile old mode 100755 new mode 100644 index c0b2af05d..8b36a4a51 --- a/serdisplib/Makefile +++ b/serdisplib/Makefile @@ -1,58 +1,83 @@ -# -# Copyright (C) 2006-2011 OpenWrt.org -# Copyright (C) 2019 Ycarus (Yannick Chabanois) -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - include $(TOPDIR)/rules.mk PKG_NAME:=serdisplib -PKG_VERSION:=2.01 -PKG_RELEASE:=1 +PKG_VERSION:=2.02 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@SF/serdisplib -PKG_MD5SUM:=4eb17cd70aa963c30a237d426ac24449 +PKG_HASH:=447b74007dc157b0378044245649850b26432b9185b6540ff681fcb0765c4d8b + +PKG_MAINTAINER:=Daniel Golle +PKG_LICENSE:=GPL-2.0-or-later +PLG_LICENSE_FILES:=COPYING + +PKG_FIXUP:=autoreconf +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 +PKG_BUILD_DEPENDS:=libusb-compat include $(INCLUDE_DIR)/package.mk define Package/serdisplib SECTION:=libs CATEGORY:=Libraries - TITLE:=A display control library + TITLE:=serdisplib URL:=http://serdisplib.sourceforge.net/ - DEPENDS:=+libusb-1.0 +libusb-compat endef define Package/serdisplib/description - serdisplib is a library to drive serial and parallel displays - with built-in controllers. + serdisplib started as a library to drive serial displays with + built-in controllers. It can optionally dynamically link with + libusb-compat, libgd and libpthread, some features require having + those packages installed as well. endef -CONFIGURE_ARGS+= \ - --enable-shared \ - --enable-static \ - -TARGET_CFLAGS += $(FPIC) - -define Build/Compile - $(MAKE) -C $(PKG_BUILD_DIR) \ - CFLAGS="$(TARGET_CFLAGS) -Wall -Wno-implicit -I../include -I.." \ - all +define Package/serdisplib-tools + SECTION:=utils + CATEGORY:=Utilities + TITLE:=serdisplib tools + URL:=http://serdisplib.sourceforge.net/ + DEPENDS:=+serdisplib +libgd endef +define Package/serdisplib-tools/description + serdisplib started as a library to drive serial displays with + built-in controllers. This package contains tools for serdisplib: + * l4m132c_tool + * l4m320t_tool + * multidisplay + * sdcmegtron_tool + * touchscreen_tool +endef + +CONFIGURE_VARS += \ + ac_cv_build=$(GNU_TARGET_NAME) + +CONFIGURE_ARGS += \ + --enable-dynloading \ + --disable-statictools + define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/include - $(CP) $(PKG_BUILD_DIR)/include/serdisplib $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/include/serdisplib + $(CP) $(PKG_INSTALL_DIR)/usr/include/serdisplib/*.h $(1)/usr/include/serdisplib $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_BUILD_DIR)/lib/libserdisp.{a,so*} $(1)/usr/lib/ + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libserdisp.{a,so*} $(1)/usr/lib/ endef define Package/serdisplib/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_BUILD_DIR)/lib/libserdisp.so.* $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libserdisp.so* $(1)/usr/lib/ +endef + +define Package/serdisplib-tools/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/l4m132c_tool $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/l4m320t_tool $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/multidisplay $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sdcmegtron_tool $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/touchscreen_tool $(1)/usr/bin endef $(eval $(call BuildPackage,serdisplib)) +$(eval $(call BuildPackage,serdisplib-tools)) diff --git a/serdisplib/patches/002-allow-1bpp-framebuffer.patch b/serdisplib/patches/002-allow-1bpp-framebuffer.patch new file mode 100644 index 000000000..ada4281e9 --- /dev/null +++ b/serdisplib/patches/002-allow-1bpp-framebuffer.patch @@ -0,0 +1,21 @@ +--- a/src/serdisp_specific_framebuffer.c ++++ b/src/serdisp_specific_framebuffer.c +@@ -312,13 +312,15 @@ serdisp_t* serdisp_framebuffer_setup(con + + if (fb_success) { + /* check if colour mode is supported */ +- if (! (vinfo.bits_per_pixel == 16 || vinfo.bits_per_pixel == 24 || vinfo.bits_per_pixel == 32) ) { ++ if (! (vinfo.bits_per_pixel == 1 ||vinfo.bits_per_pixel == 16 || vinfo.bits_per_pixel == 24 || vinfo.bits_per_pixel == 32) ) { + sd_error(SERDISP_ERUNTIME, "unsupported colour depth (%d)", vinfo.bits_per_pixel); + fb_success = 0; + } + } +- +- dd->scrbuf_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; ++ if (vinfo.bits_per_pixel == 1) ++ dd->scrbuf_size = (vinfo.xres * vinfo.yres) / 8; ++ else ++ dd->scrbuf_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; + + if (fb_success) { + /* map framebuffer device to memory */ diff --git a/serdisplib/patches/010-cross-compile.patch b/serdisplib/patches/010-cross-compile.patch new file mode 100644 index 000000000..339322251 --- /dev/null +++ b/serdisplib/patches/010-cross-compile.patch @@ -0,0 +1,101 @@ +--- a/Makefile.in ++++ b/Makefile.in +@@ -44,8 +44,8 @@ all: + done && test -z "$$fail" + + install: +- $(top_srcdir)/mkinstalldirs $(libdir)/pkgconfig +- $(INSTALL_DATA) serdisplib.pc $(libdir)/pkgconfig/ ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libdir)/pkgconfig ++ $(INSTALL_DATA) serdisplib.pc $(DESTDIR)$(libdir)/pkgconfig/ + @for dir in ${subdirs}; do \ + (cd $(srcdir) && cd $$dir && $(MAKE) install) \ + || case "$(MFLAGS)" in *k*) fail=yes;; *) exit 1;; esac; \ +--- a/server/Makefile.in ++++ b/server/Makefile.in +@@ -102,9 +102,9 @@ distclean: clean + + + install: $(PROGRAMS) +- $(top_srcdir)/mkinstalldirs $(bindir) +- $(top_srcdir)/mkinstalldirs $(sbindir) +- $(top_srcdir)/mkinstalldirs $(sysconfdir) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(sbindir) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(sysconfdir) + list='$(PROGRAMS_SBIN)'; \ + for prog in $$list; do \ + $(INSTALL_PROGRAM) $$prog $(sbindir)/ ; \ +--- a/src/Makefile.in ++++ b/src/Makefile.in +@@ -28,7 +28,7 @@ includedir = @includedir@ + datarootdir = @datarootdir@ + + CC=@CC@ +-AR=@AR@ -r ++AR=@AR@ + LN_S=@LN_S@ + INSTALL=@INSTALL@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -184,14 +184,14 @@ programs: $(PROGRAMS) + $(CC) $(CFLAGS) $(DEFINES) -c $< + + $(LIB_DIR)/$(LIB_STATIC): $(LIB_OBJECTS) +- $(top_srcdir)/mkinstalldirs $(top_srcdir)/lib +- $(AR) $(LIB_DIR)/$(LIB_STATIC) $(LIB_OBJECTS) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(top_srcdir)/lib ++ $(AR) -r -- $(LIB_DIR)/$(LIB_STATIC) $(LIB_OBJECTS) + + $(LIB_DIR)/$(LIB_SHARED): $(LIB_OBJECTS) +- $(top_srcdir)/mkinstalldirs $(top_srcdir)/lib ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(top_srcdir)/lib + $(CC) -fPIC -shared $(SONAME_FLAG) -o $(LIB_DIR)/$(LIB_SHARED) $(LIB_OBJECTS) $(LDFLAGS) $(EXTRA_LIBS) +- cd $(LIB_DIR) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) +- cd $(LIB_DIR) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so ++ cd $(DESTDIR)$(LIB_DIR) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) ++ cd $(DESTDIR)$(LIB_DIR) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so + + testserdisp: $(LIB_DIR)/$(LIB_STATIC) $(OBJECTS) + $(CC) -o testserdisp $(OBJECTS) $(LIB_SERDISP) $(EXTRA_LIBS_STATIC) +@@ -204,20 +204,20 @@ distclean: clean + /bin/rm -f Makefile + + install: $(LIB_DIR)/$(LIB_SHARED) $(LIB_DIR)/$(LIB_STATIC) +- $(top_srcdir)/mkinstalldirs $(bindir) +- $(top_srcdir)/mkinstalldirs $(libdir) +- $(top_srcdir)/mkinstalldirs $(includedir) +- $(top_srcdir)/mkinstalldirs $(includedir)/serdisplib ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libdir) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(includedir) ++ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(includedir)/serdisplib + +- $(INSTALL_PROGRAM) $(PROGRAMS) $(bindir)/ +- $(INSTALL_PROGRAM) $(LIB_DIR)/$(LIB_SHARED) $(libdir)/ +- $(INSTALL_DATA) $(LIB_DIR)/$(LIB_STATIC) $(libdir)/ ++ $(INSTALL_PROGRAM) $(PROGRAMS) $(DESTDIR)$(bindir)/ ++ $(INSTALL_PROGRAM) $(LIB_DIR)/$(LIB_SHARED) $(DESTDIR)$(libdir)/ ++ $(INSTALL_DATA) $(LIB_DIR)/$(LIB_STATIC) $(DESTDIR)$(libdir)/ + list='$(LIB_HEADERFILES)'; \ + for headerfile in $$list; do \ +- $(INSTALL_DATA) ../include/serdisplib/$$headerfile $(includedir)/serdisplib/ ; \ ++ $(INSTALL_DATA) ../include/serdisplib/$$headerfile $(DESTDIR)$(includedir)/serdisplib/ ; \ + done +- cd $(libdir) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) +- cd $(libdir) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so ++ cd $(DESTDIR)$(libdir) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) ++ cd $(DESTDIR)$(libdir) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so + + uninstall: + -/bin/rm -f $(libdir)/libserdisp* +--- a/tools/Makefile.in ++++ b/tools/Makefile.in +@@ -151,7 +151,7 @@ distclean: clean + install: $(PROGRAMS) + list='$(PROGRAMS)'; \ + for prog in $$list; do \ +- $(INSTALL_PROGRAM) $$prog $(bindir)/ ; \ ++ $(INSTALL_PROGRAM) $$prog $(DESTDIR)$(bindir)/ ; \ + done + + uninstall: $(PROGRAMS) diff --git a/speedtestcpp/Makefile b/speedtestcpp/Makefile old mode 100755 new mode 100644 index db25f5bb8..95e8dc382 --- a/speedtestcpp/Makefile +++ b/speedtestcpp/Makefile @@ -1,42 +1,66 @@ -# -# Copyright (C) 2021 Ycarus (Yannick Chabanois) for OpenMPTCProuter project -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - include $(TOPDIR)/rules.mk PKG_NAME:=speedtestcpp -PKG_VERSION:=1.12 -PKG_RELEASE:=2 +PKG_VERSION:=1.20.2 +PKG_RELEASE:=1 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_VERSION:=a01ae6eb04c5d3f4847aef73bf77849275ccc6eb PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://github.com/fmantz/SpeedTest.git +PKG_SOURCE_URL:=https://codeload.github.com/oskarirauta/speedtestcpp/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=7d5c85f1d9a46f7d8a3ac4261ef1f92e53c511430bae096f7ec6f12a33d38904 -PKG_MAINTAINER:=Ycarus +PKG_MAINTAINER:=Oskari Rauta PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE -CMAKE_INSTALL:=1 - include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/cmake.mk + +define Package/libspeedtestcpp + SECTION:=libs + CATEGORY:=Libraries + TITLE:=library for ookla's speedtest + DEPENDS:=+libcurl +libstdcpp + URL:=https://github.com/oskarirauta/speedtestcpp +endef + +define Package/libspeedtestcpp/description + Shared library that provides support for ookla's speedtest +endef define Package/speedtestcpp - SECTION:=net - CATEGORY:=Network - TITLE:=Yet another unofficial speedtest.net client cli interface - URL:=https://github.com/fmantz/SpeedTest - DEPENDS:=+curl +libstdcpp +libopenssl +libxml2 + SECTION:=net + CATEGORY:=Network + TITLE:=SpeedTest++ + DEPENDS:=+libspeedtestcpp +libstdcpp + URL:=https://github.com/oskarirauta/speedtestcpp + PROVIDES:=speedtestpp +endef + +define Package/speedtestcpp/description + Yet another unofficial speedtest.net client cli interface + forked from taganaka's SpeedTest with few improments and + lesser depends. +endef + +TARGET_CXXFLAGS += --std=c++23 -fPIC + +define Build/Configure +endef + +define Package/libspeedtestcpp/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/libspeedtestcpp.so* $(1)/usr/lib/ endef define Package/speedtestcpp/install $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/SpeedTest $(1)/usr/bin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/speedtestJson $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/speedtest $(1)/usr/bin/ endef -$(eval $(call BuildPackage,speedtestcpp)) \ No newline at end of file +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include/speedtest + $(CP) $(PKG_BUILD_DIR)/libspeedtestcpp.{so*,a} $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/include/speedtest/*.hpp $(1)/usr/include/speedtest/ +endef + +$(eval $(call BuildPackage,libspeedtestcpp)) +$(eval $(call BuildPackage,speedtestcpp)) diff --git a/upx/Makefile b/upx/Makefile deleted file mode 100755 index 9310bcf81..000000000 --- a/upx/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -# -# Copyright (C) 2011-2020 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -include $(TOPDIR)/rules.mk - -PKG_NAME:=upx -PKG_RELEASE:=1 - -PKG_MAINTAINER:=Xingwang Liao -PKG_LICENSE:=GPL-2.0-only -PKG_LICENSE_FILES:=COPYING LICENSE - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2022-01-15 -PKG_SOURCE_VERSION:=1050de5171f70fd4ba113016e4db994e898c7be3 -PKG_SOURCE_URL:=https://github.com/upx/upx.git -PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_DATE).tar.gz - -HOST_BUILD_DEPENDS:=ucl/host - -include $(INCLUDE_DIR)/host-build.mk -include $(INCLUDE_DIR)/package.mk - -define Host/Compile - UPX_UCLDIR=$(STAGING_DIR_HOST) \ - $(MAKE) -C $(HOST_BUILD_DIR)/src \ - CXXFLAGS_WERROR="" LDFLAGS="$(HOST_LDFLAGS)" \ - CXX="$(HOSTCXX)" -endef - -define Host/Install - $(CP) $(HOST_BUILD_DIR)/src/upx.out $(STAGING_DIR_HOST)/bin/upx -endef - -define Host/Clean - rm -f $(STAGING_DIR_HOST)/bin/upx -endef - -define Package/upx - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=+libucl +libstdcpp +zlib - TITLE:=The Ultimate Packer for eXecutables - URL:=https://upx.github.io/ -endef - -define Package/upx/description -UPX is a free, portable, extendable, high-performance executable packer for -several different executable formats. It achieves an excellent compression ratio -and offers very fast decompression. Your executables suffer no memory overhead -or other drawbacks for most of the formats supported, because of in-place -decompression. -endef - -MAKE_PATH := src - -define Package/upx/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/upx.out $(1)/usr/bin/upx -endef - -$(eval $(call HostBuild)) -$(eval $(call BuildPackage,upx)) From 84117ffe275c2d60929ada2ab1e796e7ea80cac8 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 02:19:03 +0800 Subject: [PATCH 07/73] Update Makefile --- luci-app-openmptcprouter/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luci-app-openmptcprouter/Makefile b/luci-app-openmptcprouter/Makefile index 9e1c5938d..ae4cb6eea 100755 --- a/luci-app-openmptcprouter/Makefile +++ b/luci-app-openmptcprouter/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Support for OpenMPTCProuter -LUCI_DEPENDS:=+luci-lib-json +curl +bind-dig +tracebox +LUCI_DEPENDS:=+luci-lib-json +rdisc6 +curl +bind-dig +tracebox PKG_LICENSE:=GPLv3 #include ../luci/luci.mk From 61bb38eac2aa5cfacd152de2a6b62f40e2e1c6fd Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 02:19:20 +0800 Subject: [PATCH 08/73] Delete Makefile --- ndisc6/Makefile | 99 ------------------------------------------------- 1 file changed, 99 deletions(-) delete mode 100755 ndisc6/Makefile diff --git a/ndisc6/Makefile b/ndisc6/Makefile deleted file mode 100755 index 4977e17c4..000000000 --- a/ndisc6/Makefile +++ /dev/null @@ -1,99 +0,0 @@ -# -# Copyright (C) 2006-2012 OpenWrt.org -# Copyright (C) 2018-2022 Ycarus (Yannick Chabanois) -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=ndisc6 -PKG_VERSION:=1.0.7 -PKG_RELEASE:=1 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=https://www.remlab.net/files/ndisc6/ -PKG_HASH:=edc431d70510d7321a5a39d243de0d0f63846dc9145b3b549c7348cc2bc96609 - -PKG_INSTALL:=1 - -include $(INCLUDE_DIR)/package.mk - -define Package/ndisc - SECTION:=ipv6 - CATEGORY:=IPv6 - SUBMENU:=IPv6 discovery tools - TITLE:=IPv6 discovery tools - URL:=http://www.remlab.net/ndisc6/ - DEPENDS:=+libpthread +librt -endef - -define Package/ndisc/description -IPv6 discovery tools -endef - -define Package/ndisc6 - $(call Package/ndisc) - TITLE:=An ICMPv6 neighbour discovery tool -endef - -define Package/ndisc6/description -An ICMPv6 neighbour discovery tools -endef - -define Package/rdisc6 - $(call Package/ndisc) - TITLE:=An ICMPv6 router discovery tool -endef - -define Package/rdisc6/description -An ICMPv6 router discovery tool -endef - -define Package/traceroute6 - $(call Package/ndisc) - TITLE:=An IPv6-based traceroute implementation -endef - -define Package/traceroute6/description -An IPv6-based traceroute implementation -endef - -define Package/rdnssd - $(call Package/ndisc) - TITLE:=DNS server discovery daemon -endef - -define Package/rdnssd/description -A recursive DNS server discovery daemon gathering -information through stateless IPv6 autoconfiguration (RFC5006) -endef - -TARGET_CFLAGS += -std=c99 - -define Package/ndisc6/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ndisc6 $(1)/usr/bin/ -endef - -define Package/rdisc6/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rdisc6 $(1)/usr/bin/ -endef - -define Package/traceroute6/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/{rl,tcp}traceroute6 $(1)/usr/bin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tracert6 $(1)/usr/bin/ -endef - -define Package/rdnssd/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/rdnssd $(1)/usr/sbin/ -endef - -$(eval $(call BuildPackage,ndisc6)) -$(eval $(call BuildPackage,rdisc6)) -$(eval $(call BuildPackage,traceroute6)) -$(eval $(call BuildPackage,rdnssd)) From 6df9a5329dfb0cd9d40cef2505050a1f56a84a0c Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 03:29:32 +0800 Subject: [PATCH 09/73] del bpftools --- bpftools/Makefile | 169 ------------------ ...pc-fix-EDEADLOCK-redefinition-errors.patch | 51 ------ 2 files changed, 220 deletions(-) delete mode 100755 bpftools/Makefile delete mode 100755 bpftools/patches/005-tools-arch-powerpc-fix-EDEADLOCK-redefinition-errors.patch diff --git a/bpftools/Makefile b/bpftools/Makefile deleted file mode 100755 index f044cc81f..000000000 --- a/bpftools/Makefile +++ /dev/null @@ -1,169 +0,0 @@ -# -# Copyright (C) 2020 Tony Ambardar -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=bpftools -PKG_VERSION:=5.11.16 -PKG_RELEASE:=1 - -PKG_SOURCE:=linux-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=@KERNEL/linux/kernel/v5.x -PKG_HASH:=21163681d130cbce5a6be39019e2c69e44f284855ddd70b1a3bd039249540f43 - -PKG_MAINTAINER:=Tony Ambardar - -PKG_USE_MIPS16:=0 -PKG_BUILD_PARALLEL:=1 -PKG_INSTALL:=1 - -LINUX_VERSION:=$(PKG_VERSION) -LINUX_TLD:=linux-$(LINUX_VERSION) - -BPF_FILES:= \ - kernel/bpf scripts tools/Makefile tools/bpf tools/perf/perf-sys.h \ - tools/arch tools/build tools/include tools/lib tools/scripts -TAR_OPTIONS+= \ - --transform="s;$(LINUX_TLD)/;$(PKG_NAME)-$(PKG_VERSION)/;" \ - $(addprefix $(LINUX_TLD)/,$(BPF_FILES)) - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk - -define Package/bpftool/Default - SECTION:=net - CATEGORY:=Network - TITLE:=bpftool - eBPF subsystem utility - LICENSE:=GPL-2.0-only OR BSD-2-Clause - URL:=http://www.kernel.org - DEPENDS:=+libelf -endef - -define Package/bpftool-minimal - $(call Package/bpftool/Default) - TITLE+= (Minimal) - VARIANT:=minimal - DEFAULT_VARIANT:=1 - PROVIDES:=bpftool - ALTERNATIVES:=200:/usr/sbin/bpftool:/usr/libexec/bpftool-minimal -endef - -define Package/bpftool-full - $(call Package/bpftool/Default) - TITLE+= (Full) - VARIANT:=full - PROVIDES:=bpftool - ALTERNATIVES:=300:/usr/sbin/bpftool:/usr/libexec/bpftool-full - DEPENDS+= +libbfd +libopcodes -endef - -define Package/bpftool-minimal/description - A tool for inspection and simple manipulation of eBPF programs and maps. -endef - -define Package/bpftool-full/description - A tool for inspection and simple manipulation of eBPF programs and maps. - This full version uses libbfd and libopcodes to support disassembly of - eBPF programs and jited code. -endef - -define Package/libbpf - SECTION:=libs - CATEGORY:=Libraries - TITLE:=libbpf - eBPF helper library - VARIANT:=lib - LICENSE:=LGPL-2.1 OR BSD-2-Clause - ABI_VERSION:=0 - URL:=http://www.kernel.org - DEPENDS:=+libelf -endef - -define Package/libbpf/description - libbpf is a library for loading eBPF programs and reading and manipulating eBPF objects from user-space. -endef - - -# LTO not compatible with DSO using PIC -ifneq ($(BUILD_VARIANT),lib) - TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto - TARGET_LDFLAGS += -Wl,--gc-sections -endif - -MAKE_VARS = \ - EXTRA_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \ - LDFLAGS="$(TARGET_LDFLAGS)" - -MAKE_FLAGS += \ - BPFTOOL_VERSION="$(LINUX_VERSION)" \ - FEATURES_DUMP="$(PKG_BUILD_DIR)/FEATURE-DUMP.openwrt" \ - OUTPUT="$(PKG_BUILD_DIR)/" \ - prefix="/usr" \ - $(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') - -ifeq ($(BUILD_VARIANT),full) - HAVE_LIBBFD:=1 - HAVE_LIBCAP:=0 - HAVE_CLANG:=0 - MAKE_PATH:=tools/bpf/bpftool -else ifeq ($(BUILD_VARIANT),minimal) - HAVE_LIBBFD:=0 - HAVE_LIBCAP:=0 - HAVE_CLANG:=0 - MAKE_PATH:=tools/bpf/bpftool -else ifeq ($(BUILD_VARIANT),lib) - HAVE_LIBBFD:=0 - HAVE_LIBCAP:=0 - HAVE_CLANG:=0 - MAKE_PATH:=tools/lib/bpf -endif - -# Perform a "throw-away" make to create a FEATURE-DUMP.* file to edit later. -# The "//" in the make target is actually needed, very unPOSIXly. -define Build/Configure - +$(MAKE_VARS) $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/tools/bpf/bpftool \ - $(MAKE_FLAGS) FEATURES_DUMP= $(PKG_BUILD_DIR)//libbpf/libbpf.a - (cd $(PKG_BUILD_DIR); cat FEATURE-DUMP.bpftool libbpf/FEATURE-DUMP.libbpf \ - | sort | uniq > FEATURE-DUMP.openwrt) - $(SED) 's/feature-libbfd=1/feature-libbfd=$(HAVE_LIBBFD)/' \ - -e 's/feature-libcap=1/feature-libcap=$(HAVE_LIBCAP)/' \ - -e 's/feature-clang-bpf-co-re=1/feature-clang-bpf-co-re=$(HAVE_CLANG)/' \ - $(PKG_BUILD_DIR)/FEATURE-DUMP.openwrt -endef - -define Build/InstallDev/libbpf - $(INSTALL_DIR) $(1)/usr/include/bpf - $(CP) $(PKG_INSTALL_DIR)/usr/include/bpf/*.h $(1)/usr/include/bpf/ - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib$(LIB_SUFFIX)/libbpf.{a,so*} \ - $(1)/usr/lib/ - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib$(LIB_SUFFIX)/pkgconfig/libbpf.pc \ - $(1)/usr/lib/pkgconfig/ - $(SED) 's,/usr/include,$$$${prefix}/include,g' \ - $(1)/usr/lib/pkgconfig/libbpf.pc - $(SED) 's,/usr/lib,$$$${exec_prefix}/lib,g' \ - $(1)/usr/lib/pkgconfig/libbpf.pc -endef - -ifeq ($(BUILD_VARIANT),lib) - Build/InstallDev=$(Build/InstallDev/libbpf) -endif - -define Package/bpftool-$(BUILD_VARIANT)/install - $(INSTALL_DIR) $(1)/usr/libexec - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/bpftool \ - $(1)/usr/libexec/bpftool-$(BUILD_VARIANT) -endef - -define Package/libbpf/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib$(LIB_SUFFIX)/libbpf.so.* $(1)/usr/lib/ -endef - -$(eval $(call BuildPackage,libbpf)) -$(eval $(call BuildPackage,bpftool-full)) -$(eval $(call BuildPackage,bpftool-minimal)) diff --git a/bpftools/patches/005-tools-arch-powerpc-fix-EDEADLOCK-redefinition-errors.patch b/bpftools/patches/005-tools-arch-powerpc-fix-EDEADLOCK-redefinition-errors.patch deleted file mode 100755 index 996ffc43e..000000000 --- a/bpftools/patches/005-tools-arch-powerpc-fix-EDEADLOCK-redefinition-errors.patch +++ /dev/null @@ -1,51 +0,0 @@ -From afe3f4c765b17ced23811fe652c7f7adf7a0c0cf Mon Sep 17 00:00:00 2001 -From: Tony Ambardar -Date: Mon, 14 Sep 2020 23:05:26 -0700 -Subject: [PATCH] tools/arch/powerpc: fix EDEADLOCK redefinition errors in - errno.h - -A few archs like powerpc have different errno.h values for macros -EDEADLOCK and EDEADLK. In code including both libc and linux versions of -errno.h, this can result in multiple definitions of EDEADLOCK in the -include chain. Definitions to the same value (e.g. seen with mips) do -not raise warnings, but on powerpc there are redefinitions changing the -value, which raise warnings and errors (with "-Werror"). - -Guard against these redefinitions to avoid build errors like the following, -first seen cross-compiling libbpf v5.8.9 for powerpc using GCC 8.4.0 with -musl 1.1.24: - - In file included from ../../arch/powerpc/include/uapi/asm/errno.h:5, - from ../../include/linux/err.h:8, - from libbpf.c:29: - ../../include/uapi/asm-generic/errno.h:40: error: "EDEADLOCK" redefined [-Werror] - #define EDEADLOCK EDEADLK - - In file included from toolchain-powerpc_8540_gcc-8.4.0_musl/include/errno.h:10, - from libbpf.c:26: - toolchain-powerpc_8540_gcc-8.4.0_musl/include/bits/errno.h:58: note: this is the location of the previous definition - #define EDEADLOCK 58 - - cc1: all warnings being treated as errors - make[5]: *** [target-powerpc_8540_musl/bpftools-5.8.9/tools/build/Makefile.build:97: /home/kodidev/openwrt-project/build_dir/target-powerpc_8540_musl/bpftools-minimal/bpftools-5.8.9//libbpf/staticobjs/libbpf.o] Error 1 - -Fixes: 95f28190aa01 ("tools include arch: Grab a copy of errno.h for arch's - supported by perf") -Fixes: c3617f72036c ("UAPI: (Scripted) Disintegrate arch/powerpc/include/asm") - -Reported-by: Rosen Penev -Signed-off-by: Tony Ambardar ---- - tools/arch/powerpc/include/uapi/asm/errno.h | 1 + - 1 file changed, 1 insertion(+) - ---- a/tools/arch/powerpc/include/uapi/asm/errno.h -+++ b/tools/arch/powerpc/include/uapi/asm/errno.h -@@ -2,6 +2,7 @@ - #ifndef _ASM_POWERPC_ERRNO_H - #define _ASM_POWERPC_ERRNO_H - -+#undef EDEADLOCK - #include - - #undef EDEADLOCK From ebf0639cbc9ff0c20aab7a22406d8e282ec549f7 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 04:16:12 +0800 Subject: [PATCH 10/73] Update Makefile --- luci-app-openmptcprouter/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luci-app-openmptcprouter/Makefile b/luci-app-openmptcprouter/Makefile index ae4cb6eea..9e1c5938d 100755 --- a/luci-app-openmptcprouter/Makefile +++ b/luci-app-openmptcprouter/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Support for OpenMPTCProuter -LUCI_DEPENDS:=+luci-lib-json +rdisc6 +curl +bind-dig +tracebox +LUCI_DEPENDS:=+luci-lib-json +curl +bind-dig +tracebox PKG_LICENSE:=GPLv3 #include ../luci/luci.mk From ce0298b9a7e293357966c2af8a2e45980475d34f Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 06:13:21 +0800 Subject: [PATCH 11/73] fix network --- luci-mod-network/Makefile | 4 +- .../luci-static/resources/tools/network.js | 202 +++-- .../resources/view/network/dhcp.js | 727 +++++------------- .../resources/view/network/diagnostics.js | 64 +- .../resources/view/network/hosts.js | 50 ++ .../resources/view/network/interfaces.js | 128 +-- .../resources/view/network/routes.js | 230 ++---- .../resources/view/network/switch.js | 26 +- .../resources/view/network/wireless.js | 199 ++--- .../share/luci/menu.d/luci-mod-network.json | 46 +- .../share/rpcd/acl.d/luci-mod-network.json | 7 +- 11 files changed, 546 insertions(+), 1137 deletions(-) mode change 100644 => 100755 luci-mod-network/Makefile mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/tools/network.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js create mode 100755 luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/routes.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/switch.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js mode change 100644 => 100755 luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json mode change 100644 => 100755 luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json diff --git a/luci-mod-network/Makefile b/luci-mod-network/Makefile old mode 100644 new mode 100755 index 4820ffe28..6148f98b4 --- a/luci-mod-network/Makefile +++ b/luci-mod-network/Makefile @@ -1,13 +1,15 @@ # # Copyright (C) 2008-2014 The LuCI Team +# Copyright (C) 2020-2021 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the Apache License, Version 2.0 . # +# From https://github.com/openwrt/luci/commit/b88157e69a060ade618e48b30947729310935d61 include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Network Administration -LUCI_DEPENDS:=+luci-base +rpcd-mod-iwinfo +LUCI_DEPENDS:=+luci-base +libiwinfo-lua +rpcd-mod-iwinfo PKG_LICENSE:=Apache-2.0 diff --git a/luci-mod-network/htdocs/luci-static/resources/tools/network.js b/luci-mod-network/htdocs/luci-static/resources/tools/network.js old mode 100644 new mode 100755 index 092bbbc14..6f16713fe --- a/luci-mod-network/htdocs/luci-static/resources/tools/network.js +++ b/luci-mod-network/htdocs/luci-static/resources/tools/network.js @@ -1,5 +1,4 @@ 'use strict'; -'require fs'; 'require ui'; 'require dom'; 'require uci'; @@ -150,77 +149,25 @@ function updatePlaceholders(opt, section_id) { } } -var cbiFlagTristate = form.ListValue.extend({ - __init__: function(/* ... */) { - this.super('__init__', arguments); - this.keylist = [ '', '0!', '1!' ]; - this.vallist = [ _('automatic'), _('disabled'), _('enabled') ]; - }, - - load: function(section_id) { - var invert = false, sysfs = this.sysfs; - - if (sysfs) { - if (sysfs.charAt(0) == '!') { - invert = true; - sysfs = sysfs.substring(1); - } - - return L.resolveDefault(fs.read(sysfs), '').then(L.bind(function(res) { - res = (res || '').trim(); - - if (res == '0') - this.sysfs_default = invert; - else if (res == '1') - this.sysfs_default = !invert; - - return this.super('load', [section_id]); - }, this)); - } - - return this.super('load', [section_id]); - }, - - write: function(section_id, formvalue) { - if (formvalue == '1!') - return this.super('write', [section_id, '1']); - else if (formvalue == '0!') - return this.super('write', [section_id, '0']); - else - return this.super('remove', [section_id]); - }, - - renderWidget: function(section_id, option_index, cfgvalue) { - var sysdef = this.sysfs_default; - - if (this.sysfs_default !== null) { - this.keylist[0] = sysdef ? '1' : '0'; - this.vallist[0] = sysdef ? _('automatic (enabled)') : _('automatic (disabled)'); - } - - return this.super('renderWidget', [section_id, option_index, cfgvalue]); - } -}); - var cbiTagValue = form.Value.extend({ renderWidget: function(section_id, option_index, cfgvalue) { var widget = new ui.Dropdown(cfgvalue || ['-'], { '-': E([], [ E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ '—' ]), - E('span', { 'class': 'hide-close' }, [ _('Not Member', 'VLAN port state') ]) + E('span', { 'class': 'hide-close' }, [ _('Do not participate', 'VLAN port state') ]) ]), 'u': E([], [ - E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'U' ]), - E('span', { 'class': 'hide-close' }, [ _('Untagged', 'VLAN port state') ]) + E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'u' ]), + E('span', { 'class': 'hide-close' }, [ _('Egress untagged', 'VLAN port state') ]) ]), 't': E([], [ - E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 'T' ]), - E('span', { 'class': 'hide-close' }, [ _('Tagged', 'VLAN port state') ]) + E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ 't' ]), + E('span', { 'class': 'hide-close' }, [ _('Egress tagged', 'VLAN port state') ]) ]), '*': E([], [ E('span', { 'class': 'hide-open', 'style': 'font-family:monospace' }, [ '*' ]), - E('span', { 'class': 'hide-close' }, [ _('Is Primary VLAN', 'VLAN port state') ]) + E('span', { 'class': 'hide-close' }, [ _('Primary VLAN ID', 'VLAN port state') ]) ]) }, { id: this.cbid(section_id), @@ -327,7 +274,7 @@ var cbiTagValue = form.Value.extend({ var t = /t/.test(s[1] || '') ? 't' : 'u'; - return /\x2a/.test(s[1] || '') ? [t, '*'] : [t]; + return /\*/.test(s[1] || '') ? [t, '*'] : [t]; } return ['-']; @@ -357,7 +304,7 @@ var cbiTagValue = form.Value.extend({ } } - uci.set('network', section_id, 'ports', ports.length ? ports : null); + uci.set('network', section_id, 'ports', ports); }, remove: function() {} @@ -384,7 +331,6 @@ return baseclass.extend({ addDeviceOptions: function(s, dev, isNew) { var parent_dev = dev ? dev.getParent() : null, - devname = dev ? dev.getName() : null, o, ss; s.tab('devgeneral', _('General device options')); @@ -475,7 +421,7 @@ return baseclass.extend({ vid = this.section.formvalue(section_id, 'vid'), name = this.section.getUIElement(section_id, 'name_complex'); - if (base && vid && name && !name.isChanged() && isNew) { + if (base && vid && name && !name.isChanged()) { name.setValue('%s.%d'.format(base, vid)); name.triggerValidation(); } @@ -673,16 +619,48 @@ return baseclass.extend({ o.placeholder = dev ? dev._devstate('qlen') : ''; o.datatype = 'uinteger'; - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'promisc', _('Enable promiscuous mode')); - o.sysfs_default = (dev && dev.dev && dev.dev.flags) ? dev.dev.flags.promisc : null; + o = this.replaceOption(s, 'devadvanced', form.Flag, 'promisc', _('Enable promiscuous mode')); + o.default = o.disabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'autoneg', _('Autonegociation')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'gro', _('Generic Receive Offload (GRO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'gso', _('Generic Segmentation Offload (GSO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'tso', _('TCP Segmentation Offload (TSO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'lro', _('Large Receive Offload (LRO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Flag, 'ufo', _('UDP Fragmentation Offload (UFO)')); + o.default = o.enabled; + + o = this.replaceOption(s, 'devadvanced', form.Value, 'speed', _('Speed')); + o.placeholder = dev ? dev.getSpeed() : ''; + o.default = ''; + o.rmempty = true; + o.datatype = 'uinteger'; + o.depends('autoneg', '0'); + + o = this.replaceOption(s, 'devadvanced', form.ListValue, 'duplex', _('Duplex')); + o.default = ''; + o.value('', _('unknown')); + o.value('half', _('half')); + o.value('full', _('full')); + o.depends('autoneg', '0'); o = this.replaceOption(s, 'devadvanced', form.ListValue, 'rpfilter', _('Reverse path filter')); o.default = ''; o.value('', _('disabled')); o.value('loose', _('Loose filtering')); o.value('strict', _('Strict filtering')); - o.cfgvalue = function(/* ... */) { - var val = form.ListValue.prototype.cfgvalue.apply(this, arguments); + o.cfgvalue = function(section_id) { + var val = form.ListValue.prototype.cfgvalue.apply(this, [section_id]); switch (val || '') { case 'loose': @@ -698,17 +676,11 @@ return baseclass.extend({ } }; - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'acceptlocal', _('Accept local'), _('Accept packets with local source addresses')); - o.sysfs = '/proc/sys/net/ipv4/conf/%s/accept_local'.format(devname || 'default'); + o = this.replaceOption(s, 'devadvanced', form.Flag, 'acceptlocal', _('Accept local'), _('Accept packets with local source addresses')); + o.default = o.disabled; - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'sendredirects', _('Send ICMP redirects')); - o.sysfs = '/proc/sys/net/ipv4/conf/%s/send_redirects'.format(devname || 'default'); - - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'arp_accept ', _('Honor gratuitous ARP'), _('When enabled, new ARP table entries are added from received gratuitous APR requests or replies, otherwise only preexisting table entries are updated, but no new hosts are learned.')); - o.sysfs = '/proc/sys/net/ipv4/conf/%s/arp_accept'.format(devname || 'default'); - - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'drop_gratuitous_arp', _('Drop gratuitous ARP'), _('Drop all gratuitous ARP frames, for example if there’s a known good ARP proxy on the network and such frames need not be used or in the case of 802.11, must not be used to prevent attacks.')); - o.sysfs = '/proc/sys/net/ipv4/conf/%s/drop_gratuitous_arp'.format(devname || 'default'); + o = this.replaceOption(s, 'devadvanced', form.Flag, 'sendredirects', _('Send ICMP redirects')); + o.default = o.enabled; o = this.replaceOption(s, 'devadvanced', form.Value, 'neighreachabletime', _('Neighbour cache validity'), _('Time in milliseconds')); o.placeholder = '30000'; @@ -722,75 +694,63 @@ return baseclass.extend({ o.placeholder = '0'; o.datatype = 'uinteger'; - o = this.replaceOption(s, 'devgeneral', cbiFlagTristate, 'ipv6', _('Enable IPv6')); - o.sysfs = '!/proc/sys/net/ipv6/conf/%s/disable_ipv6'.format(devname || 'default'); + o = this.replaceOption(s, 'devadvanced', form.Value, 'ttl', _('Force TTL'), _('Some LTE providers detect tethering by inspecting packet TTL values')); + o.placeholder = '65'; + o.datatype = 'uinteger'; + + o = this.replaceOption(s, 'devgeneral', form.Flag, 'ipv6', _('Enable IPv6')); o.migrate = false; - - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'ip6segmentrouting', _('Enable IPv6 segment routing')); - o.sysfs = '/proc/sys/net/ipv6/conf/%s/seg6_enabled'.format(devname || 'default'); - o.depends('ipv6', /1/); - - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'drop_unsolicited_na', _('Drop unsolicited NA'), _('Drop all unsolicited neighbor advertisements, for example if there’s a known good NA proxy on the network and such frames need not be used or in the case of 802.11, must not be used to prevent attacks.')); - o.sysfs = '/proc/sys/net/ipv6/conf/%s/drop_unsolicited_na'.format(devname || 'default'); - o.depends('ipv6', /1/); + o.default = o.enabled; o = this.replaceOption(s, 'devgeneral', form.Value, 'mtu6', _('IPv6 MTU')); o.datatype = 'max(9200)'; - o.depends('ipv6', /1/); + o.depends('ipv6', '1'); o = this.replaceOption(s, 'devgeneral', form.Value, 'dadtransmits', _('DAD transmits'), _('Amount of Duplicate Address Detection probes to send')); o.placeholder = '1'; o.datatype = 'uinteger'; - o.depends('ipv6', /1/); + o.depends('ipv6', '1'); - o = this.replaceOption(s, 'devadvanced', cbiFlagTristate, 'multicast', _('Enable multicast support')); - o.sysfs_default = (dev && dev.dev && dev.dev.flags) ? dev.dev.flags.multicast : null; + o = this.replaceOption(s, 'devadvanced', form.Flag, 'multicast', _('Enable multicast support')); + o.default = o.enabled; o = this.replaceOption(s, 'devadvanced', form.ListValue, 'igmpversion', _('Force IGMP version')); o.value('', _('No enforcement')); o.value('1', _('Enforce IGMPv1')); o.value('2', _('Enforce IGMPv2')); o.value('3', _('Enforce IGMPv3')); - o.depends('multicast', /1/); + o.depends('multicast', '1'); o = this.replaceOption(s, 'devadvanced', form.ListValue, 'mldversion', _('Force MLD version')); o.value('', _('No enforcement')); o.value('1', _('Enforce MLD version 1')); o.value('2', _('Enforce MLD version 2')); - o.depends('multicast', /1/); + o.depends('multicast', '1'); if (isBridgePort(dev)) { - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'learning', _('Enable MAC address learning')); - o.sysfs = '/sys/class/net/%s/brport/learning'.format(devname || 'default'); + o = this.replaceOption(s, 'brport', form.Flag, 'learning', _('Enable MAC address learning')); + o.default = o.enabled; - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'unicast_flood', _('Enable unicast flooding')); - o.sysfs = '/sys/class/net/%s/brport/unicast_flood'.format(devname || 'default'); + o = this.replaceOption(s, 'brport', form.Flag, 'unicast_flood', _('Enable unicast flooding')); + o.default = o.enabled; - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'isolate', _('Port isolation'), _('Only allow communication with non-isolated bridge ports when enabled')); - o.sysfs = '/sys/class/net/%s/brport/isolated'.format(devname || 'default'); + o = this.replaceOption(s, 'brport', form.Flag, 'isolated', _('Port isolation'), _('Only allow communication with non-isolated bridge ports when enabled')); + o.default = o.disabled; o = this.replaceOption(s, 'brport', form.ListValue, 'multicast_router', _('Multicast routing')); o.value('', _('Never')); o.value('1', _('Learn')); o.value('2', _('Always')); - o.depends('multicast', /1/); + o.depends('multicast', '1'); - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'multicast_to_unicast', _('Multicast to unicast'), _('Forward multicast packets as unicast packets on this device.')); - o.sysfs = '/sys/class/net/%s/brport/multicast_to_unicast'.format(devname || 'default'); - o.depends('multicast', /1/); + o = this.replaceOption(s, 'brport', form.Flag, 'multicast_to_unicast', _('Multicast to unicast'), _('Forward multicast packets as unicast packets on this device.')); + o.default = o.disabled; + o.depends('multicast', '1'); - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'multicast_fast_leave', _('Enable multicast fast leave')); - o.sysfs = '/sys/class/net/%s/brport/multicast_fast_leave'.format(devname || 'default'); - o.depends('multicast', /1/); - - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'drop_v4_unicast_in_l2_multicast', _('Drop nested IPv4 unicast'), _('Drop layer 2 multicast frames containing IPv4 unicast packets.')); - o.sysfs = '/proc/sys/net/ipv4/conf/%s/drop_unicast_in_l2_multicast'.format(devname || 'default'); - o.depends('multicast', /1/); - - o = this.replaceOption(s, 'brport', cbiFlagTristate, 'drop_v6_unicast_in_l2_multicast', _('Drop nested IPv6 unicast'), _('Drop layer 2 multicast frames containing IPv6 unicast packets.')); - o.sysfs = '/proc/sys/net/ipv6/conf/%s/drop_unicast_in_l2_multicast'.format(devname || 'default'); - o.depends('multicast', /1/); + o = this.replaceOption(s, 'brport', form.Flag, 'multicast_fast_leave', _('Enable multicast fast leave')); + o.default = o.disabled; + o.depends('multicast', '1'); } o = this.replaceOption(s, 'bridgevlan', form.Flag, 'vlan_filtering', _('Enable VLAN filtering')); @@ -856,8 +816,6 @@ return baseclass.extend({ return network.instantiateDevice(port) }).filter(function(dev) { return dev.getType() != 'wifi' || dev.isUp(); - }).sort(function(a, b) { - return L.naturalCompare(a.getName(), b.getName()); }); this.children = this.children.filter(function(opt) { return !opt.option.match(/^port_/) }); @@ -971,6 +929,18 @@ return baseclass.extend({ for (var port_name in seen_ports) ports.push(port_name); + ports.sort(function(a, b) { + var m1 = a.match(/^(.+?)([0-9]*)$/), + m2 = b.match(/^(.+?)([0-9]*)$/); + + if (m1[1] < m2[1]) + return -1; + else if (m1[1] > m2[1]) + return 1; + else + return +(m1[2] || 0) - +(m2[2] || 0); + }); + ss.updatePorts(ports); }, diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js old mode 100644 new mode 100755 index 3a213a20c..6c6163c7c --- a/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js @@ -5,9 +5,7 @@ 'require rpc'; 'require uci'; 'require form'; -'require network'; 'require validation'; -'require tools.widgets as widgets'; var callHostHints, callDUIDHints, callDHCPLeases, CBILeaseStatus, CBILease6Status; @@ -67,58 +65,6 @@ CBILease6Status = form.DummyValue.extend({ } }); -function calculateNetwork(addr, mask) { - addr = validation.parseIPv4(String(addr)); - - if (!isNaN(mask)) - mask = validation.parseIPv4(network.prefixToMask(+mask)); - else - mask = validation.parseIPv4(String(mask)); - - if (addr == null || mask == null) - return null; - - return [ - [ - addr[0] & (mask[0] >>> 0 & 255), - addr[1] & (mask[1] >>> 0 & 255), - addr[2] & (mask[2] >>> 0 & 255), - addr[3] & (mask[3] >>> 0 & 255) - ].join('.'), - mask.join('.') - ]; -} - -function getDHCPPools() { - return uci.load('dhcp').then(function() { - let sections = uci.sections('dhcp', 'dhcp'), - tasks = [], pools = []; - - for (var i = 0; i < sections.length; i++) { - if (sections[i].ignore == '1' || !sections[i].interface) - continue; - - tasks.push(network.getNetwork(sections[i].interface).then(L.bind(function(section_id, net) { - var cidr = net ? (net.getIPAddrs()[0] || '').split('/') : null; - - if (cidr && cidr.length == 2) { - var net_mask = calculateNetwork(cidr[0], cidr[1]); - - pools.push({ - section_id: section_id, - network: net_mask[0], - netmask: net_mask[1] - }); - } - }, null, sections[i]['.name']))); - } - - return Promise.all(tasks).then(function() { - return pools; - }); - }); -} - function validateHostname(sid, s) { if (s == null || s == '') return true; @@ -126,7 +72,7 @@ function validateHostname(sid, s) { if (s.length > 256) return _('Expecting: %s').format(_('valid hostname')); - var labels = s.replace(/^\*?\.?|\.$/g, '').split(/\./); + var labels = s.replace(/^\.+|\.$/g, '').split(/\./); for (var i = 0; i < labels.length; i++) if (!labels[i].match(/^[a-z0-9_](?:[a-z0-9-]{0,61}[a-z0-9])?$/i)) @@ -156,15 +102,13 @@ function validateServerSpec(sid, s) { if (s == null || s == '') return true; - var m = s.match(/^(\/.*\/)?(.*)$/); + var m = s.match(/^(?:\/(.+)\/)?(.*)$/); if (!m) return _('Expecting: %s').format(_('valid hostname')); - if (m[1] != '//' && m[1] != '/#/') { - var res = validateAddressList(sid, m[1]); - if (res !== true) - return res; - } + var res = validateAddressList(sid, m[1]); + if (res !== true) + return res; if (m[2] == '' || m[2] == '#') return true; @@ -194,552 +138,274 @@ function validateServerSpec(sid, s) { return true; } -function validateMACAddr(pools, sid, s) { - if (s == null || s == '') - return true; - - var leases = uci.sections('dhcp', 'host'), - this_macs = L.toArray(s).map(function(m) { return m.toUpperCase() }); - - for (var i = 0; i < pools.length; i++) { - var this_net_mask = calculateNetwork(this.section.formvalue(sid, 'ip'), pools[i].netmask); - - if (!this_net_mask) - continue; - - for (var j = 0; j < leases.length; j++) { - if (leases[j]['.name'] == sid || !leases[j].ip) - continue; - - var lease_net_mask = calculateNetwork(leases[j].ip, pools[i].netmask); - - if (!lease_net_mask || this_net_mask[0] != lease_net_mask[0]) - continue; - - var lease_macs = L.toArray(leases[j].mac).map(function(m) { return m.toUpperCase() }); - - for (var k = 0; k < lease_macs.length; k++) - for (var l = 0; l < this_macs.length; l++) - if (lease_macs[k] == this_macs[l]) - return _('The MAC address %h is already used by another static lease in the same DHCP pool').format(this_macs[l]); - } - } - - return true; -} - return view.extend({ load: function() { return Promise.all([ callHostHints(), - callDUIDHints(), - getDHCPPools(), - network.getDevices() + callDUIDHints() ]); }, - render: function(hosts_duids_pools) { + render: function(hosts_duids) { var has_dhcpv6 = L.hasSystemFeature('dnsmasq', 'dhcpv6') || L.hasSystemFeature('odhcpd'), - hosts = hosts_duids_pools[0], - duids = hosts_duids_pools[1], - pools = hosts_duids_pools[2], - ndevs = hosts_duids_pools[3], + hosts = hosts_duids[0], + duids = hosts_duids[1], m, s, o, ss, so; - m = new form.Map('dhcp', _('DHCP and DNS'), - _('Dnsmasq is a lightweight DHCP server and DNS forwarder.')); + m = new form.Map('dhcp', _('DHCP and DNS'), _('Dnsmasq is a combined DHCP-Server and DNS-Forwarder for NAT firewalls')); - s = m.section(form.TypedSection, 'dnsmasq'); + s = m.section(form.TypedSection, 'dnsmasq', _('Server Settings')); s.anonymous = true; s.addremove = false; s.tab('general', _('General Settings')); - s.tab('relay', _('Relay')); s.tab('files', _('Resolv and Hosts Files')); - s.tab('pxe_tftp', _('PXE/TFTP Settings')); + s.tab('tftp', _('TFTP Settings')); s.tab('advanced', _('Advanced Settings')); s.tab('leases', _('Static Leases')); - s.tab('hosts', _('Hostnames')); - s.tab('srvhosts', _('SRV')); - s.tab('mxhosts', _('MX')); - s.tab('ipsets', _('IP Sets')); s.taboption('general', form.Flag, 'domainneeded', _('Domain required'), - _('Do not forward DNS queries without dots or domain parts.')); + _('Don\'t forward DNS-Requests without DNS-Name')); s.taboption('general', form.Flag, 'authoritative', _('Authoritative'), - _('This is the only DHCP server in the local network.')); + _('This is the only DHCP in the local network')); - s.taboption('general', form.Value, 'local', - _('Local server'), - _('Never forward matching domains and subdomains, resolve from DHCP or hosts files only.')); - - s.taboption('general', form.Value, 'domain', - _('Local domain'), - _('Local domain suffix appended to DHCP names and hosts file entries.')); - - o = s.taboption('general', form.Flag, 'logqueries', - _('Log queries'), - _('Write received DNS queries to syslog.')); - o.optional = true; - - o = s.taboption('general', form.DynamicList, 'server', - _('DNS forwardings'), - _('List of upstream resolvers to forward queries to.')); - o.optional = true; - o.placeholder = '/example.org/10.1.2.3'; - o.validate = validateServerSpec; - - o = s.taboption('general', form.DynamicList, 'address', - _('Addresses'), - _('Resolve specified FQDNs to an IP.') + '
' + - _('Syntax: /fqdn[/fqdn…]/[ipaddr].') + '
' + - _('/#/ matches any domain. /example.com/ returns NXDOMAIN.') + '
' + - _('/example.com/# returns NULL addresses (0.0.0.0 and ::) for example.com and its subdomains.')); - o.optional = true; - o.placeholder = '/router.local/router.lan/192.168.0.1'; - - o = s.taboption('general', form.DynamicList, 'ipset', - _('IP sets'), - _('List of IP sets to populate with the IPs of DNS lookup results of the FQDNs also specified here.')); - o.optional = true; - o.placeholder = '/example.org/ipset,ipset6'; - - o = s.taboption('general', form.Flag, 'rebind_protection', - _('Rebind protection'), - _('Discard upstream responses containing RFC1918 addresses.').format('https://datatracker.ietf.org/doc/html/rfc1918')); - o.rmempty = false; - - o = s.taboption('general', form.Flag, 'rebind_localhost', - _('Allow localhost'), - _('Exempt 127.0.0.0/8 and ::1 from rebinding checks, e.g. for RBL services.')); - o.depends('rebind_protection', '1'); - - o = s.taboption('general', form.DynamicList, 'rebind_domain', - _('Domain whitelist'), - _('List of domains to allow RFC1918 responses for.')); - o.depends('rebind_protection', '1'); - o.optional = true; - o.placeholder = 'ihost.netflix.com'; - o.validate = validateAddressList; - - o = s.taboption('general', form.Flag, 'localservice', - _('Local service only'), - _('Accept DNS queries only from hosts whose address is on a local subnet.')); - o.optional = false; - o.rmempty = false; - - o = s.taboption('general', form.Flag, 'nonwildcard', - _('Non-wildcard'), - _('Bind dynamically to interfaces rather than wildcard address.')); - o.default = o.enabled; - o.optional = false; - o.rmempty = true; - - o = s.taboption('general', form.DynamicList, 'interface', - _('Listen interfaces'), - _('Listen only on the specified interfaces, and loopback if not excluded explicitly.')); - o.optional = true; - o.placeholder = 'lan'; - - o = s.taboption('general', form.DynamicList, 'notinterface', - _('Exclude interfaces'), - _('Do not listen on the specified interfaces.')); - o.optional = true; - o.placeholder = 'loopback'; - - o = s.taboption('relay', form.SectionValue, '__relays__', form.TableSection, 'relay', null, - _('Relay DHCP requests elsewhere. OK: v4↔v4, v6↔v6. Not OK: v4↔v6, v6↔v4.') - + '
' + _('Note: you may also need a DHCP Proxy (currently unavailable) when specifying a non-standard Relay To port(addr#port).') - + '
' + _('You may add multiple unique Relay To on the same Listen addr.')); - - ss = o.subsection; - - ss.addremove = true; - ss.anonymous = true; - ss.sortable = true; - ss.rowcolors = true; - ss.nodescriptions = true; - - so = ss.option(form.Value, 'id', _('ID')); - so.rmempty = false; - so.optional = true; - - so = ss.option(widgets.NetworkSelect, 'interface', _('Interface')); - so.optional = true; - so.rmempty = false; - so.placeholder = 'lan'; - - so = ss.option(form.Value, 'local_addr', _('Listen address')); - so.rmempty = false; - so.datatype = 'ipaddr'; - - for (var family = 4; family <= 6; family += 2) { - for (var i = 0; i < ndevs.length; i++) { - var addrs = (family == 6) ? ndevs[i].getIP6Addrs() : ndevs[i].getIPAddrs(); - for (var j = 0; j < addrs.length; j++) - so.value(addrs[j].split('/')[0]); - } - } - - so = ss.option(form.Value, 'server_addr', _('Relay To address')); - so.rmempty = false; - so.optional = false; - so.placeholder = '192.168.10.1#535'; - - so.validate = function(section, value) { - var m = this.section.formvalue(section, 'local_addr'), - n = this.section.formvalue(section, 'server_addr'), - p; - if (n != null && n != '') - p = n.split('#'); - if (p.length > 1 && !/^[0-9]+$/.test(p[1])) - return _('Expected port number.'); - else - n = p[0]; - - if ((m == null || m == '') && (n == null || n == '')) - return _('Both Listen addr and Relay To must be specified.'); - - if ((validation.parseIPv6(m) && validation.parseIPv6(n)) || - validation.parseIPv4(m) && validation.parseIPv4(n)) - return true; - else - return _('Listen and Relay To IP family must be homogeneous.') - }; s.taboption('files', form.Flag, 'readethers', _('Use /etc/ethers'), - _('Read /etc/ethers to configure the DHCP server.')); + _('Read /etc/ethers to configure the DHCP-Server')); s.taboption('files', form.Value, 'leasefile', - _('Lease file'), - _('File to store DHCP lease information.')); + _('Leasefile'), + _('file where given DHCP-leases will be stored')); - o = s.taboption('files', form.Flag, 'noresolv', - _('Ignore resolv file')); - o.optional = true; + s.taboption('files', form.Flag, 'noresolv', + _('Ignore resolve file')).optional = true; o = s.taboption('files', form.Value, 'resolvfile', - _('Resolv file'), - _('File with upstream resolvers.')); + _('Resolve file'), + _('local DNS file')); + o.depends('noresolv', '0'); o.placeholder = '/tmp/resolv.conf.d/resolv.conf.auto'; o.optional = true; - o = s.taboption('files', form.Flag, 'nohosts', - _('Ignore /etc/hosts')); - o.optional = true; - o = s.taboption('files', form.DynamicList, 'addnhosts', - _('Additional hosts files')); - o.optional = true; - o.placeholder = '/etc/dnsmasq.hosts'; + s.taboption('files', form.Flag, 'nohosts', + _('Ignore /etc/hosts')).optional = true; + + s.taboption('files', form.DynamicList, 'addnhosts', + _('Additional Hosts files')).optional = true; o = s.taboption('advanced', form.Flag, 'quietdhcp', _('Suppress logging'), - _('Suppress logging of the routine operation for the DHCP protocol.')); + _('Suppress logging of the routine operation of these protocols')); o.optional = true; o = s.taboption('advanced', form.Flag, 'sequential_ip', - _('Allocate IPs sequentially'), - _('Allocate IP addresses sequentially, starting from the lowest available address.')); + _('Allocate IP sequentially'), + _('Allocate IP addresses sequentially, starting from the lowest available address')); o.optional = true; o = s.taboption('advanced', form.Flag, 'boguspriv', _('Filter private'), - _('Do not forward reverse lookups for local networks.')); + _('Do not forward reverse lookups for local networks')); o.default = o.enabled; s.taboption('advanced', form.Flag, 'filterwin2k', - _('Filter SRV/SOA service discovery'), - _('Filters SRV/SOA service discovery, to avoid triggering dial-on-demand links.') + '
' + - _('May prevent VoIP or other services from working.')); + _('Filter useless'), + _('Do not forward requests that cannot be answered by public name servers')); - o = s.taboption('advanced', form.Flag, 'filter_aaaa', - _('Filter IPv6 AAAA records'), - _('Remove IPv6 addresses from the results and only return IPv4 addresses.') + '
' + - _('Can be useful if ISP has IPv6 nameservers but does not provide IPv6 routing.')); - o.optional = true; - - o = s.taboption('advanced', form.Flag, 'filter_a', - _('Filter IPv4 A records'), - _('Remove IPv4 addresses from the results and only return IPv6 addresses.')); - o.optional = true; s.taboption('advanced', form.Flag, 'localise_queries', _('Localise queries'), - _('Return answers to DNS queries matching the subnet from which the query was received if multiple IPs are available.')); + _('Localise hostname depending on the requesting subnet if multiple IPs are available')); if (L.hasSystemFeature('dnsmasq', 'dnssec')) { o = s.taboption('advanced', form.Flag, 'dnssec', - _('DNSSEC'), - _('Validate DNS replies and cache DNSSEC data, requires upstream to support DNSSEC.')); + _('DNSSEC')); o.optional = true; o = s.taboption('advanced', form.Flag, 'dnsseccheckunsigned', _('DNSSEC check unsigned'), - _('Verify unsigned domain responses really come from unsigned domains.')); + _('Requires upstream supports DNSSEC; verify unsigned domain responses really come from unsigned domains')); o.default = o.enabled; o.optional = true; } + s.taboption('general', form.Value, 'local', + _('Local server'), + _('Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only')); + + s.taboption('general', form.Value, 'domain', + _('Local domain'), + _('Local domain suffix appended to DHCP names and hosts file entries')); + s.taboption('advanced', form.Flag, 'expandhosts', _('Expand hosts'), - _('Add local domain suffix to names served from hosts files.')); + _('Add local domain suffix to names served from hosts files')); s.taboption('advanced', form.Flag, 'nonegcache', _('No negative cache'), - _('Do not cache negative replies, e.g. for non-existent domains.')); + _('Do not cache negative replies, e.g. for not existing domains')); - o = s.taboption('advanced', form.Value, 'serversfile', + s.taboption('advanced', form.Value, 'serversfile', _('Additional servers file'), - _('File listing upstream resolvers, optionally domain-specific, e.g. server=1.2.3.4, server=/domain/1.2.3.4.')); - o.placeholder = '/etc/dnsmasq.servers'; + _('This file may contain lines like \'server=/domain/1.2.3.4\' or \'server=1.2.3.4\' for domain-specific or full upstream DNS servers.')); - o = s.taboption('advanced', form.Flag, 'strictorder', + s.taboption('advanced', form.Flag, 'strictorder', _('Strict order'), - _('Upstream resolvers will be queried in the order of the resolv file.')); + _('DNS servers will be queried in the order of the resolvfile')).optional = true; + + s.taboption('advanced', form.Flag, 'allservers', + _('All Servers'), + _('Query all available upstream DNS servers')).optional = true; + + o = s.taboption('advanced', form.DynamicList, 'bogusnxdomain', _('Bogus NX Domain Override'), + _('List of hosts that supply bogus NX domain results')); + + o.optional = true; + o.placeholder = '67.215.65.132'; + + + s.taboption('general', form.Flag, 'logqueries', + _('Log queries'), + _('Write received DNS requests to syslog')).optional = true; + + o = s.taboption('general', form.DynamicList, 'server', _('DNS forwardings'), + _('List of DNS servers to forward requests to')); + + o.optional = true; + o.placeholder = '/example.org/10.1.2.3'; + o.validate = validateServerSpec; + + + o = s.taboption('general', form.DynamicList, 'address', _('Addresses'), + _('List of domains to force to an IP address.')); + + o.optional = true; + o.placeholder = '/router.local/192.168.0.1'; + + + o = s.taboption('general', form.Flag, 'rebind_protection', + _('Rebind protection'), + _('Discard upstream RFC1918 responses')); + + o.rmempty = false; + + + o = s.taboption('general', form.Flag, 'rebind_localhost', + _('Allow localhost'), + _('Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services')); + + o.depends('rebind_protection', '1'); + + + o = s.taboption('general', form.DynamicList, 'rebind_domain', + _('Domain whitelist'), + _('List of domains to allow RFC1918 responses for')); o.optional = true; - o = s.taboption('advanced', form.Flag, 'allservers', - _('All servers'), - _('Query all available upstream resolvers.')); - o.optional = true; + o.depends('rebind_protection', '1'); + o.placeholder = 'ihost.netflix.com'; + o.validate = validateAddressList; - o = s.taboption('advanced', form.DynamicList, 'bogusnxdomain', - _('IPs to override with NXDOMAIN'), - _('List of IP addresses to convert into NXDOMAIN responses.')); - o.optional = true; - o.placeholder = '64.94.110.11'; o = s.taboption('advanced', form.Value, 'port', - _('DNS server port'), - _('Listening port for inbound DNS queries.')); + _('DNS server port'), + _('Listening port for inbound DNS queries')); + o.optional = true; o.datatype = 'port'; o.placeholder = 53; + o = s.taboption('advanced', form.Value, 'queryport', - _('DNS query port'), - _('Fixed source port for outbound DNS queries.')); + _('DNS query port'), + _('Fixed source port for outbound DNS queries')); + o.optional = true; o.datatype = 'port'; o.placeholder = _('any'); + o = s.taboption('advanced', form.Value, 'dhcpleasemax', - _('Max. DHCP leases'), - _('Maximum allowed number of active DHCP leases.')); + _('Max. DHCP leases'), + _('Maximum allowed number of active DHCP leases')); + o.optional = true; o.datatype = 'uinteger'; o.placeholder = _('unlimited'); + o = s.taboption('advanced', form.Value, 'ednspacket_max', - _('Max. EDNS0 packet size'), - _('Maximum allowed size of EDNS0 UDP packets.')); + _('Max. EDNS0 packet size'), + _('Maximum allowed size of EDNS.0 UDP packets')); + o.optional = true; o.datatype = 'uinteger'; o.placeholder = 1280; + o = s.taboption('advanced', form.Value, 'dnsforwardmax', - _('Max. concurrent queries'), - _('Maximum allowed number of concurrent DNS queries.')); + _('Max. concurrent queries'), + _('Maximum allowed number of concurrent DNS queries')); + o.optional = true; o.datatype = 'uinteger'; o.placeholder = 150; o = s.taboption('advanced', form.Value, 'cachesize', _('Size of DNS query cache'), - _('Number of cached DNS entries, 10000 is maximum, 0 is no caching.')); + _('Number of cached DNS entries (max is 10000, 0 is no caching)')); o.optional = true; o.datatype = 'range(0,10000)'; - o.placeholder = 1000; + o.placeholder = 150; - o = s.taboption('pxe_tftp', form.Flag, 'enable_tftp', - _('Enable TFTP server'), - _('Enable the built-in single-instance TFTP server.')); - o.optional = true; + s.taboption('tftp', form.Flag, 'enable_tftp', + _('Enable TFTP server')).optional = true; - o = s.taboption('pxe_tftp', form.Value, 'tftp_root', + o = s.taboption('tftp', form.Value, 'tftp_root', _('TFTP server root'), - _('Root directory for files served via TFTP. Enable TFTP server and TFTP server root turn on the TFTP server and serve files from TFTP server root.')); - o.depends('enable_tftp', '1'); + _('Root directory for files served via TFTP')); + o.optional = true; + o.depends('enable_tftp', '1'); o.placeholder = '/'; - o = s.taboption('pxe_tftp', form.Value, 'dhcp_boot', + + o = s.taboption('tftp', form.Value, 'dhcp_boot', _('Network boot image'), - _('Filename of the boot image advertised to clients.')); - o.depends('enable_tftp', '1'); + _('Filename of the boot image advertised to clients')); + o.optional = true; + o.depends('enable_tftp', '1'); o.placeholder = 'pxelinux.0'; - /* PXE - https://openwrt.org/docs/guide-user/base-system/dhcp#booting_options */ - o = s.taboption('pxe_tftp', form.SectionValue, '__pxe__', form.GridSection, 'boot', null, - _('Special PXE boot options for Dnsmasq.')); - ss = o.subsection; - ss.addremove = true; - ss.anonymous = true; - ss.nodescriptions = true; + o = s.taboption('general', form.Flag, 'localservice', + _('Local Service Only'), + _('Limit DNS service to subnets interfaces on which we are serving DNS.')); + o.optional = false; + o.rmempty = false; - so = ss.option(form.Value, 'filename', - _('Filename'), - _('Host requests this filename from the boot server.')); - so.optional = false; - so.placeholder = 'pxelinux.0'; + o = s.taboption('general', form.Flag, 'nonwildcard', + _('Non-wildcard'), + _('Bind dynamically to interfaces rather than wildcard address (recommended as linux default)')); + o.default = o.enabled; + o.optional = false; + o.rmempty = true; - so = ss.option(form.Value, 'servername', - _('Server name'), - _('The hostname of the boot server')); - so.optional = false; - so.placeholder = 'myNAS'; + o = s.taboption('general', form.DynamicList, 'interface', + _('Listen Interfaces'), + _('Limit listening to these interfaces, and loopback.')); + o.optional = true; - so = ss.option(form.Value, 'serveraddress', - _('Server address'), - _('The IP address of the boot server')); - so.optional = false; - so.placeholder = '192.168.1.2'; - - so = ss.option(form.DynamicList, 'dhcp_option', - _('DHCP Options'), - _('Options for the Network-ID. (Note: needs also Network-ID.) E.g. "42,192.168.1.4" for NTP server, "3,192.168.4.4" for default route. 0.0.0.0 means "the address of the system running dnsmasq".')); - so.optional = true; - so.placeholder = '42,192.168.1.4'; - - so = ss.option(widgets.DeviceSelect, 'networkid', - _('Network-ID'), - _('Apply DHCP Options to this net. (Empty = all clients).')); - so.optional = true; - so.noaliases = true; - - so = ss.option(form.Flag, 'force', - _('Force'), - _('Always send DHCP Options. Sometimes needed, with e.g. PXELinux.')); - so.optional = true; - - so = ss.option(form.Value, 'instance', - _('Instance'), - _('Dnsmasq instance to which this boot section is bound. If unspecified, the section is valid for all dnsmasq instances.')); - so.optional = true; - - Object.values(L.uci.sections('dhcp', 'dnsmasq')).forEach(function(val, index) { - so.value(index, '%s (Domain: %s, Local: %s)'.format(index, val.domain || '?', val.local || '?')); - }); - - o = s.taboption('srvhosts', form.SectionValue, '__srvhosts__', form.TableSection, 'srvhost', null, - _('Bind service records to a domain name: specify the location of services. See RFC2782.').format('https://datatracker.ietf.org/doc/html/rfc2782') - + '
' + _('_service: _sip, _ldap, _imap, _stun, _xmpp-client, … . (Note: while _http is possible, no browsers support SRV records.)') - + '
' + _('_proto: _tcp, _udp, _sctp, _quic, … .') - + '
' + _('You may add multiple records for the same Target.') - + '
' + _('Larger weights (of the same prio) are given a proportionately higher probability of being selected.')); - - ss = o.subsection; - - ss.addremove = true; - ss.anonymous = true; - ss.sortable = true; - ss.rowcolors = true; - - so = ss.option(form.Value, 'srv', _('SRV'), _('Syntax: _service._proto.example.com.')); - so.rmempty = false; - so.datatype = 'hostname'; - so.placeholder = '_sip._tcp.example.com'; - - so = ss.option(form.Value, 'target', _('Target'), _('CNAME or fqdn')); - so.rmempty = false; - so.datatype = 'hostname'; - so.placeholder = 'sip.example.com'; - - so = ss.option(form.Value, 'port', _('Port')); - so.rmempty = false; - so.datatype = 'port'; - so.placeholder = '5060'; - - so = ss.option(form.Value, 'class', _('Priority'), _('Ordinal: lower comes first.')); - so.rmempty = true; - so.datatype = 'range(0,65535)'; - so.placeholder = '10'; - - so = ss.option(form.Value, 'weight', _('Weight')); - so.rmempty = true; - so.datatype = 'range(0,65535)'; - so.placeholder = '50'; - - o = s.taboption('mxhosts', form.SectionValue, '__mxhosts__', form.TableSection, 'mxhost', null, - _('Bind service records to a domain name: specify the location of services.') - + '
' + _('You may add multiple records for the same domain.')); - - ss = o.subsection; - - ss.addremove = true; - ss.anonymous = true; - ss.sortable = true; - ss.rowcolors = true; - ss.nodescriptions = true; - - so = ss.option(form.Value, 'domain', _('Domain')); - so.rmempty = false; - so.datatype = 'hostname'; - so.placeholder = 'example.com'; - - so = ss.option(form.Value, 'relay', _('Relay')); - so.rmempty = false; - so.datatype = 'hostname'; - so.placeholder = 'relay.example.com'; - - so = ss.option(form.Value, 'pref', _('Priority'), _('Ordinal: lower comes first.')); - so.rmempty = true; - so.datatype = 'range(0,65535)'; - so.placeholder = '0'; - - o = s.taboption('hosts', form.SectionValue, '__hosts__', form.GridSection, 'domain', null, - _('Hostnames are used to bind a domain name to an IP address. This setting is redundant for hostnames already configured with static leases, but it can be useful to rebind an FQDN.')); - - ss = o.subsection; - - ss.addremove = true; - ss.anonymous = true; - ss.sortable = true; - - so = ss.option(form.Value, 'name', _('Hostname')); - so.rmempty = false; - so.datatype = 'hostname'; - - so = ss.option(form.Value, 'ip', _('IP address')); - so.rmempty = false; - so.datatype = 'ipaddr'; - - var ipaddrs = {}; - - Object.keys(hosts).forEach(function(mac) { - var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4); - - for (var i = 0; i < addrs.length; i++) - ipaddrs[addrs[i]] = hosts[mac].name || mac; - }); - - L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) { - so.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4])); - }); - - o = s.taboption('ipsets', form.SectionValue, '__ipsets__', form.GridSection, 'ipset', null, - _('List of IP sets to populate with the IPs of DNS lookup results of the FQDNs also specified here.')); - - ss = o.subsection; - - ss.addremove = true; - ss.anonymous = true; - ss.sortable = true; - - so = ss.option(form.DynamicList, 'name', _('IP set')); - so.rmempty = false; - so.datatype = 'string'; - - so = ss.option(form.DynamicList, 'domain', _('Domain')); - so.rmempty = false; - so.datatype = 'hostname'; + o = s.taboption('general', form.DynamicList, 'notinterface', + _('Exclude interfaces'), + _('Prevent listening on these interfaces.')); + o.optional = true; o = s.taboption('leases', form.SectionValue, '__leases__', form.GridSection, 'host', null, _('Static leases are used to assign fixed IP addresses and symbolic hostnames to DHCP clients. They are also required for non-dynamic interface configurations where only hosts with a corresponding lease are served.') + '
' + @@ -749,7 +415,6 @@ return view.extend({ ss.addremove = true; ss.anonymous = true; - ss.sortable = true; so = ss.option(form.Value, 'name', _('Hostname')); so.validate = validateHostname; @@ -763,8 +428,8 @@ return view.extend({ uci.unset('dhcp', section, 'dns'); }; - so = ss.option(form.Value, 'mac', _('MAC address')); - so.datatype = 'list(macaddr)'; + so = ss.option(form.Value, 'mac', _('MAC-Address')); + so.datatype = 'list(unique(macaddr))'; so.rmempty = true; so.cfgvalue = function(section) { var macs = L.toArray(uci.get('dhcp', section, 'mac')), @@ -803,54 +468,75 @@ return view.extend({ return node; }; - so.validate = validateMACAddr.bind(so, pools); Object.keys(hosts).forEach(function(mac) { var hint = hosts[mac].name || L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4)[0]; so.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac); }); - so = ss.option(form.Value, 'ip', _('IPv4 address')); - so.datatype = 'or(ip4addr,"ignore")'; - so.validate = function(section, value) { - var m = this.section.formvalue(section, 'mac'), - n = this.section.formvalue(section, 'name'); + so.write = function(section, value) { + var ip = this.map.lookupOption('ip', section)[0].formvalue(section); + var hosts = uci.sections('dhcp', 'host'); + var section_removed = false; - if ((m == null || m == '') && (n == null || n == '')) - return _('One of hostname or MAC address must be specified!'); - - if (value == null || value == '' || value == 'ignore') - return true; - - var leases = uci.sections('dhcp', 'host'); - - for (var i = 0; i < leases.length; i++) - if (leases[i]['.name'] != section && leases[i].ip == value) - return _('The IP address %h is already used by another static lease').format(value); - - for (var i = 0; i < pools.length; i++) { - var net_mask = calculateNetwork(value, pools[i].netmask); - - if (net_mask && net_mask[0] == pools[i].network) - return true; + for (var i = 0; i < hosts.length; i++) { + if (ip == hosts[i].ip) { + uci.set('dhcp', hosts[i]['.name'], 'mac', [hosts[i].mac, value].join(' ')); + uci.remove('dhcp', section); + section_removed = true; + break; + } } - return _('The IP address is outside of any DHCP pool address range'); + if (!section_removed) { + uci.set('dhcp', section, 'mac', value); + } + } + + so = ss.option(form.Value, 'ip', _('IPv4-Address')); + so.datatype = 'or(ip4addr,"ignore")'; + so.validate = function(section, value) { + var mac = this.map.lookupOption('mac', section), + name = this.map.lookupOption('name', section), + m = mac ? mac[0].formvalue(section) : null, + n = name ? name[0].formvalue(section) : null; + + if ((m == null || m == '') && (n == null || n == '')) + return _('One of hostname or mac address must be specified!'); + + return true; }; + var ipaddrs = {}; + + Object.keys(hosts).forEach(function(mac) { + var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4); + + for (var i = 0; i < addrs.length; i++) + ipaddrs[addrs[i]] = hosts[mac].name; + }); + L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) { so.value(ipv4, ipaddrs[ipv4] ? '%s (%s)'.format(ipv4, ipaddrs[ipv4]) : ipv4); }); + so = ss.option(form.Value, 'gw', _('Gateway IPv4 Address')); + so.rmempty = true; + so.datatype = 'or(ip4addr,"ignore")'; + Object.keys(hosts).forEach(function(mac) { + if (hosts[mac].ipv4) + so.value(hosts[mac].ipv4); + }); + so = ss.option(form.Value, 'leasetime', _('Lease time')); so.rmempty = true; - so = ss.option(form.Value, 'duid', _('DUID')); + so = ss.option(form.Value, 'duid', _('DUID')); so.datatype = 'and(rangelength(20,36),hexstring)'; Object.keys(duids).forEach(function(duid) { so.value(duid, '%s (%s)'.format(duid, duids[duid].hostname || duids[duid].macaddr || duids[duid].ip6addr || '?')); }); - so = ss.option(form.Value, 'hostid', _('IPv6 suffix (hex)')); + so = ss.option(form.Value, 'hostid', _('IPv6-Suffix (hex)')); o = s.taboption('leases', CBILeaseStatus, '__status__'); @@ -874,17 +560,8 @@ return view.extend({ else exp = '%t'.format(lease.expires); - var hint = lease.macaddr ? hosts[lease.macaddr] : null, - name = hint ? hint.name : null, - host = null; - - if (name && lease.hostname && lease.hostname != name) - host = '%s (%s)'.format(lease.hostname, name); - else if (lease.hostname) - host = lease.hostname; - return [ - host || '-', + lease.hostname || '?', lease.ipaddr, lease.macaddr, exp diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js old mode 100644 new mode 100755 index 1bfa95501..5d6bd4765 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js @@ -4,7 +4,6 @@ 'require fs'; 'require ui'; 'require uci'; -'require network'; return view.extend({ handleCommand: function(exec, args) { @@ -14,7 +13,8 @@ return view.extend({ buttons[i].setAttribute('disabled', 'true'); return fs.exec(exec, args).then(function(res) { - var out = document.querySelector('textarea'); + var out = document.querySelector('.command-output'); + out.style.display = ''; dom.content(out, [ res.stdout || '', res.stderr || '' ]); }).catch(function(err) { @@ -36,7 +36,7 @@ return view.extend({ handleTraceroute: function(ev, cmd) { var exec = cmd || 'traceroute', addr = ev.currentTarget.parentNode.previousSibling.value, - args = (exec == 'traceroute') ? [ '-4', '-q', '1', '-w', '1', '-n', '-m', String(L.env.rpctimeout || 20), addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; + args = (exec == 'traceroute') ? [ '-q', '1', '-w', '1', '-n', addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; return this.handleCommand(exec, args); }, @@ -47,20 +47,12 @@ return view.extend({ return this.handleCommand('nslookup', [ addr ]); }, - handleArpScan: function(ev, cmd) { - var addr = ev.currentTarget.parentNode.previousSibling.value; - - return this.handleCommand('arp-scan', [ '-l', '-I', addr ]); - }, - load: function() { return Promise.all([ L.resolveDefault(fs.stat('/bin/ping6'), {}), L.resolveDefault(fs.stat('/usr/bin/ping6'), {}), L.resolveDefault(fs.stat('/bin/traceroute6'), {}), L.resolveDefault(fs.stat('/usr/bin/traceroute6'), {}), - L.resolveDefault(fs.stat('/usr/bin/arp-scan'), {}), - network.getDevices(), uci.load('luci') ]); }, @@ -68,15 +60,15 @@ return view.extend({ render: function(res) { var has_ping6 = res[0].path || res[1].path, has_traceroute6 = res[2].path || res[3].path, - has_arpscan = res[4].path, - devices = res[5], dns_host = uci.get('luci', 'diag', 'dns') || 'openwrt.org', ping_host = uci.get('luci', 'diag', 'ping') || 'openwrt.org', route_host = uci.get('luci', 'diag', 'route') || 'openwrt.org'; - var table = E('table', { 'class': 'table' }, [ + return E([], [ + E('h2', {}, [ _('Network Utilities') ]), + E('table', { 'class': 'table' }, [ E('tr', { 'class': 'tr' }, [ - E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ + E('td', { 'class': 'td left' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', @@ -99,7 +91,7 @@ return view.extend({ ]) ]), - E('td', { 'class': 'td left', 'style': 'overflow:initial' }, [ + E('td', { 'class': 'td left' }, [ E('input', { 'style': 'margin:5px 0', 'type': 'text', @@ -134,45 +126,11 @@ return view.extend({ 'click': ui.createHandlerFn(this, 'handleNslookup') }, [ _('Nslookup') ]) ]) - ]), - - has_arpscan ? E('td', { 'class': 'td left' }, [ - E('select', { - 'style': 'margin:5px 0' - }, devices.map(function(device) { - if (!device.isUp()) - return E([]); - - return E('option', { 'value': device.getName() }, [ device.getI18n() ]); - })), - E('span', { 'class': 'diag-action' }, [ - E('button', { - 'class': 'cbi-button cbi-button-action', - 'click': ui.createHandlerFn(this, 'handleArpScan') - }, [ _('Arp-scan') ]) - ]) - ]) : E([]), + ]) ]) - ]); - - var view = E('div', { 'class': 'cbi-map'}, [ - E('h2', {}, [ _('Diagnostics') ]), - E('div', { 'class': 'cbi-map-descr'}, _('Execution of various network commands to check the connection and name resolution to other systems.')), - table, - E('div', {'class': 'cbi-section'}, [ - E('div', { 'id' : 'command-output'}, - E('textarea', { - 'id': 'widget.command-output', - 'style': 'width: 100%; font-family:monospace; white-space:pre', - 'readonly': true, - 'wrap': 'off', - 'rows': '20' - }) - ) - ]) + ]), + E('pre', { 'class': 'command-output', 'style': 'display:none' }) ]); - - return view; }, handleSaveApply: null, diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js b/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js new file mode 100755 index 000000000..93ebf5ba6 --- /dev/null +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js @@ -0,0 +1,50 @@ +'use strict'; +'require view'; +'require rpc'; +'require form'; + +return view.extend({ + callHostHints: rpc.declare({ + object: 'luci-rpc', + method: 'getHostHints', + expect: { '': {} } + }), + + load: function() { + return this.callHostHints(); + }, + + render: function(hosts) { + var m, s, o; + + m = new form.Map('dhcp', _('Hostnames')); + + s = m.section(form.GridSection, 'domain', _('Host entries')); + s.addremove = true; + s.anonymous = true; + s.sortable = true; + + o = s.option(form.Value, 'name', _('Hostname')); + o.datatype = 'hostname'; + o.rmempty = true; + + o = s.option(form.Value, 'ip', _('IP address')); + o.datatype = 'ipaddr'; + o.rmempty = true; + + var ipaddrs = {}; + + Object.keys(hosts).forEach(function(mac) { + var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4); + + for (var i = 0; i < addrs.length; i++) + ipaddrs[addrs[i]] = hosts[mac].name || mac; + }); + + L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) { + o.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4])); + }); + + return m.render(); + } +}); diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js old mode 100644 new mode 100755 index ebd9c05c5..ff179d404 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js @@ -228,23 +228,6 @@ function get_netmask(s, use_cfgvalue) { return subnetmask; } -function has_peerdns(proto) { - switch (proto) { - case 'dhcp': - case 'dhcpv6': - case 'qmi': - case 'ppp': - case 'pppoe': - case 'pppoa': - case 'pptp': - case 'openvpn': - case 'sstp': - return true; - } - - return false; -} - var cbiRichListValue = form.ListValue.extend({ renderWidget: function(section_id, option_index, cfgvalue) { var choices = this.transformChoices(); @@ -505,7 +488,7 @@ return view.extend({ }; s.modaltitle = function(section_id) { - return _('Interfaces') + ' » ' + section_id; + return _('Interfaces') + ' » ' + section_id.toUpperCase(); }; s.renderRowActions = function(section_id) { @@ -552,7 +535,7 @@ return view.extend({ var protocols = network.getProtocols(); protocols.sort(function(a, b) { - return L.naturalCompare(a.getProtocol(), b.getProtocol()); + return a.getProtocol() > b.getProtocol(); }); o = s.taboption('general', form.DummyValue, '_ifacestat_modal', _('Status')); @@ -660,7 +643,7 @@ return view.extend({ E('p', _('No DHCP Server configured for this interface') + '   '), E('button', { 'class': 'cbi-button cbi-button-add', - 'title': _('Set up DHCP Server'), + 'title': _('Setup DHCP Server'), 'click': ui.createHandlerFn(this, function(section_id, ev) { this.map.save(function() { uci.add('dhcp', 'dhcp', section_id); @@ -676,7 +659,7 @@ return view.extend({ } }); }, ifc.getName()) - }, _('Set up DHCP Server')) + }, _('Setup DHCP Server')) ]); }; @@ -822,14 +805,7 @@ return view.extend({ return flags.length ? flags : [ 'other-config' ]; }; so.remove = function(section_id) { - var existing = L.toArray(uci.get('dhcp', section_id, 'ra_flags')); - if (this.isActive(section_id)) { - if (existing.length != 1 || existing[0] != 'none') - uci.set('dhcp', section_id, 'ra_flags', [ 'none' ]); - } - else if (existing.length) { - uci.unset('dhcp', section_id, 'ra_flags'); - } + uci.set('dhcp', section_id, 'ra_flags', [ 'none' ]); }; so = ss.taboption('ipv6-ra', form.Value, 'ra_maxinterval', _('Max RA interval'), _('Maximum time allowed between sending unsolicited RA. Default is 600 seconds.')); @@ -859,17 +835,15 @@ return view.extend({ so.depends('ra', 'server'); so.depends({ ra: 'hybrid', master: '0' }); so.load = function(section_id) { - var dev = ifc.getL3Device(), - path = dev ? "/proc/sys/net/ipv6/conf/%s/mtu".format(dev.getName()) : null; + var dev = ifc.getL3Device(); - return Promise.all([ - dev ? L.resolveDefault(fs.read(path), dev.getMTU()) : null, - this.super('load', [section_id]) - ]).then(L.bind(function(res) { - this.placeholder = +res[0]; + if (dev) { + var path = "/proc/sys/net/ipv6/conf/%s/mtu".format(dev.getName()); - return res[1]; - }, this)); + return L.resolveDefault(fs.read(path), dev.getMTU()).then(L.bind(function(data) { + this.placeholder = data; + }, this)); + } }; so = ss.taboption('ipv6-ra', form.Value, 'ra_hoplimit', _('RA Hop Limit'), _('The maximum hops to be published in RA messages. Maximum is 255 hops.')); @@ -878,17 +852,15 @@ return view.extend({ so.depends('ra', 'server'); so.depends({ ra: 'hybrid', master: '0' }); so.load = function(section_id) { - var dev = ifc.getL3Device(), - path = dev ? "/proc/sys/net/ipv6/conf/%s/hop_limit".format(dev.getName()) : null; + var dev = ifc.getL3Device(); - return Promise.all([ - dev ? L.resolveDefault(fs.read(path), 64) : null, - this.super('load', [section_id]) - ]).then(L.bind(function(res) { - this.placeholder = +res[0]; + if (dev) { + var path = "/proc/sys/net/ipv6/conf/%s/hop_limit".format(dev.getName()); - return res[1]; - }, this)); + return L.resolveDefault(fs.read(path), 64).then(L.bind(function(data) { + this.placeholder = data; + }, this)); + } }; @@ -906,24 +878,18 @@ return view.extend({ so = ss.taboption('ipv6', form.DynamicList, 'dns', _('Announced IPv6 DNS servers'), _('Specifies a fixed list of IPv6 DNS server addresses to announce via DHCPv6. If left unspecified, the device will announce itself as IPv6 DNS server unless the Local IPv6 DNS server option is disabled.')); so.datatype = 'ip6addr("nomask")'; /* restrict to IPv6 only for now since dnsmasq (DHCPv4) does not honour this option */ - so.depends('ra', 'server'); - so.depends({ ra: 'hybrid', master: '0' }); so.depends('dhcpv6', 'server'); so.depends({ dhcpv6: 'hybrid', master: '0' }); so = ss.taboption('ipv6', form.Flag, 'dns_service', _('Local IPv6 DNS server'), _('Announce this device as IPv6 DNS server.')); so.default = so.enabled; - so.depends({ ra: 'server', dns: /^$/ }); - so.depends({ ra: 'hybrid', dns: /^$/, master: '0' }); so.depends({ dhcpv6: 'server', dns: /^$/ }); so.depends({ dhcpv6: 'hybrid', dns: /^$/, master: '0' }); so = ss.taboption('ipv6', form.DynamicList, 'domain', _('Announced DNS domains'), _('Specifies a fixed list of DNS search domains to announce via DHCPv6. If left unspecified, the local device DNS search domain will be announced.')); so.datatype = 'hostname'; - so.depends('ra', 'server'); - so.depends({ ra: 'hybrid', master: '0' }); so.depends('dhcpv6', 'server'); so.depends({ dhcpv6: 'hybrid', master: '0' }); @@ -953,13 +919,13 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Flag, 'defaultroute', _('Use default gateway'), _('If unchecked, no default route is configured')); o.default = o.enabled; - if (has_peerdns(protoval)) { + if (protoval != 'static') { o = nettools.replaceOption(s, 'advanced', form.Flag, 'peerdns', _('Use DNS servers advertised by peer'), _('If unchecked, the advertised DNS server addresses are ignored')); o.default = o.enabled; } o = nettools.replaceOption(s, 'advanced', form.DynamicList, 'dns', _('Use custom DNS servers')); - if (has_peerdns(protoval)) + if (protoval != 'static') o.depends('peerdns', '0'); o.datatype = 'ipaddr'; @@ -975,6 +941,17 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Value, 'metric', _('Use gateway metric')); o.datatype = 'uinteger'; o.placeholder = '0'; + + o = nettools.replaceOption(s,'advanced', form.ListValue, 'multipath', _('Multipath setting'), _('Only one interface must be set as Master.')); + o.value('on',_('Enabled')); + o.value('off',_('Disabled')); + o.value('master',_('Master')); + o.value('backup',_('Backup')); + o.default = 'off'; + + o = nettools.replaceOption(s,'advanced', form.Value, 'addlatency', _('Additional latency')); + o.datatype = 'uinteger'; + o.default = '0'; o = nettools.replaceOption(s, 'advanced', form.Value, 'ip4table', _('Override IPv4 routing table')); o.datatype = 'or(uinteger, string)'; @@ -984,12 +961,7 @@ return view.extend({ o = nettools.replaceOption(s, 'advanced', form.Value, 'ip6table', _('Override IPv6 routing table')); o.datatype = 'or(uinteger, string)'; for (var i = 0; i < rtTables.length; i++) - o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); - - if (protoval == 'dhcpv6') { - o = nettools.replaceOption(s, 'advanced', form.Flag, 'sourcefilter', _('IPv6 source routing'), _('Automatically handle multiple uplink interfaces using source-based policy routing.')); - o.default = o.enabled; - } + o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][0], rtTables[i][1])); o = nettools.replaceOption(s, 'advanced', form.Flag, 'delegate', _('Delegate IPv6 prefixes'), _('Enable downstream delegation of IPv6 prefixes available on this interface')); o.default = o.enabled; @@ -1108,7 +1080,7 @@ return view.extend({ proto, name, device; protocols.sort(function(a, b) { - return L.naturalCompare(a.getProtocol(), b.getProtocol()); + return a.getProtocol() > b.getProtocol(); }); s2.render = function() { @@ -1182,9 +1154,6 @@ return view.extend({ protoclass.addDevice(device.formvalue('_new_')); m.children[0].addedSection = section_id; - - ui.hideModal(); - ui.showModal(null, E('p', { 'class': 'spinning' }, [ _('Loading data…') ])); }).then(L.bind(m.children[0].renderMoreOptionsModal, m.children[0], nameval)); }); }) @@ -1214,9 +1183,9 @@ return view.extend({ var node = E('div', { 'class': 'ifacebox' }, [ E('div', { 'class': 'ifacebox-head', - 'style': firewall.getZoneColorStyle(zone), + 'style': 'background-color:%s'.format(zone ? zone.getColor() : '#EEEEEE'), 'title': zone ? _('Part of zone %q').format(zone.getName()) : _('No zone assigned') - }, E('strong', net.getName())), + }, E('strong', net.getName().toUpperCase())), E('div', { 'class': 'ifacebox-body', 'id': '%s-ifc-devices'.format(section_id), @@ -1270,7 +1239,7 @@ return view.extend({ s.cfgsections = function() { var sections = uci.sections('network', 'device'), - section_ids = sections.sort(function(a, b) { return L.naturalCompare(a.name, b.name) }).map(function(s) { return s['.name'] }); + section_ids = sections.sort(function(a, b) { return a.name > b.name }).map(function(s) { return s['.name'] }); for (var i = 0; i < netDevs.length; i++) { if (sections.filter(function(s) { return s.name == netDevs[i].getName() }).length) @@ -1315,7 +1284,7 @@ return view.extend({ var trEl = this.super('renderRowActions', [ section_id, _('Configure…') ]), deleteBtn = trEl.querySelector('button:last-child'); - deleteBtn.firstChild.data = _('Unconfigure'); + deleteBtn.firstChild.data = _('Reset'); deleteBtn.setAttribute('title', _('Remove related device settings from the configuration')); deleteBtn.disabled = section_id.match(/^dev:/) ? true : null; @@ -1348,26 +1317,9 @@ return view.extend({ for (var i = 0; i < map.addedVLANs.length; i++) uci.remove('network', map.addedVLANs[i]); - if (this.addedSection) - uci.remove('network', this.addedSection); - return form.GridSection.prototype.handleModalCancel.apply(this, arguments); }; - s.handleRemove = function(section_id /*, ... */) { - var name = uci.get('network', section_id, 'name'), - type = uci.get('network', section_id, 'type'); - - if (name != null && type == 'bridge') { - uci.sections('network', 'bridge-vlan', function(bvs) { - if (bvs.device == name) - uci.remove('network', bvs['.name']); - }); - } - - return form.GridSection.prototype.handleRemove.apply(this, arguments); - }; - function getDevice(section_id) { var m = section_id.match(/^dev:(.+)$/), name = m ? m[1] : uci.get('network', section_id, 'name'); @@ -1470,7 +1422,7 @@ return view.extend({ mac = dev ? dev.getMAC() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration.') + 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mac || _('unknown')) }, [ val.toUpperCase() ]) : (mac || '-'); }; @@ -1482,7 +1434,7 @@ return view.extend({ mtu = dev ? dev.getMTU() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration.') + 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mtu || _('unknown')) }, [ val ]) : (mtu || '-').toString(); }; diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js b/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js old mode 100644 new mode 100755 index da1330aec..7e11a3cb4 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js @@ -1,35 +1,22 @@ 'use strict'; 'require view'; -'require fs'; -'require uci'; 'require form'; 'require network'; 'require tools.widgets as widgets'; return view.extend({ load: function() { - return Promise.all([ - network.getDevices(), - fs.lines('/etc/iproute2/rt_tables') - ]); + return network.getDevices(); }, - render: function(data) { - var netDevs = data[0], - m, s, o; + render: function(netdevs) { + var m, s, o; - var rtTables = data[1].map(function(l) { - var m = l.trim().match(/^(\d+)\s+(\S+)$/); - return m ? [ +m[1], m[2] ] : null; - }).filter(function(e) { - return e && e[0] > 0; - }); - - m = new form.Map('network', _('Routing'), _('Routing defines over which interface and gateway a certain host or network can be reached.')); + m = new form.Map('network', _('Routes'), _('Routes specify over which interface and gateway a certain host or network can be reached.')); m.tabbed = true; - for (var family = 4; family <= 6; family += 2) { - s = m.section(form.GridSection, (family == 6) ? 'route6' : 'route', (family == 6) ? _('Static IPv6 Routes') : _('Static IPv4 Routes')); + for (var i = 4; i <= 6; i += 2) { + s = m.section(form.GridSection, (i == 4) ? 'route' : 'route6', (i == 4) ? _('Static IPv4 Routes') : _('Static IPv6 Routes')); s.anonymous = true; s.addremove = true; s.sortable = true; @@ -38,12 +25,44 @@ return view.extend({ s.tab('general', _('General Settings')); s.tab('advanced', _('Advanced Settings')); - o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface'), _('Specifies the logical interface name of the parent (or master) interface this route belongs to')); - o.loopback = true; + o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface')); + o.rmempty = false; o.nocreate = true; - o = s.taboption('general', form.ListValue, 'type', _('Route type'), _('Specifies the route type to be created')); + o = s.taboption('general', form.Flag, 'disabled', _('Disable'), _('Disable this route')); + o.rmempty = true; + o.default = o.disabled; + + o = s.taboption('general', form.Value, 'target', _('Target'), (i == 4) ? _('Host-IP or Network') : _('IPv6-Address or Network (CIDR)')); + o.datatype = (i == 4) ? 'ip4addr' : 'ip6addr'; + o.rmempty = false; + + if (i == 4) { + o = s.taboption('general', form.Value, 'netmask', _('IPv4-Netmask'), _('if target is a network')); + o.placeholder = '255.255.255.255'; + o.datatype = 'ip4addr'; + o.rmempty = true; + } + + o = s.taboption('general', form.Value, 'gateway', (i == 4) ? _('IPv4-Gateway') : _('IPv6-Gateway')); + o.datatype = (i == 4) ? 'ip4addr' : 'ip6addr'; + o.rmempty = true; + + o = s.taboption('advanced', form.Value, 'metric', _('Metric')); + o.placeholder = 0; + o.datatype = (i == 4) ? 'range(0,255)' : 'range(0,65535)'; + o.rmempty = true; + o.textvalue = function(section_id) { + return this.cfgvalue(section_id) || 0; + }; + + o = s.taboption('advanced', form.Value, 'mtu', _('MTU')); + o.placeholder = 1500; + o.datatype = 'range(64,9000)'; + o.rmempty = true; o.modalonly = true; + + o = s.taboption('advanced', form.ListValue, 'type', _('Route type')); o.value('', 'unicast'); o.value('local'); o.value('broadcast'); @@ -52,155 +71,36 @@ return view.extend({ o.value('prohibit'); o.value('blackhole'); o.value('anycast'); + o.default = ''; + o.rmempty = true; + o.modalonly = true; - o = s.taboption('general', form.Value, 'target', _('Target'), _('Network address')); - o.rmempty = false; - o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; - o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; + o = s.taboption('advanced', form.Value, 'table', _('Route table')); + o.value('local', 'local (255)'); + o.value('main', 'main (254)'); + o.value('default', 'default (253)'); + o.rmempty = true; + o.modalonly = true; o.cfgvalue = function(section_id) { - var section_type = uci.get('network', section_id, '.type'), - target = uci.get('network', section_id, 'target'), - mask = uci.get('network', section_id, 'netmask'), - v6 = (section_type == 'route6') ? true : false, - bits = mask ? network.maskToPrefix(mask, v6) : (v6 ? 128 : 32); - if (target) { - return target.split('/')[1] ? target : target + '/' + bits; - } + var cfgvalue = this.map.data.get('network', section_id, 'table'); + return cfgvalue || 'main'; + }; + + o = s.taboption('advanced', form.Value, 'source', _('Source Address')); + o.placeholder = E('em', _('automatic')); + for (var j = 0; j < netdevs.length; j++) { + var addrs = netdevs[j].getIPAddrs(); + for (var k = 0; k < addrs.length; k++) + o.value(addrs[k].split('/')[0]); } - o.write = function(section_id, formvalue) { - uci.set('network', section_id, 'target', formvalue); - uci.unset('network', section_id, 'netmask'); - } - - o = s.taboption('general', form.Value, 'gateway', _('Gateway'), _('Specifies the network gateway. If omitted, the gateway from the parent interface is taken if any, otherwise creates a link scope route. If set to 0.0.0.0 no gateway will be specified for the route')); - o.datatype = (family == 6) ? 'ip6addr("nomask")' : 'ip4addr("nomask")'; - o.placeholder = (family == 6) ? 'fe80::1' : '192.168.0.1'; - - o = s.taboption('advanced', form.Value, 'metric', _('Metric'), _('Specifies the route metric to use')); - o.datatype = 'uinteger'; - o.placeholder = 0; - o.textvalue = function(section_id) { - return this.cfgvalue(section_id) || 0; - }; - - o = s.taboption('advanced', form.Value, 'mtu', _('MTU'), _('Defines a specific MTU for this route')); + o.datatype = (i == 4) ? 'ip4addr' : 'ip6addr'; + o.default = ''; + o.rmempty = true; o.modalonly = true; - o.datatype = 'and(uinteger,range(64,9000))'; - o.placeholder = 1500; - o = s.taboption('advanced', form.Value, 'table', _('Table'), _('The rule target is a table lookup ID: a numeric table index ranging from 0 to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special aliases local (255), main (254) and default (253) are also valid')); - o.datatype = 'or(uinteger, string)'; - for (var i = 0; i < rtTables.length; i++) - o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); - o.textvalue = function(section_id) { - return this.cfgvalue(section_id) || 'main'; - }; - - o = s.taboption('advanced', form.Value, 'source', _('Source'), _('Specifies the preferred source address when sending to destinations covered by the target')); - o.modalonly = true; - o.datatype = (family == 6) ? 'ip6addr' : 'ip4addr'; - o.placeholder = E('em', _('auto')); - for (var i = 0; i < netDevs.length; i++) { - var addrs = (family == 6) ? netDevs[i].getIP6Addrs() : netDevs[i].getIPAddrs(); - for (var j = 0; j < addrs.length; j++) - o.value(addrs[j].split('/')[0]); - } - - o = s.taboption('advanced', form.Flag, 'onlink', _('On-link'), _('When enabled, gateway is on-link even if the gateway does not match any interface prefix')); - o.modalonly = true; - o.default = o.disabled; - - o = s.taboption('advanced', form.Flag, 'disabled', _('Disable')); - o.modalonly = false; - o.editable = true; - o.default = o.disabled; - } - - for (var family = 4; family <= 6; family += 2) { - s = m.section(form.GridSection, (family == 6) ? 'rule6' : 'rule', (family == 6) ? _('IPv6 Rules') : _('IPv4 Rules')); - s.anonymous = true; - s.addremove = true; - s.sortable = true; - s.nodescriptions = true; - - s.tab('general', _('General Settings')); - s.tab('advanced', _('Advanced Settings')); - - o = s.taboption('general', form.Value, 'priority', _('Priority'), _('Specifies the ordering of the IP rules')); - o.datatype = 'uinteger'; - o.placeholder = 30000; - o.textvalue = function(section_id) { - return this.cfgvalue(section_id) || E('em', _('auto')); - }; - - o = s.taboption('general', form.ListValue, 'action', _('Rule type'), _('Specifies the rule target routing action')); - o.modalonly = true; - o.value('', 'unicast'); - o.value('unreachable'); - o.value('prohibit'); - o.value('blackhole'); - o.value('throw'); - - o = s.taboption('general', widgets.NetworkSelect, 'in', _('Incoming interface'), _('Specifies the incoming logical interface name')); - o.loopback = true; - o.nocreate = true; - - o = s.taboption('general', form.Value, 'src', _('Source'), _('Specifies the source subnet to match (CIDR notation)')); - o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; - o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; - o.textvalue = function(section_id) { - return this.cfgvalue(section_id) || E('em', _('any')); - }; - - o = s.taboption('general', widgets.NetworkSelect, 'out', _('Outgoing interface'), _('Specifies the outgoing logical interface name')); - o.loopback = true; - o.nocreate = true; - - o = s.taboption('general', form.Value, 'dest', _('Destination'), _('Specifies the destination subnet to match (CIDR notation)')); - o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; - o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; - o.textvalue = function(section_id) { - return this.cfgvalue(section_id) || E('em', _('any')); - }; - - o = s.taboption('general', form.Value, 'lookup', _('Table'), _('The rule target is a table lookup ID: a numeric table index ranging from 0 to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special aliases local (255), main (254) and default (253) are also valid')); - o.datatype = 'or(uinteger, string)'; - for (var i = 0; i < rtTables.length; i++) - o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); - - o = s.taboption('advanced', form.Value, 'goto', _('Jump to rule'), _('The rule target is a jump to another rule specified by its priority value')); - o.modalonly = true; - o.datatype = 'uinteger'; - o.placeholder = 80000; - - o = s.taboption('advanced', form.Value, 'mark', _('Firewall mark'), _('Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match mark 255 or 0x0/0x1 to match any even mark value')); - o.modalonly = true; - o.datatype = 'string'; - o.placeholder = '0x1/0xf'; - - o = s.taboption('advanced', form.Value, 'tos', _('Type of service'), _('Specifies the TOS value to match in IP headers')); - o.modalonly = true; - o.datatype = 'uinteger'; - o.placeholder = 10; - - o = s.taboption('advanced', form.Value, 'uidrange', _('User identifier'), _('Specifies an individual UID or range of UIDs to match, e.g. 1000 to match corresponding UID or 1000-1005 to inclusively match all UIDs within the corresponding range')); - o.modalonly = true; - o.datatype = 'string'; - o.placeholder = '1000-1005'; - - o = s.taboption('advanced', form.Value, 'suppress_prefixlength', _('Prefix suppressor'), _('Reject routing decisions that have a prefix length less than or equal to the specified value')); - o.modalonly = true; - o.datatype = (family == 6) ? 'ip6prefix' : 'ip4prefix'; - o.placeholder = (family == 6) ? 64 : 24; - - o = s.taboption('advanced', form.Flag, 'invert', _('Invert match'), _('If set, the meaning of the match options is inverted')); - o.modalonly = true; - o.default = o.disabled; - - o = s.taboption('advanced', form.Flag, 'disabled', _('Disable')); - o.modalonly = false; - o.editable = true; + o = s.taboption('advanced', form.Flag, 'onlink', _('On-Link route')); o.default = o.disabled; + o.rmempty = true; } return m.render(); diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js b/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js old mode 100644 new mode 100755 index 535a133e7..3133d2725 --- a/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js @@ -180,10 +180,8 @@ return view.extend({ s = m.section(form.NamedSection, sid, 'switch', switch_title); s.addremove = false; - if (feat.vlan_option) { - o = s.option(form.Flag, feat.vlan_option, _('Enable VLAN functionality')); - o.rmempty = false; - } + if (feat.vlan_option) + s.option(form.Flag, feat.vlan_option, _('Enable VLAN functionality')); if (feat.learning_option) { o = s.option(form.Flag, feat.learning_option, _('Enable learning and aging')); @@ -224,7 +222,7 @@ return view.extend({ s.filter = function(section_id) { var device = uci.get('network', section_id, 'device'); - return (device == this.device); + return (device == switch_name); }; s.cfgsections = function() { @@ -248,7 +246,7 @@ return view.extend({ max_vid = 0; for (var j = 0; j < sections.length; j++) { - if (sections[j].device != this.device) + if (sections[j].device != s.device) continue; var vlan = +sections[j].vlan, @@ -261,7 +259,7 @@ return view.extend({ max_vid = vid; } - uci.set('network', section_id, 'device', this.device); + uci.set('network', section_id, 'device', s.device); uci.set('network', section_id, 'vlan', max_vlan + 1); if (feat.vid_option) @@ -270,6 +268,8 @@ return view.extend({ return this.map.save(null, true); }; + var port_opts = []; + o = s.option(form.Value, feat.vid_option || 'vlan', 'VLAN ID'); o.rmempty = false; o.forcewrite = true; @@ -297,23 +297,21 @@ return view.extend({ return true; }; - var port_opts = o.port_opts = []; - o.write = function(section_id, value) { var topology = this.section.topology, values = []; - for (var i = 0; i < this.port_opts.length; i++) { - var tagging = this.port_opts[i].formvalue(section_id), + for (var i = 0; i < port_opts.length; i++) { + var tagging = port_opts[i].formvalue(section_id), portspec = Array.isArray(topology.ports) ? topology.ports[i] : null; if (tagging == 't') - values.push(this.port_opts[i].option + tagging); + values.push(port_opts[i].option + tagging); else if (tagging == 'u') - values.push(this.port_opts[i].option); + values.push(port_opts[i].option); if (portspec && portspec.device) { - var old_tag = this.port_opts[i].cfgvalue(section_id), + var old_tag = port_opts[i].cfgvalue(section_id), old_vid = this.cfgvalue(section_id); if (old_tag != tagging || old_vid != value) { diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js b/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js old mode 100644 new mode 100755 index 6b1bd262f..5115a69eb --- a/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js +++ b/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js @@ -314,15 +314,23 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.channels = { '2g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], '5g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], - '6g': L.hasSystemFeature('hostapd', 'acs') ? [ 'auto', 'auto', true ] : [], + '6g': [], '60g': [] }; for (var i = 0; i < data[1].length; i++) { - if (!data[1][i].band) - continue; + var band; - var band = '%dg'.format(data[1][i].band); + if (data[1][i].mhz >= 2412 && data[1][i].mhz <= 2484) + band = '2g'; + else if (data[1][i].mhz >= 5160 && data[1][i].mhz <= 5885) + band = '5g'; + else if (data[1][i].mhz >= 5925 && data[1][i].mhz <= 7125) + band = '6g'; + else if (data[1][i].mhz >= 58329 && data[1][i].mhz <= 69120) + band = '60g'; + else + continue; this.channels[band].push( data[1][i].channel, @@ -335,10 +343,10 @@ var CBIWifiFrequencyValue = form.Value.extend({ .reduce(function(o, v) { o[v] = true; return o }, {}); this.modes = [ - '', 'Legacy', hwmodelist.a || hwmodelist.b || hwmodelist.g, + '', 'Legacy', true, 'n', 'N', hwmodelist.n, - 'ac', 'AC', L.hasSystemFeature('hostapd', '11ac') && hwmodelist.ac, - 'ax', 'AX', L.hasSystemFeature('hostapd', '11ax') && hwmodelist.ax + 'ac', 'AC', hwmodelist.ac, + 'ax', 'AX', hwmodelist.ax ]; var htmodelist = L.toArray(data[0] ? data[0].getHTModes() : null) @@ -367,8 +375,7 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.bands = { '': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, - '5g', '5 GHz', this.channels['5g'].length > 3, - '60g', '60 GHz', this.channels['60g'].length > 0 + '5g', '5 GHz', this.channels['5g'].length > 3 ], 'n': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, @@ -379,8 +386,7 @@ var CBIWifiFrequencyValue = form.Value.extend({ ], 'ax': [ '2g', '2.4 GHz', this.channels['2g'].length > 3, - '5g', '5 GHz', this.channels['5g'].length > 3, - '6g', '6 GHz', this.channels['6g'].length > 3 + '5g', '5 GHz', this.channels['5g'].length > 3 ] }; }, this)); @@ -473,7 +479,7 @@ var CBIWifiFrequencyValue = form.Value.extend({ this.toggleWifiBand(elem); bwdt.value = htval; - chan.value = chval || (chan.options[0] ? chan.options[0].value : 'auto'); + chan.value = chval || chan.options[0].value; return elem; }, @@ -735,8 +741,7 @@ return view.extend({ load: function() { return Promise.all([ uci.changes(), - uci.load('wireless'), - uci.load('system') + uci.load('wireless') ]); }, @@ -936,7 +941,7 @@ return view.extend({ if (hwtype == 'mac80211') { o = ss.taboption('general', form.Flag, 'legacy_rates', _('Allow legacy 802.11b rates'), _('Legacy or badly behaving devices may require legacy 802.11b rates to interoperate. Airtime efficiency may be significantly reduced where these are used. It is recommended to not allow 802.11b rates where possible.')); - o.depends({'_freq': '2g', '!contains': true}); + o.depends({'_freq': '11g', '!contains': true}); o = ss.taboption('general', CBIWifiTxPowerValue, 'txpower', _('Maximum transmit power'), _('Specifies the maximum transmit power the wireless radio may use. Depending on regulatory requirements and wireless usage, the actual transmit power may be reduced by the driver.')); o.wifiNetwork = radioNet; @@ -980,7 +985,6 @@ return view.extend({ ss.tab('encryption', _('Wireless Security')); ss.tab('macfilter', _('MAC-Filter')); ss.tab('advanced', _('Advanced Settings')); - ss.tab('roaming', _('WLAN roaming'), _('Settings for assisting wireless clients in roaming between multiple APs: 802.11r, 802.11k and 802.11v')); o = ss.taboption('general', form.ListValue, 'mode', _('Mode')); o.value('ap', _('Access Point')); @@ -1085,7 +1089,6 @@ return view.extend({ o = ss.taboption('macfilter', form.DynamicList, 'maclist', _('MAC-List')); o.datatype = 'macaddr'; - o.retain = true; o.depends('macfilter', 'allow'); o.depends('macfilter', 'deny'); o.load = function(section_id) { @@ -1141,27 +1144,16 @@ return view.extend({ o.depends('mode', 'ap-wds'); o.default = o.enabled; - /* https://w1.fi/cgit/hostap/commit/?id=34f7c699a6bcb5c45f82ceb6743354ad79296078 */ - /* multicast_to_unicast https://github.com/openwrt/openwrt/commit/7babb978ad9d7fc29acb1ff86afb1eb343af303a */ - o = ss.taboption('advanced', form.Flag, 'multicast_to_unicast', _('Multi To Unicast'), _('ARP, IPv4 and IPv6 (even 802.1Q) with multicast destination MACs are unicast to the STA MAC address. Note: This is not Directed Multicast Service (DMS) in 802.11v. Note: might break receiver STA multicast expectations.')); - o.rmempty = true; - o = ss.taboption('advanced', form.Flag, 'isolate', _('Isolate Clients'), _('Prevents client-to-client communication')); o.depends('mode', 'ap'); o.depends('mode', 'ap-wds'); o = ss.taboption('advanced', form.Value, 'ifname', _('Interface name'), _('Override default interface name')); o.optional = true; - o.datatype = 'netdevname'; o.placeholder = radioNet.getIfname(); if (/^radio\d+\.network/.test(o.placeholder)) o.placeholder = ''; - o = ss.taboption('advanced', form.Value, 'macaddr', _('MAC address'), _('Override default MAC address - the range of usable addresses might be limited by the driver')); - o.optional = true; - o.placeholder = radioNet.getActiveBSSID(); - o.datatype = 'macaddr'; - o = ss.taboption('advanced', form.Flag, 'short_preamble', _('Short Preamble')); o.default = o.enabled; @@ -1179,7 +1171,7 @@ return view.extend({ o.optional = true; o.datatype = 'uinteger'; - o = ss.taboption('advanced', form.Value, 'max_inactivity', _('Station inactivity limit'), _('802.11v: BSS Max Idle. Units: seconds.')); + o = ss.taboption('advanced', form.Value, 'max_inactivity', _('Station inactivity limit'), _('sec')); o.optional = true; o.placeholder = 300; o.datatype = 'uinteger'; @@ -1282,7 +1274,7 @@ return view.extend({ if (has_hostapd || has_supplicant) { crypto_modes.push(['psk2', 'WPA2-PSK', 35]); crypto_modes.push(['psk-mixed', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]); - crypto_modes.push(['psk', 'WPA-PSK', 12]); + crypto_modes.push(['psk', 'WPA-PSK', 21]); } else { encr.description = _('WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP and ad-hoc mode) to be installed.'); @@ -1382,7 +1374,7 @@ return view.extend({ else if (hwtype == 'broadcom') { crypto_modes.push(['psk2', 'WPA2-PSK', 33]); crypto_modes.push(['psk+psk2', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]); - crypto_modes.push(['psk', 'WPA-PSK', 12]); + crypto_modes.push(['psk', 'WPA-PSK', 21]); crypto_modes.push(['wep-open', _('WEP Open System'), 11]); crypto_modes.push(['wep-shared', _('WEP Shared Key'), 10]); } @@ -1400,90 +1392,51 @@ return view.extend({ } - o = ss.taboption('encryption', form.Value, 'auth_server', _('RADIUS Authentication Server')); + o = ss.taboption('encryption', form.Value, 'auth_server', _('Radius-Authentication-Server')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'auth_port', _('RADIUS Authentication Port')); + o = ss.taboption('encryption', form.Value, 'auth_port', _('Radius-Authentication-Port'), _('Default %d').format(1812)); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; - o.placeholder = '1812'; - o = ss.taboption('encryption', form.Value, 'auth_secret', _('RADIUS Authentication Secret')); + o = ss.taboption('encryption', form.Value, 'auth_secret', _('Radius-Authentication-Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - o = ss.taboption('encryption', form.Value, 'acct_server', _('RADIUS Accounting Server')); + o = ss.taboption('encryption', form.Value, 'acct_server', _('Radius-Accounting-Server')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'acct_port', _('RADIUS Accounting Port')); + o = ss.taboption('encryption', form.Value, 'acct_port', _('Radius-Accounting-Port'), _('Default %d').format(1813)); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; - o.placeholder = '1813'; - o = ss.taboption('encryption', form.Value, 'acct_secret', _('RADIUS Accounting Secret')); + o = ss.taboption('encryption', form.Value, 'acct_secret', _('Radius-Accounting-Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - /* extra RADIUS settings start */ - o = ss.taboption('encryption', form.ListValue, 'dynamic_vlan', _('RADIUS Dynamic VLAN Assignment'), _('Required: Rejects auth if RADIUS server does not provide appropriate VLAN attributes.')); - add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); - o.value('0', _('Disabled')); - o.value('1', _('Optional')); - o.value('2', _('Required')); - o.write = function (section_id, value) { - return this.super('write', [section_id, (value == 0) ? null: value]); - } - - o = ss.taboption('encryption', form.Flag, 'per_sta_vif', _('RADIUS Per STA VLAN'), _('Each STA is assigned its own AP_VLAN interface.')); - add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); - - //hostapd internally defaults to vlan_naming=1 even with dynamic VLAN off - o = ss.taboption('encryption', form.Flag, 'vlan_naming', _('RADIUS VLAN Naming'), _('Off: vlanXXX, e.g., vlan1. On: vlan_tagged_interface.XXX, e.g. eth0.1.')); - add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); - - o = ss.taboption('encryption', widgets.DeviceSelect, 'vlan_tagged_interface', _('RADIUS VLAN Tagged Interface'), _('E.g. eth0, eth1')); - add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); - o.size = 1; - o.rmempty = true; - o.multiple = false; - o.noaliases = true; - o.nobridges = true; - o.nocreate = true; - o.noinactive = true; - - o = ss.taboption('encryption', form.Value, 'vlan_bridge', _('RADIUS VLAN Bridge Naming Scheme'), _('E.g. br-vlan or brvlan.')); - add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); - o.rmempty = true; - /* extra RADIUS settings end */ - - o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client'), _('Dynamic Authorization Extension client.')); + o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'dae_port', _('DAE-Port'), _('Dynamic Authorization Extension port.')); + o = ss.taboption('encryption', form.Value, 'dae_port', _('DAE-Port'), _('Default %d').format(3799)); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; - o.placeholder = '3799'; - o = ss.taboption('encryption', form.Value, 'dae_secret', _('DAE-Secret'), _('Dynamic Authorization Extension secret.')); + o = ss.taboption('encryption', form.Value, 'dae_secret', _('DAE-Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - //WPA(1) has only WPA IE. Only >= WPA2 has RSN IE Preauth frames. - o = ss.taboption('encryption', form.Flag, 'rsn_preauth', _('RSN Preauth'), _('Robust Security Network (RSN): Allow roaming preauth for WPA2-EAP networks (and advertise it in WLAN beacons). Only works if the specified network interface is a bridge. Shortens the time-critical reassociation process.')); - add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa2', 'wpa3', 'wpa3-mixed'] }); - o = ss.taboption('encryption', form.Value, '_wpa_key', _('Key')); o.depends('encryption', 'psk'); @@ -1547,117 +1500,66 @@ return view.extend({ // Probe 802.11r support (and EAP support as a proxy for Openwrt) var has_80211r = L.hasSystemFeature('hostapd', '11r') || L.hasSystemFeature('hostapd', 'eap'); - o = ss.taboption('roaming', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain')); + o = ss.taboption('encryption', form.Flag, 'ieee80211r', _('802.11r Fast Transition'), _('Enables fast roaming among access points that belong to the same Mobility Domain')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); if (has_80211r) add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); o.rmempty = true; - o = ss.taboption('roaming', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.')); + o = ss.taboption('encryption', form.Value, 'nasid', _('NAS ID'), _('Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not needed with normal WPA(2)-PSK.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.depends({ ieee80211r: '1' }); o.rmempty = true; - o = ss.taboption('roaming', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID')); + o = ss.taboption('encryption', form.Value, 'mobility_domain', _('Mobility Domain'), _('4-character hexadecimal ID')); o.depends({ ieee80211r: '1' }); o.placeholder = '4f57'; o.datatype = 'and(hexstring,length(4))'; o.rmempty = true; - o = ss.taboption('roaming', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]')); + o = ss.taboption('encryption', form.Value, 'reassociation_deadline', _('Reassociation Deadline'), _('time units (TUs / 1.024 ms) [1000-65535]')); o.depends({ ieee80211r: '1' }); o.placeholder = '1000'; o.datatype = 'range(1000,65535)'; o.rmempty = true; - o = ss.taboption('roaming', form.ListValue, 'ft_over_ds', _('FT protocol')); + o = ss.taboption('encryption', form.ListValue, 'ft_over_ds', _('FT protocol')); o.depends({ ieee80211r: '1' }); - o.value('0', _('FT over the Air')); o.value('1', _('FT over DS')); + o.value('0', _('FT over the Air')); o.rmempty = true; - o = ss.taboption('roaming', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.')); + o = ss.taboption('encryption', form.Flag, 'ft_psk_generate_local', _('Generate PMK locally'), _('When using a PSK, the PMK can be automatically generated. When enabled, the R0/R1 key options below are not applied. Disable this to use the R0 and R1 key options.')); o.depends({ ieee80211r: '1' }); o.default = o.enabled; o.rmempty = false; - o = ss.taboption('roaming', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes')); + o = ss.taboption('encryption', form.Value, 'r0_key_lifetime', _('R0 Key Lifetime'), _('minutes')); o.depends({ ieee80211r: '1' }); o.placeholder = '10000'; o.datatype = 'uinteger'; o.rmempty = true; - o = ss.taboption('roaming', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons')); + o = ss.taboption('encryption', form.Value, 'r1_key_holder', _('R1 Key Holder'), _('6-octet identifier as a hex string - no colons')); o.depends({ ieee80211r: '1' }); o.placeholder = '00004f577274'; o.datatype = 'and(hexstring,length(12))'; o.rmempty = true; - o = ss.taboption('roaming', form.Flag, 'pmk_r1_push', _('PMK R1 Push')); + o = ss.taboption('encryption', form.Flag, 'pmk_r1_push', _('PMK R1 Push')); o.depends({ ieee80211r: '1' }); o.placeholder = '0'; o.rmempty = true; - o = ss.taboption('roaming', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain.
Format: MAC-address,NAS-Identifier,128-bit key as hex string.
This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.')); + o = ss.taboption('encryption', form.DynamicList, 'r0kh', _('External R0 Key Holder List'), _('List of R0KHs in the same Mobility Domain.
Format: MAC-address,NAS-Identifier,128-bit key as hex string.
This list is used to map R0KH-ID (NAS Identifier) to a destination MAC address when requesting PMK-R1 key from the R0KH that the STA used during the Initial Mobility Domain Association.')); o.depends({ ieee80211r: '1' }); o.rmempty = true; - o = ss.taboption('roaming', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain.
Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string.
This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.')); + o = ss.taboption('encryption', form.DynamicList, 'r1kh', _('External R1 Key Holder List'), _ ('List of R1KHs in the same Mobility Domain.
Format: MAC-address,R1KH-ID as 6 octets with colons,128-bit key as hex string.
This list is used to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the R0KH. This is also the list of authorized R1KHs in the MD that can request PMK-R1 keys.')); o.depends({ ieee80211r: '1' }); o.rmempty = true; // End of 802.11r options - // Probe 802.11k and 802.11v support via EAP support (full hostapd has EAP) - if (L.hasSystemFeature('hostapd', 'eap')) { - /* 802.11k settings start */ o = - ss.taboption('roaming', form.Flag, 'ieee80211k', _('802.11k RRM'), _('Radio Resource Measurement - Sends beacons to assist roaming. Not all clients support this.')); - // add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['psk', 'psk2', 'psk-mixed', 'sae', 'sae-mixed'] }); - o.depends('mode', 'ap'); - o.depends('mode', 'ap-wds'); - - o = ss.taboption('roaming', form.Flag, 'rrm_neighbor_report', _('Neighbour Report'), _('802.11k: Enable neighbor report via radio measurements.')); - o.depends({ ieee80211k: '1' }); - o.default = o.enabled; - - o = ss.taboption('roaming', form.Flag, 'rrm_beacon_report', _('Beacon Report'), _('802.11k: Enable beacon report via radio measurements.')); - o.depends({ ieee80211k: '1' }); - o.default = o.enabled; - /* 802.11k settings end */ - - /* 802.11v settings start */ - o = ss.taboption('roaming', form.ListValue, 'time_advertisement', _('Time advertisement'), _('802.11v: Time Advertisement in management frames.')); - o.value('0', _('Disabled')); - o.value('2', _('Enabled')); - o.write = function (section_id, value) { - return this.super('write', [section_id, (value == 2) ? value: null]); - } - - //Pull current System TZ setting - var tz = uci.get('system', '@system[0]', 'timezone'); - o = ss.taboption('roaming', form.Value, 'time_zone', _('Time zone'), _('802.11v: Local Time Zone Advertisement in management frames.')); - o.value(tz); - o.rmempty = true; - - o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode', _('WNM Sleep Mode'), _('802.11v: Wireless Network Management (WNM) Sleep Mode (extended sleep mode for stations).')); - o.rmempty = true; - - /* wnm_sleep_mode_no_keys: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=bf98faaac8ed24cf7d3d93dd4fcd7304d109363b */ - o = ss.taboption('roaming', form.Flag, 'wnm_sleep_mode_no_keys', _('WNM Sleep Mode Fixes'), _('802.11v: Wireless Network Management (WNM) Sleep Mode Fixes: Prevents reinstallation attacks.')); - o.rmempty = true; - - o = ss.taboption('roaming', form.Flag, 'bss_transition', _('BSS Transition'), _('802.11v: Basic Service Set (BSS) transition management.')); - o.rmempty = true; - - /* in master, but not 21.02.1: proxy_arp */ - o = ss.taboption('roaming', form.Flag, 'proxy_arp', _('ProxyARP'), _('802.11v: Proxy ARP enables non-AP STA to remain in power-save for longer.')); - o.rmempty = true; - - /* TODO: na_mcast_to_ucast is missing: needs adding to hostapd.sh - nice to have */ - } - /* 802.11v settings end */ - } - - if (hwtype == 'mac80211') { o = ss.taboption('encryption', form.ListValue, 'eap_type', _('EAP-Method')); o.value('tls', 'TLS'); o.value('ttls', 'TTLS'); @@ -1774,7 +1676,7 @@ return view.extend({ if (hwtype == 'mac80211') { // ieee802.11w options o = ss.taboption('encryption', form.ListValue, 'ieee80211w', _('802.11w Management Frame Protection'), _("Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may have problems")); - o.value('0', _('Disabled')); + o.value('', _('Disabled')); o.value('1', _('Optional')); o.value('2', _('Required')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds', 'sta', 'sta-wds'], encryption: ['owe', 'psk2', 'psk-mixed', 'sae', 'sae-mixed', 'wpa2', 'wpa3', 'wpa3-mixed'] }); @@ -1782,14 +1684,7 @@ return view.extend({ o.defaults = { '2': [{ encryption: 'sae' }, { encryption: 'owe' }, { encryption: 'wpa3' }, { encryption: 'wpa3-mixed' }], '1': [{ encryption: 'sae-mixed'}], - '0': [] - }; - - o.write = function(section_id, value) { - if (value != this.default) - return form.ListValue.prototype.write.call(this, section_id, value); - else - return form.ListValue.prototype.remove.call(this, section_id); + '': [] }; o = ss.taboption('encryption', form.Value, 'ieee80211w_max_timeout', _('802.11w maximum timeout'), _('802.11w Association SA Query maximum timeout')); @@ -2061,8 +1956,6 @@ return view.extend({ }); }); }).then(L.bind(function() { - ui.showModal(null, E('p', { 'class': 'spinning' }, [ _('Loading data…') ])); - return this.renderMoreOptionsModal(section_id); }, this)); }; diff --git a/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json b/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json old mode 100644 new mode 100755 index 2fa3cf6ab..188c695f3 --- a/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json +++ b/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json @@ -46,9 +46,35 @@ } }, - "admin/network/routes": { - "title": "Routing", + "admin/network/dhcp": { + "title": "DHCP and DNS", "order": 30, + "action": { + "type": "view", + "path": "network/dhcp" + }, + "depends": { + "acl": [ "luci-mod-network-dhcp" ], + "uci": { "dhcp": true } + } + }, + + "admin/network/hosts": { + "title": "Hostnames", + "order": 40, + "action": { + "type": "view", + "path": "network/hosts" + }, + "depends": { + "acl": [ "luci-mod-network-dhcp" ], + "uci": { "dhcp": true } + } + }, + + "admin/network/routes": { + "title": "Static Routes", + "order": 50, "action": { "type": "view", "path": "network/routes" @@ -58,23 +84,9 @@ } }, - "admin/network/dhcp": { - "title": "DHCP and DNS", - "order": 40, - "action": { - "type": "view", - "path": "network/dhcp" - }, - "depends": { - "acl": [ "luci-mod-network-dhcp" ], - "fs": { "/usr/sbin/dnsmasq": "executable" }, - "uci": { "dhcp": true } - } - }, - "admin/network/diagnostics": { "title": "Diagnostics", - "order": 50, + "order": 60, "action": { "type": "view", "path": "network/diagnostics" diff --git a/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json b/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json old mode 100644 new mode 100755 index b377f395f..6943d9563 --- a/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json +++ b/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json @@ -8,9 +8,7 @@ "/proc/sys/net/ipv6/conf/*/mtu": [ "read" ], "/proc/sys/net/ipv6/conf/*/hop_limit": [ "read" ], "/usr/libexec/luci-peeraddr": [ "exec" ], - "/usr/lib/opkg/info/netifd.control": [ "read" ], - "/proc/sys/net/ipv[46]/conf/*": [ "read" ], - "/sys/class/net/*/brport/*": [ "read" ] + "/usr/lib/opkg/info/netifd.control": [ "read" ] }, "ubus": { "file": [ "exec" ], @@ -60,8 +58,7 @@ "/usr/bin/ping": [ "exec" ], "/usr/bin/ping6": [ "exec", "list" ], "/usr/bin/traceroute": [ "exec" ], - "/usr/bin/traceroute6": [ "exec", "list" ], - "/usr/bin/arp-scan": [ "exec", "list" ] + "/usr/bin/traceroute6": [ "exec", "list" ] }, "ubus": { "file": [ "exec", "stat" ] From 2d23d5d1c328cc38d8db614a9b935f872289f96b Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 06:28:34 +0800 Subject: [PATCH 12/73] fixx --- luci-app-dsvpn/Makefile | 0 .../resources/view/services/dsvpn.js | 0 luci-app-dsvpn/po/fr/dsvpn.po | 0 luci-app-dsvpn/po/fr/dsvpn.po~ | 0 luci-app-dsvpn/po/ru/dsvpn.po | 0 luci-app-dsvpn/po/templates/dsvpn.pot | 0 luci-app-dsvpn/po/zh_Hans/dsvpn.po | 0 luci-app-dsvpn/po/zh_Hans/dsvpn.po~ | 0 .../usr/share/luci/menu.d/luci-app-dsvpn.json | 0 .../usr/share/rpcd/acl.d/luci-app-dsvpn.json | 0 luci-app-firewall/Makefile | 0 .../luci-static/resources/tools/firewall.js | 0 .../resources/view/firewall/custom.js | 0 .../resources/view/firewall/forwards.js | 0 .../resources/view/firewall/rules.js | 0 .../resources/view/firewall/snats.js | 0 .../resources/view/firewall/zones.js | 10 +- luci-app-firewall/po/bg/firewall.po | 0 luci-app-firewall/po/ca/firewall.po | 0 luci-app-firewall/po/cs/firewall.po | 0 luci-app-firewall/po/de/firewall.po | 0 luci-app-firewall/po/el/firewall.po | 0 luci-app-firewall/po/en/firewall.po | 0 luci-app-firewall/po/es/firewall.po | 0 luci-app-firewall/po/fr/firewall.po | 0 luci-app-firewall/po/he/firewall.po | 0 luci-app-firewall/po/hi/firewall.po | 0 luci-app-firewall/po/hu/firewall.po | 0 luci-app-firewall/po/it/firewall.po | 0 luci-app-firewall/po/ja/firewall.po | 0 luci-app-firewall/po/ko/firewall.po | 0 luci-app-firewall/po/mr/firewall.po | 0 luci-app-firewall/po/ms/firewall.po | 0 luci-app-firewall/po/nb_NO/firewall.po | 0 luci-app-firewall/po/pl/firewall.po | 0 luci-app-firewall/po/pt/firewall.po | 0 luci-app-firewall/po/pt_BR/firewall.po | 0 luci-app-firewall/po/ro/firewall.po | 0 luci-app-firewall/po/ru/firewall.po | 0 luci-app-firewall/po/sk/firewall.po | 0 luci-app-firewall/po/sv/firewall.po | 0 luci-app-firewall/po/templates/firewall.pot | 0 luci-app-firewall/po/tr/firewall.po | 0 luci-app-firewall/po/uk/firewall.po | 0 luci-app-firewall/po/vi/firewall.po | 0 luci-app-firewall/po/zh_Hans/firewall.po | 0 luci-app-firewall/po/zh_Hant/firewall.po | 0 .../share/luci/menu.d/luci-app-firewall.json | 0 .../share/rpcd/acl.d/luci-app-firewall.json | 0 luci-app-glorytun-tcp/Makefile | 0 .../resources/view/services/glorytun-tcp.js | 0 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po | 0 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ | 0 luci-app-glorytun-tcp/po/ru/glorytun-tcp.po | 0 .../po/templates/glorytun-tcp.pot | 0 .../po/zh_Hans/glorytun-tcp.po | 0 .../po/zh_Hans/glorytun-tcp.po~ | 0 .../root/etc/hotplug.d/iface/30-glorytun | 0 .../root/etc/uci-defaults/1200-luci-glorytun | 0 .../luci/menu.d/luci-app-glorytun-tcp.json | 0 .../rpcd/acl.d/luci-app-glorytun-tcp.json | 0 luci-app-glorytun-udp/Makefile | 0 .../resources/view/services/glorytun-udp.js | 0 luci-app-glorytun-udp/po/fr/glorytun-udp.po | 0 luci-app-glorytun-udp/po/fr/glorytun-udp.po~ | 0 luci-app-glorytun-udp/po/ru/glorytun-udp.po | 0 .../po/templates/glorytun-udp.pot | 0 .../po/zh_Hans/glorytun-udp.po | 0 .../po/zh_Hans/glorytun-udp.po~ | 0 .../root/etc/config/glorytun-udp | 0 .../root/etc/hotplug.d/iface/30-glorytun-udp | 0 .../etc/uci-defaults/1201-luci-glorytun-udp | 0 .../luci/menu.d/luci-app-glorytun-udp.json | 0 .../rpcd/acl.d/luci-app-glorytun-udp.json | 0 luci-app-haproxy-tcp/LICENSE | 0 luci-app-haproxy-tcp/Makefile | 0 luci-app-haproxy-tcp/README.md | 0 .../luasrc/controller/haproxy-tcp.lua | 0 .../luasrc/model/cbi/haproxy-tcp.lua | 0 luci-app-haproxy-tcp/po/fr/haproxy-tcp.po | 0 .../po/templates/haproxy-tcp.pot | 0 luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po | 0 .../root/etc/config/haproxy-tcp | 0 .../root/etc/uci-defaults/41_luci-haproxy-tcp | 0 luci-app-https-dns-proxy/Makefile | 0 .../luasrc/controller/https-dns-proxy.lua | 0 .../ch.digitale-gesellschaft.dns.lua | 0 .../providers.disabled/cn.rubyfish.dns.lua | 0 .../providers.disabled/sb.dns.lua | 0 .../providers/com.adguard.dns-family.lua | 0 .../providers/com.adguard.dns.lua | 0 .../providers/com.cloudflare-dns-family.lua | 0 .../providers/com.cloudflare-dns-malware.lua | 0 .../providers/com.cloudflare-dns.lua | 0 .../https-dns-proxy/providers/cz.nic.odvr.lua | 0 .../https-dns-proxy/providers/google.dns.lua | 0 .../providers/gr.libredns.doh-ads.lua | 0 .../providers/gr.libredns.doh.lua | 0 .../providers/net.quad9.dns.lua | 0 .../providers/net.quad9.dns10.lua | 0 .../providers/net.quad9.dns11.lua | 0 .../providers/net.quad9.dns9.lua | 0 .../providers/org.cleanbrowsing.doh-adult.lua | 0 .../org.cleanbrowsing.doh-family.lua | 0 .../org.cleanbrowsing.doh-security.lua | 0 .../luasrc/model/cbi/https-dns-proxy.lua | 0 .../luasrc/view/https-dns-proxy/buttons.htm | 0 .../luasrc/view/https-dns-proxy/css.htm | 0 .../luasrc/view/https-dns-proxy/js.htm | 0 .../view/https-dns-proxy/status-textarea.htm | 0 .../luasrc/view/https-dns-proxy/status.htm | 0 .../po/bg/https-dns-proxy.po | 0 .../po/ca/https-dns-proxy.po | 0 .../po/cs/https-dns-proxy.po | 0 .../po/de/https-dns-proxy.po | 0 .../po/el/https-dns-proxy.po | 0 .../po/en/https-dns-proxy.po | 0 .../po/es/https-dns-proxy.po | 0 .../po/fr/https-dns-proxy.po | 0 .../po/he/https-dns-proxy.po | 0 .../po/hi/https-dns-proxy.po | 0 .../po/hu/https-dns-proxy.po | 0 .../po/it/https-dns-proxy.po | 0 .../po/ja/https-dns-proxy.po | 0 .../po/ko/https-dns-proxy.po | 0 .../po/mr/https-dns-proxy.po | 0 .../po/ms/https-dns-proxy.po | 0 .../po/nb_NO/https-dns-proxy.po | 0 .../po/pl/https-dns-proxy.po | 0 .../po/pt/https-dns-proxy.po | 0 .../po/pt_BR/https-dns-proxy.po | 0 .../po/ro/https-dns-proxy.po | 0 .../po/ru/https-dns-proxy.po | 0 .../po/sk/https-dns-proxy.po | 0 .../po/sv/https-dns-proxy.po | 0 .../po/templates/https-dns-proxy.pot | 0 .../po/tr/https-dns-proxy.po | 0 .../po/uk/https-dns-proxy.po | 0 .../po/vi/https-dns-proxy.po | 0 .../po/zh_Hans/https-dns-proxy.po | 0 .../po/zh_Hant/https-dns-proxy.po | 0 .../etc/uci-defaults/40_luci-https-dns-proxy | 0 .../luci/menu.d/luci-app-https-dns-proxy.json | 0 .../rpcd/acl.d/luci-app-https-dns-proxy.json | 0 luci-app-iperf/Makefile | 0 luci-app-iperf/luasrc/controller/iperf.lua | 0 luci-app-iperf/luasrc/view/iperf/test.htm | 0 luci-app-iperf/po/de/iperf.po | 0 luci-app-iperf/po/de/iperf.po~ | 0 luci-app-iperf/po/fr/iperf.po | 0 luci-app-iperf/po/fr/iperf.po~ | 0 luci-app-iperf/po/it/iperf.po | 0 luci-app-iperf/po/it/iperf.po~ | 0 luci-app-iperf/po/oc/iperf.po | 0 luci-app-iperf/po/oc/iperf.po~ | 0 luci-app-iperf/po/ru/iperf.po | 0 luci-app-iperf/po/templates/iperf.pot | 0 luci-app-iperf/po/zh_Hans/iperf.po | 0 luci-app-iperf/po/zh_Hans/iperf.po~ | 0 luci-app-iperf/root/etc/config/iperf | 0 .../usr/share/luci/menu.d/luci-app-iperf.json | 0 .../usr/share/rpcd/acl.d/luci-app-iperf.json | 0 luci-app-macvlan/po/zh_Hans/macvlan.po | 0 luci-app-mail/Makefile | 0 luci-app-mail/luasrc/controller/mail.lua | 0 luci-app-mail/luasrc/model/cbi/mail.lua | 0 luci-app-mail/po/de/mail.po | 0 luci-app-mail/po/de/mail.po~ | 0 luci-app-mail/po/fr/mail.po | 0 luci-app-mail/po/fr/mail.po~ | 0 luci-app-mail/po/it/mail.po | 0 luci-app-mail/po/it/mail.po~ | 0 luci-app-mail/po/oc/mail.po | 0 luci-app-mail/po/oc/mail.po~ | 0 luci-app-mail/po/ru/mail.po | 0 luci-app-mail/po/templates/mail.pot | 0 luci-app-mail/po/zh_Hans/mail.po | 0 luci-app-mail/po/zh_Hans/mail.po~ | 0 luci-app-mail/root/etc/config/mail | 0 .../usr/share/luci/menu.d/luci-app-mail.json | 0 .../usr/share/rpcd/acl.d/luci-app-mail.json | 0 luci-app-mlvpn/Makefile | 0 .../resources/view/services/mlvpn.js | 0 luci-app-mlvpn/po/fr/mlvpn.po | 0 luci-app-mlvpn/po/fr/mlvpn.po~ | 0 luci-app-mlvpn/po/ru/mlvpn.po | 0 luci-app-mlvpn/po/templates/mlvpn.pot | 0 luci-app-mlvpn/po/zh_Hans/mlvpn.po | 0 luci-app-mlvpn/po/zh_Hans/mlvpn.po~ | 0 .../usr/share/luci/menu.d/luci-app-mlvpn.json | 0 .../usr/share/rpcd/acl.d/luci-app-mlvpn.json | 0 luci-app-mptcp/Makefile | 0 .../luci-static/resources/seedrandom.js | 0 luci-app-mptcp/luasrc/controller/mptcp.lua | 0 luci-app-mptcp/luasrc/model/cbi/mptcp.lua | 0 .../luasrc/view/mptcp/mptcp_check.htm | 0 .../luasrc/view/mptcp/mptcp_connections.htm | 0 .../luasrc/view/mptcp/mptcp_fullmesh.htm | 0 .../luasrc/view/mptcp/mptcp_monitor.htm | 0 .../luasrc/view/mptcp/multipath.htm | 0 luci-app-mptcp/po/de/mptcp.po | 0 luci-app-mptcp/po/de/mptcp.po~ | 0 luci-app-mptcp/po/fr/mptcp.po | 0 luci-app-mptcp/po/it/mptcp.po | 0 luci-app-mptcp/po/it/mptcp.po~ | 0 luci-app-mptcp/po/oc/mptcp.po | 0 luci-app-mptcp/po/oc/mptcp.po~ | 0 luci-app-mptcp/po/ru/mptcp.po | 0 luci-app-mptcp/po/templates/mptcp.pot | 0 luci-app-mptcp/po/zh_Hans/mptcp.po | 0 .../usr/share/luci/menu.d/luci-app-mptcp.json | 0 .../usr/share/rpcd/acl.d/luci-app-mptcp.json | 0 luci-app-nginx-ha/LICENSE | 0 luci-app-nginx-ha/Makefile | 0 .../luasrc/controller/nginx-ha.lua | 0 .../luasrc/model/cbi/nginx-ha.lua | 0 luci-app-nginx-ha/po/fr/nginx-ha.po | 0 luci-app-nginx-ha/po/templates/nginx-ha.pot | 0 luci-app-nginx-ha/root/etc/config/nginx-ha | 0 .../root/etc/uci-defaults/42_luci-nginx-ha | 0 .../share/luci/menu.d/luci-app-nginx-ha.json | 0 .../share/rpcd/acl.d/luci-app-nginx-ha.json | 0 luci-app-omr-bypass/Makefile | 0 .../resources/view/services/omr-bypass.js | 0 luci-app-omr-bypass/po/de/omr-bypass.po | 0 luci-app-omr-bypass/po/de/omr-bypass.po~ | 0 luci-app-omr-bypass/po/fr/omr-bypass.po | 0 luci-app-omr-bypass/po/it/omr-bypass.po | 0 luci-app-omr-bypass/po/it/omr-bypass.po~ | 0 luci-app-omr-bypass/po/oc/omr-bypass.po | 0 luci-app-omr-bypass/po/oc/omr-bypass.po~ | 0 luci-app-omr-bypass/po/ru/omr-bypass.po | 0 .../po/templates/omr-bypass.pot | 0 luci-app-omr-bypass/po/zh_Hans/omr-bypass.po | 0 .../root/etc/config/omr-bypass | 0 .../root/etc/firewall.omr-bypass | 0 .../luci/menu.d/luci-app-omr-bypass.json | 0 .../usr/share/omr-bypass/omr-bypass-proto.lst | 0 .../root/usr/share/omr-bypass/omr-bypass.db | Bin .../share/rpcd/acl.d/luci-app-omr-bypass.json | 0 luci-app-omr-dscp/Makefile | 0 .../luasrc/controller/omr-dscp.lua | 0 .../luasrc/model/cbi/dscp-domains.lua | 0 luci-app-omr-dscp/luasrc/model/cbi/dscp.lua | 0 luci-app-omr-dscp/po/de/omr-dscp.po | 0 luci-app-omr-dscp/po/de/omr-dscp.po~ | 0 luci-app-omr-dscp/po/fr/omr-dscp.po | 0 luci-app-omr-dscp/po/fr/omr-dscp.po~ | 0 luci-app-omr-dscp/po/it/omr-dscp.po | 0 luci-app-omr-dscp/po/it/omr-dscp.po~ | 0 luci-app-omr-dscp/po/oc/omr-dscp.po | 0 luci-app-omr-dscp/po/oc/omr-dscp.po~ | 0 luci-app-omr-dscp/po/templates/omr-dscp.pot | 0 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po | 0 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ | 0 luci-app-omr-dscp/root/etc/config/dscp | 0 .../share/luci/menu.d/luci-app-omr-dscp.json | 0 .../share/rpcd/acl.d/luci-app-omr-dscp.json | 0 luci-app-omr-quota/Makefile | 0 .../luasrc/controller/quota.lua | 0 .../luasrc/model/cbi/quota/quota.lua | 0 .../luasrc/view/omr-quota/cbi-select-add.htm | 0 luci-app-omr-quota/po/de/omr-quota.po | 0 luci-app-omr-quota/po/de/omr-quota.po~ | 0 luci-app-omr-quota/po/fr/omr-quota.po | 0 luci-app-omr-quota/po/fr/omr-quota.po~ | 0 luci-app-omr-quota/po/it/omr-quota.po | 0 luci-app-omr-quota/po/it/omr-quota.po~ | 0 luci-app-omr-quota/po/oc/omr-quota.po | 0 luci-app-omr-quota/po/oc/omr-quota.po~ | 0 luci-app-omr-quota/po/ru/omr-quota.po | 0 luci-app-omr-quota/po/templates/omr-quota.pot | 0 luci-app-omr-quota/po/zh_Hans/omr-quota.po | 0 luci-app-omr-quota/po/zh_Hans/omr-quota.po~ | 0 .../share/luci/menu.d/luci-app-omr-quota.json | 0 .../share/rpcd/acl.d/luci-app-omr-quota.json | 0 luci-app-omr-tracker/Makefile | 0 .../luasrc/controller/omr-tracker.lua | 0 .../luasrc/model/cbi/omr-tracker.lua | 0 .../view/omr-tracker/cbi-select-add.htm | 0 luci-app-omr-tracker/po/de/omr-tracker.po | 0 luci-app-omr-tracker/po/de/omr-tracker.po~ | 0 luci-app-omr-tracker/po/fr/omr-tracker.po | 0 luci-app-omr-tracker/po/fr/omr-tracker.po~ | 0 luci-app-omr-tracker/po/it/omr-tracker.po | 0 luci-app-omr-tracker/po/it/omr-tracker.po~ | 0 luci-app-omr-tracker/po/oc/omr-tracker.po | 0 luci-app-omr-tracker/po/oc/omr-tracker.po~ | 0 .../po/templates/omr-tracker.pot | 0 .../po/zh_Hans/omr-tracker.po | 0 .../root/etc/uci-defaults/42_luci-omr-tracker | 0 .../luci/menu.d/luci-app-omr-tracker.json | 0 .../rpcd/acl.d/luci-app-omr-tracker.json | 0 .../openmptcprouter/css/wanstatus.css | 0 .../openmptcprouter/images/status-doing.png | Bin .../openmptcprouter/images/status-done.png | Bin .../openmptcprouter/images/status-error.png | Bin .../openmptcprouter/images/status-todo.png | Bin .../openmptcprouter/images/status-warn.png | Bin .../openmptcprouter/images/statusError.png | Bin .../openmptcprouter/images/statusOK.png | Bin .../openmptcprouter/images/statusWarning.png | Bin .../htdocs/luci-static/resources/spinner.gif | Bin .../luasrc/controller/openmptcprouter.lua | 0 .../luasrc/view/openmptcprouter/backup.htm | 0 .../luasrc/view/openmptcprouter/debug.htm | 0 .../luasrc/view/openmptcprouter/settings.htm | 0 .../luasrc/view/openmptcprouter/wanstatus.htm | 0 .../luasrc/view/openmptcprouter/wizard.htm | 0 .../po/de/openmptcprouter.po | 0 .../po/de/openmptcprouter.po~ | 0 .../po/fr/openmptcprouter.po | 0 .../po/fr/openmptcprouter.po~ | 0 .../po/it/openmptcprouter.po | 0 .../po/it/openmptcprouter.po~ | 0 .../po/oc/openmptcprouter.po | 0 .../po/oc/openmptcprouter.po~ | 0 .../po/templates/openmptcprouter.pot | 0 .../po/zh_Hans/openmptcprouter.po | 0 .../po/zh_Hans/openmptcprouter.po~ | 0 .../root/bin/omr-modemmanager | 12 +- .../root/etc/config/openmptcprouter | 0 .../root/usr/libexec/rpcd/openmptcprouter | 6 +- .../luci/menu.d/luci-app-openmptcprouter.json | 0 .../rpcd/acl.d/luci-app-openmptcprouter.json | 0 luci-app-packet-capture/Makefile | 0 .../resources/view/packet_capture/tcpdump.js | 0 .../po/fr/packet-capture.po | 0 .../po/templates/packet-capture.pot | 0 .../po/zh_Hans/packet-capture.po | 0 .../root/etc/config/packet_capture | 0 .../luci/menu.d/luci-app-packet-capture.json | 0 .../rpcd/acl.d/luci-app-packet-capture.json | 0 luci-app-shadowsocks-libev/Makefile | 0 .../resources/shadowsocks-libev.js | 0 .../view/shadowsocks-libev/instances.js | 0 .../resources/view/shadowsocks-libev/rules.js | 0 .../view/shadowsocks-libev/servers.js | 0 .../luasrc/controller/shadowsocks-libev.lua | 0 .../po/bg/shadowsocks-libev.po | 0 .../po/ca/shadowsocks-libev.po | 0 .../po/cs/shadowsocks-libev.po | 0 .../po/de/shadowsocks-libev.po | 0 .../po/el/shadowsocks-libev.po | 0 .../po/en/shadowsocks-libev.po | 0 .../po/es/shadowsocks-libev.po | 0 .../po/fr/shadowsocks-libev.po | 0 .../po/he/shadowsocks-libev.po | 0 .../po/hi/shadowsocks-libev.po | 0 .../po/hu/shadowsocks-libev.po | 0 .../po/it/shadowsocks-libev.po | 0 .../po/ja/shadowsocks-libev.po | 0 .../po/ko/shadowsocks-libev.po | 0 .../po/ms/shadowsocks-libev.po | 0 .../po/nb_NO/shadowsocks-libev.po | 0 .../po/pl/shadowsocks-libev.po | 0 .../po/pt/shadowsocks-libev.po | 0 .../po/pt_BR/shadowsocks-libev.po | 0 .../po/ro/shadowsocks-libev.po | 0 .../po/ru/shadowsocks-libev.po | 0 .../po/sk/shadowsocks-libev.po | 0 .../po/sv/shadowsocks-libev.po | 0 .../po/templates/shadowsocks-libev.pot | 0 .../po/tr/shadowsocks-libev.po | 0 .../po/uk/shadowsocks-libev.po | 0 .../po/vi/shadowsocks-libev.po | 0 .../po/zh-cn/shadowsocks-libev.po | 0 .../po/zh-tw/shadowsocks-libev.po | 0 .../uci-defaults/40_luci-shadowsocks-libev | 0 .../menu.d/luci-app-shadowsocks-libev.json | 0 .../acl.d/luci-app-shadowsocks-libev.json | 0 luci-app-shutdown/Makefile | 0 .../resources/view/system/shutdown.js | 0 luci-app-shutdown/po/de/shutdown.po | 0 luci-app-shutdown/po/fr/shutdown.po | 0 luci-app-shutdown/po/it/shutdown.po | 0 luci-app-shutdown/po/oc/shutdown.po | 0 luci-app-shutdown/po/pl/shutdown.po | 0 luci-app-shutdown/po/ru/shutdown.po | 0 luci-app-shutdown/po/templates/shutdown.pot | 0 luci-app-shutdown/po/zh_Hans/shutdown.po | 0 .../share/luci/menu.d/luci-app-shutdown.json | 0 .../share/rpcd/acl.d/luci-app-shutdown.json | 0 luci-app-snmpd/luasrc/controller/snmpd.lua | 8 + luci-app-snmpd/luasrc/model/cbi/snmpd.lua | 141 +++++++ luci-app-snmpd/luasrc/view/snmpd.htm | 132 +++++++ luci-app-snmpd/po/de/snmpd.po | 184 +++++++++ luci-app-snmpd/po/fr/snmpd.po | 184 +++++++++ luci-app-snmpd/po/it/snmpd.po | 184 +++++++++ luci-app-snmpd/po/oc/snmpd.po | 184 +++++++++ luci-app-snmpd/po/zh_Hans/snmpd.po | 184 +++++++++ luci-app-snmpd/root/etc/config/snmpd | 91 +++++ luci-app-snmpd/root/etc/init.d/snmpd | 349 ++++++++++++++++++ .../root/etc/uci-defaults/4400-snmpd | 19 + luci-app-sqm-autorate/Makefile | 0 .../luci-static/resources/view/network/sqm.js | 0 luci-app-sqm-autorate/po/ar/sqm.po | 0 luci-app-sqm-autorate/po/bg/sqm.po | 0 luci-app-sqm-autorate/po/bn_BD/sqm.po | 0 luci-app-sqm-autorate/po/ca/sqm.po | 0 luci-app-sqm-autorate/po/cs/sqm.po | 0 luci-app-sqm-autorate/po/da/sqm.po | 0 luci-app-sqm-autorate/po/de/sqm.po | 0 luci-app-sqm-autorate/po/el/sqm.po | 0 luci-app-sqm-autorate/po/en/sqm.po | 0 luci-app-sqm-autorate/po/es/sqm.po | 0 luci-app-sqm-autorate/po/fi/sqm.po | 0 luci-app-sqm-autorate/po/fr/sqm.po | 0 luci-app-sqm-autorate/po/he/sqm.po | 0 luci-app-sqm-autorate/po/hi/sqm.po | 0 luci-app-sqm-autorate/po/hu/sqm.po | 0 luci-app-sqm-autorate/po/it/sqm.po | 0 luci-app-sqm-autorate/po/ja/sqm.po | 0 luci-app-sqm-autorate/po/ko/sqm.po | 0 luci-app-sqm-autorate/po/mr/sqm.po | 0 luci-app-sqm-autorate/po/ms/sqm.po | 0 luci-app-sqm-autorate/po/nb_NO/sqm.po | 0 luci-app-sqm-autorate/po/pl/sqm.po | 0 luci-app-sqm-autorate/po/pt/sqm.po | 0 luci-app-sqm-autorate/po/pt_BR/sqm.po | 0 luci-app-sqm-autorate/po/ro/sqm.po | 0 luci-app-sqm-autorate/po/ru/sqm.po | 0 luci-app-sqm-autorate/po/sk/sqm.po | 0 luci-app-sqm-autorate/po/sv/sqm.po | 0 luci-app-sqm-autorate/po/templates/sqm.pot | 0 luci-app-sqm-autorate/po/tr/sqm.po | 0 luci-app-sqm-autorate/po/uk/sqm.po | 0 luci-app-sqm-autorate/po/vi/sqm.po | 0 luci-app-sqm-autorate/po/zh_Hans/sqm.po | 0 luci-app-sqm-autorate/po/zh_Hant/sqm.po | 0 .../usr/share/luci/menu.d/luci-app-sqm.json | 0 .../usr/share/rpcd/acl.d/luci-app-sqm.json | 0 luci-app-sysupgrade/Makefile | 0 .../luasrc/view/sysupgrade.htm | 0 luci-app-sysupgrade/po/fr/sysupgrade.po | 0 luci-app-sysupgrade/po/fr/sysupgrade.po~ | 0 luci-app-sysupgrade/po/ru/sysupgrade.po | 0 .../po/templates/sysupgrade.pot | 0 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po | 0 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ | 0 .../luci/menu.d/luci-app-sysupgrade.json | 0 .../root/usr/share/rpcd/acl.d/sysupgrade.json | 0 .../www/luci-static/resources/sysupgrade.js | 0 luci-theme-argon/LICENSE | 0 luci-theme-argon/Makefile | 0 luci-theme-argon/README.md | 0 luci-theme-argon/README_ZH.md | 0 .../Screenshots/screenshot_pc.jpg | Bin .../Screenshots/screenshot_phone.jpg | Bin .../luci-static/argon/background/README.md | 0 .../htdocs/luci-static/argon/css/cascade.css | 0 .../htdocs/luci-static/argon/css/dark.css | 0 .../htdocs/luci-static/argon/favicon.ico | Bin .../luci-static/argon/fonts/TypoGraphica.eot | Bin .../luci-static/argon/fonts/TypoGraphica.svg | 0 .../luci-static/argon/fonts/TypoGraphica.ttf | Bin .../luci-static/argon/fonts/TypoGraphica.woff | Bin .../htdocs/luci-static/argon/fonts/argon.eot | Bin .../htdocs/luci-static/argon/fonts/argon.svg | 0 .../htdocs/luci-static/argon/fonts/argon.ttf | Bin .../htdocs/luci-static/argon/fonts/argon.woff | Bin .../argon/icon/android-icon-192x192.png | Bin .../argon/icon/apple-icon-144x144.png | Bin .../argon/icon/apple-icon-60x60.png | Bin .../argon/icon/apple-icon-72x72.png | Bin .../htdocs/luci-static/argon/icon/arrow.svg | 0 .../luci-static/argon/icon/browserconfig.xml | 0 .../luci-static/argon/icon/favicon-16x16.png | Bin .../luci-static/argon/icon/favicon-32x32.png | Bin .../luci-static/argon/icon/favicon-96x96.png | Bin .../luci-static/argon/icon/manifest.json | 0 .../argon/icon/ms-icon-144x144.png | Bin .../htdocs/luci-static/argon/icon/spinner.svg | 0 .../htdocs/luci-static/argon/img/argon.svg | 0 .../htdocs/luci-static/argon/img/bg1.jpg | Bin .../htdocs/luci-static/argon/img/blank.png | Bin .../luci-static/argon/img/volume_high.svg | 0 .../luci-static/argon/img/volume_off.svg | 0 .../htdocs/luci-static/argon/js/jquery.min.js | 0 .../luci-static/argon/js/polyfill.min.js | 0 .../luci-static/argon/less/cascade.less | 0 .../htdocs/luci-static/argon/less/dark.less | 0 .../htdocs/luci-static/argon/less/fonts.less | 0 .../luci-static/argon/less/pure-min.less | 0 .../luci-static/resources/menu-argon.js | 0 .../luasrc/view/themes/argon/footer_login.htm | 0 .../luasrc/view/themes/argon/header.htm | 0 .../luasrc/view/themes/argon/header_login.htm | 0 .../view/themes/argon/out_footer_login.htm | 0 .../view/themes/argon/out_header_login.htm | 0 .../luasrc/view/themes/argon/sysauth.htm | 0 .../root/etc/uci-defaults/30_luci-theme-argon | 0 luci-theme-openmptcprouter/Makefile | 0 .../luci-static/openmptcprouter/html5.js | 0 .../luci-static/openmptcprouter/mobile.css | 0 macvlan/Makefile | 0 macvlan/files/etc/config/macvlan | 0 .../etc/uci-defaults/40_luci-app-macvlan | 0 mlvpn/Makefile | 0 mlvpn/files/etc/config/mlvpn | 0 mlvpn/files/etc/uci-defaults/4100-mlvpn | 0 mlvpn/patches/020-remove-cdefs.patch | 0 modemmanager/files/10-report-down | 0 mptcp/Makefile | 0 mptcp/files/etc/hotplug.d/iface/30-mptcp | 0 mptcpd/Makefile | 0 mptcpd/patches/endian.patch | 0 mptcpd/patches/stub_error_h.patch | 0 508 files changed, 1673 insertions(+), 15 deletions(-) mode change 100755 => 100644 luci-app-dsvpn/Makefile mode change 100755 => 100644 luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js mode change 100755 => 100644 luci-app-dsvpn/po/fr/dsvpn.po mode change 100755 => 100644 luci-app-dsvpn/po/fr/dsvpn.po~ mode change 100755 => 100644 luci-app-dsvpn/po/ru/dsvpn.po mode change 100755 => 100644 luci-app-dsvpn/po/templates/dsvpn.pot mode change 100755 => 100644 luci-app-dsvpn/po/zh_Hans/dsvpn.po mode change 100755 => 100644 luci-app-dsvpn/po/zh_Hans/dsvpn.po~ mode change 100755 => 100644 luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json mode change 100755 => 100644 luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json mode change 100755 => 100644 luci-app-firewall/Makefile mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js mode change 100755 => 100644 luci-app-firewall/po/bg/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ca/firewall.po mode change 100755 => 100644 luci-app-firewall/po/cs/firewall.po mode change 100755 => 100644 luci-app-firewall/po/de/firewall.po mode change 100755 => 100644 luci-app-firewall/po/el/firewall.po mode change 100755 => 100644 luci-app-firewall/po/en/firewall.po mode change 100755 => 100644 luci-app-firewall/po/es/firewall.po mode change 100755 => 100644 luci-app-firewall/po/fr/firewall.po mode change 100755 => 100644 luci-app-firewall/po/he/firewall.po mode change 100755 => 100644 luci-app-firewall/po/hi/firewall.po mode change 100755 => 100644 luci-app-firewall/po/hu/firewall.po mode change 100755 => 100644 luci-app-firewall/po/it/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ja/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ko/firewall.po mode change 100755 => 100644 luci-app-firewall/po/mr/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ms/firewall.po mode change 100755 => 100644 luci-app-firewall/po/nb_NO/firewall.po mode change 100755 => 100644 luci-app-firewall/po/pl/firewall.po mode change 100755 => 100644 luci-app-firewall/po/pt/firewall.po mode change 100755 => 100644 luci-app-firewall/po/pt_BR/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ro/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ru/firewall.po mode change 100755 => 100644 luci-app-firewall/po/sk/firewall.po mode change 100755 => 100644 luci-app-firewall/po/sv/firewall.po mode change 100755 => 100644 luci-app-firewall/po/templates/firewall.pot mode change 100755 => 100644 luci-app-firewall/po/tr/firewall.po mode change 100755 => 100644 luci-app-firewall/po/uk/firewall.po mode change 100755 => 100644 luci-app-firewall/po/vi/firewall.po mode change 100755 => 100644 luci-app-firewall/po/zh_Hans/firewall.po mode change 100755 => 100644 luci-app-firewall/po/zh_Hant/firewall.po mode change 100755 => 100644 luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json mode change 100755 => 100644 luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json mode change 100755 => 100644 luci-app-glorytun-tcp/Makefile mode change 100755 => 100644 luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js mode change 100755 => 100644 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po mode change 100755 => 100644 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ mode change 100755 => 100644 luci-app-glorytun-tcp/po/ru/glorytun-tcp.po mode change 100755 => 100644 luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot mode change 100755 => 100644 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po mode change 100755 => 100644 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ mode change 100755 => 100644 luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun mode change 100755 => 100644 luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun mode change 100755 => 100644 luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json mode change 100755 => 100644 luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json mode change 100755 => 100644 luci-app-glorytun-udp/Makefile mode change 100755 => 100644 luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js mode change 100755 => 100644 luci-app-glorytun-udp/po/fr/glorytun-udp.po mode change 100755 => 100644 luci-app-glorytun-udp/po/fr/glorytun-udp.po~ mode change 100755 => 100644 luci-app-glorytun-udp/po/ru/glorytun-udp.po mode change 100755 => 100644 luci-app-glorytun-udp/po/templates/glorytun-udp.pot mode change 100755 => 100644 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po mode change 100755 => 100644 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ mode change 100755 => 100644 luci-app-glorytun-udp/root/etc/config/glorytun-udp mode change 100755 => 100644 luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp mode change 100755 => 100644 luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp mode change 100755 => 100644 luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json mode change 100755 => 100644 luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json mode change 100755 => 100644 luci-app-haproxy-tcp/LICENSE mode change 100755 => 100644 luci-app-haproxy-tcp/Makefile mode change 100755 => 100644 luci-app-haproxy-tcp/README.md mode change 100755 => 100644 luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua mode change 100755 => 100644 luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua mode change 100755 => 100644 luci-app-haproxy-tcp/po/fr/haproxy-tcp.po mode change 100755 => 100644 luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot mode change 100755 => 100644 luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po mode change 100755 => 100644 luci-app-haproxy-tcp/root/etc/config/haproxy-tcp mode change 100755 => 100644 luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp mode change 100755 => 100644 luci-app-https-dns-proxy/Makefile mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm mode change 100755 => 100644 luci-app-https-dns-proxy/po/bg/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ca/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/cs/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/de/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/el/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/en/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/es/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/fr/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/he/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/hi/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/hu/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/it/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ja/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ko/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/mr/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ms/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/pl/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/pt/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ro/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ru/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/sk/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/sv/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot mode change 100755 => 100644 luci-app-https-dns-proxy/po/tr/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/uk/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/vi/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy mode change 100755 => 100644 luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json mode change 100755 => 100644 luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json mode change 100755 => 100644 luci-app-iperf/Makefile mode change 100755 => 100644 luci-app-iperf/luasrc/controller/iperf.lua mode change 100755 => 100644 luci-app-iperf/luasrc/view/iperf/test.htm mode change 100755 => 100644 luci-app-iperf/po/de/iperf.po mode change 100755 => 100644 luci-app-iperf/po/de/iperf.po~ mode change 100755 => 100644 luci-app-iperf/po/fr/iperf.po mode change 100755 => 100644 luci-app-iperf/po/fr/iperf.po~ mode change 100755 => 100644 luci-app-iperf/po/it/iperf.po mode change 100755 => 100644 luci-app-iperf/po/it/iperf.po~ mode change 100755 => 100644 luci-app-iperf/po/oc/iperf.po mode change 100755 => 100644 luci-app-iperf/po/oc/iperf.po~ mode change 100755 => 100644 luci-app-iperf/po/ru/iperf.po mode change 100755 => 100644 luci-app-iperf/po/templates/iperf.pot mode change 100755 => 100644 luci-app-iperf/po/zh_Hans/iperf.po mode change 100755 => 100644 luci-app-iperf/po/zh_Hans/iperf.po~ mode change 100755 => 100644 luci-app-iperf/root/etc/config/iperf mode change 100755 => 100644 luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json mode change 100755 => 100644 luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json mode change 100755 => 100644 luci-app-macvlan/po/zh_Hans/macvlan.po mode change 100755 => 100644 luci-app-mail/Makefile mode change 100755 => 100644 luci-app-mail/luasrc/controller/mail.lua mode change 100755 => 100644 luci-app-mail/luasrc/model/cbi/mail.lua mode change 100755 => 100644 luci-app-mail/po/de/mail.po mode change 100755 => 100644 luci-app-mail/po/de/mail.po~ mode change 100755 => 100644 luci-app-mail/po/fr/mail.po mode change 100755 => 100644 luci-app-mail/po/fr/mail.po~ mode change 100755 => 100644 luci-app-mail/po/it/mail.po mode change 100755 => 100644 luci-app-mail/po/it/mail.po~ mode change 100755 => 100644 luci-app-mail/po/oc/mail.po mode change 100755 => 100644 luci-app-mail/po/oc/mail.po~ mode change 100755 => 100644 luci-app-mail/po/ru/mail.po mode change 100755 => 100644 luci-app-mail/po/templates/mail.pot mode change 100755 => 100644 luci-app-mail/po/zh_Hans/mail.po mode change 100755 => 100644 luci-app-mail/po/zh_Hans/mail.po~ mode change 100755 => 100644 luci-app-mail/root/etc/config/mail mode change 100755 => 100644 luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json mode change 100755 => 100644 luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json mode change 100755 => 100644 luci-app-mlvpn/Makefile mode change 100755 => 100644 luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js mode change 100755 => 100644 luci-app-mlvpn/po/fr/mlvpn.po mode change 100755 => 100644 luci-app-mlvpn/po/fr/mlvpn.po~ mode change 100755 => 100644 luci-app-mlvpn/po/ru/mlvpn.po mode change 100755 => 100644 luci-app-mlvpn/po/templates/mlvpn.pot mode change 100755 => 100644 luci-app-mlvpn/po/zh_Hans/mlvpn.po mode change 100755 => 100644 luci-app-mlvpn/po/zh_Hans/mlvpn.po~ mode change 100755 => 100644 luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json mode change 100755 => 100644 luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json mode change 100755 => 100644 luci-app-mptcp/Makefile mode change 100755 => 100644 luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js mode change 100755 => 100644 luci-app-mptcp/luasrc/controller/mptcp.lua mode change 100755 => 100644 luci-app-mptcp/luasrc/model/cbi/mptcp.lua mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/multipath.htm mode change 100755 => 100644 luci-app-mptcp/po/de/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/de/mptcp.po~ mode change 100755 => 100644 luci-app-mptcp/po/fr/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/it/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/it/mptcp.po~ mode change 100755 => 100644 luci-app-mptcp/po/oc/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/oc/mptcp.po~ mode change 100755 => 100644 luci-app-mptcp/po/ru/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/templates/mptcp.pot mode change 100755 => 100644 luci-app-mptcp/po/zh_Hans/mptcp.po mode change 100755 => 100644 luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json mode change 100755 => 100644 luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json mode change 100755 => 100644 luci-app-nginx-ha/LICENSE mode change 100755 => 100644 luci-app-nginx-ha/Makefile mode change 100755 => 100644 luci-app-nginx-ha/luasrc/controller/nginx-ha.lua mode change 100755 => 100644 luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua mode change 100755 => 100644 luci-app-nginx-ha/po/fr/nginx-ha.po mode change 100755 => 100644 luci-app-nginx-ha/po/templates/nginx-ha.pot mode change 100755 => 100644 luci-app-nginx-ha/root/etc/config/nginx-ha mode change 100755 => 100644 luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha mode change 100755 => 100644 luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json mode change 100755 => 100644 luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json mode change 100755 => 100644 luci-app-omr-bypass/Makefile mode change 100755 => 100644 luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js mode change 100755 => 100644 luci-app-omr-bypass/po/de/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/de/omr-bypass.po~ mode change 100755 => 100644 luci-app-omr-bypass/po/fr/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/it/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/it/omr-bypass.po~ mode change 100755 => 100644 luci-app-omr-bypass/po/oc/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/oc/omr-bypass.po~ mode change 100755 => 100644 luci-app-omr-bypass/po/ru/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/templates/omr-bypass.pot mode change 100755 => 100644 luci-app-omr-bypass/po/zh_Hans/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/root/etc/config/omr-bypass mode change 100755 => 100644 luci-app-omr-bypass/root/etc/firewall.omr-bypass mode change 100755 => 100644 luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json mode change 100755 => 100644 luci-app-omr-bypass/root/usr/share/omr-bypass/omr-bypass-proto.lst mode change 100755 => 100644 luci-app-omr-bypass/root/usr/share/omr-bypass/omr-bypass.db mode change 100755 => 100644 luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json mode change 100755 => 100644 luci-app-omr-dscp/Makefile mode change 100755 => 100644 luci-app-omr-dscp/luasrc/controller/omr-dscp.lua mode change 100755 => 100644 luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua mode change 100755 => 100644 luci-app-omr-dscp/luasrc/model/cbi/dscp.lua mode change 100755 => 100644 luci-app-omr-dscp/po/de/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/de/omr-dscp.po~ mode change 100755 => 100644 luci-app-omr-dscp/po/fr/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/fr/omr-dscp.po~ mode change 100755 => 100644 luci-app-omr-dscp/po/it/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/it/omr-dscp.po~ mode change 100755 => 100644 luci-app-omr-dscp/po/oc/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/oc/omr-dscp.po~ mode change 100755 => 100644 luci-app-omr-dscp/po/templates/omr-dscp.pot mode change 100755 => 100644 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ mode change 100755 => 100644 luci-app-omr-dscp/root/etc/config/dscp mode change 100755 => 100644 luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json mode change 100755 => 100644 luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json mode change 100755 => 100644 luci-app-omr-quota/Makefile mode change 100755 => 100644 luci-app-omr-quota/luasrc/controller/quota.lua mode change 100755 => 100644 luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua mode change 100755 => 100644 luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm mode change 100755 => 100644 luci-app-omr-quota/po/de/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/de/omr-quota.po~ mode change 100755 => 100644 luci-app-omr-quota/po/fr/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/fr/omr-quota.po~ mode change 100755 => 100644 luci-app-omr-quota/po/it/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/it/omr-quota.po~ mode change 100755 => 100644 luci-app-omr-quota/po/oc/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/oc/omr-quota.po~ mode change 100755 => 100644 luci-app-omr-quota/po/ru/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/templates/omr-quota.pot mode change 100755 => 100644 luci-app-omr-quota/po/zh_Hans/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/zh_Hans/omr-quota.po~ mode change 100755 => 100644 luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json mode change 100755 => 100644 luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json mode change 100755 => 100644 luci-app-omr-tracker/Makefile mode change 100755 => 100644 luci-app-omr-tracker/luasrc/controller/omr-tracker.lua mode change 100755 => 100644 luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua mode change 100755 => 100644 luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm mode change 100755 => 100644 luci-app-omr-tracker/po/de/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/de/omr-tracker.po~ mode change 100755 => 100644 luci-app-omr-tracker/po/fr/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/fr/omr-tracker.po~ mode change 100755 => 100644 luci-app-omr-tracker/po/it/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/it/omr-tracker.po~ mode change 100755 => 100644 luci-app-omr-tracker/po/oc/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/oc/omr-tracker.po~ mode change 100755 => 100644 luci-app-omr-tracker/po/templates/omr-tracker.pot mode change 100755 => 100644 luci-app-omr-tracker/po/zh_Hans/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker mode change 100755 => 100644 luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json mode change 100755 => 100644 luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/css/wanstatus.css mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-doing.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-done.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-error.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-todo.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-warn.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusError.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusOK.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusWarning.png mode change 100755 => 100644 luci-app-openmptcprouter/htdocs/luci-static/resources/spinner.gif mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm mode change 100755 => 100644 luci-app-openmptcprouter/po/de/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/de/openmptcprouter.po~ mode change 100755 => 100644 luci-app-openmptcprouter/po/fr/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/fr/openmptcprouter.po~ mode change 100755 => 100644 luci-app-openmptcprouter/po/it/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/it/openmptcprouter.po~ mode change 100755 => 100644 luci-app-openmptcprouter/po/oc/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/oc/openmptcprouter.po~ mode change 100755 => 100644 luci-app-openmptcprouter/po/templates/openmptcprouter.pot mode change 100755 => 100644 luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po~ mode change 100755 => 100644 luci-app-openmptcprouter/root/etc/config/openmptcprouter mode change 100755 => 100644 luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json mode change 100755 => 100644 luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json mode change 100755 => 100644 luci-app-packet-capture/Makefile mode change 100755 => 100644 luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js mode change 100755 => 100644 luci-app-packet-capture/po/fr/packet-capture.po mode change 100755 => 100644 luci-app-packet-capture/po/templates/packet-capture.pot mode change 100755 => 100644 luci-app-packet-capture/po/zh_Hans/packet-capture.po mode change 100755 => 100644 luci-app-packet-capture/root/etc/config/packet_capture mode change 100755 => 100644 luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json mode change 100755 => 100644 luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json mode change 100755 => 100644 luci-app-shadowsocks-libev/Makefile mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js mode change 100755 => 100644 luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua mode change 100755 => 100644 luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot mode change 100755 => 100644 luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev mode change 100755 => 100644 luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json mode change 100755 => 100644 luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json mode change 100755 => 100644 luci-app-shutdown/Makefile mode change 100755 => 100644 luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js mode change 100755 => 100644 luci-app-shutdown/po/de/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/fr/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/it/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/oc/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/pl/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/ru/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/templates/shutdown.pot mode change 100755 => 100644 luci-app-shutdown/po/zh_Hans/shutdown.po mode change 100755 => 100644 luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json mode change 100755 => 100644 luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json create mode 100644 luci-app-snmpd/luasrc/controller/snmpd.lua create mode 100644 luci-app-snmpd/luasrc/model/cbi/snmpd.lua create mode 100644 luci-app-snmpd/luasrc/view/snmpd.htm create mode 100644 luci-app-snmpd/po/de/snmpd.po create mode 100644 luci-app-snmpd/po/fr/snmpd.po create mode 100644 luci-app-snmpd/po/it/snmpd.po create mode 100644 luci-app-snmpd/po/oc/snmpd.po create mode 100644 luci-app-snmpd/po/zh_Hans/snmpd.po create mode 100644 luci-app-snmpd/root/etc/config/snmpd create mode 100755 luci-app-snmpd/root/etc/init.d/snmpd create mode 100755 luci-app-snmpd/root/etc/uci-defaults/4400-snmpd mode change 100755 => 100644 luci-app-sqm-autorate/Makefile mode change 100755 => 100644 luci-app-sqm-autorate/htdocs/luci-static/resources/view/network/sqm.js mode change 100755 => 100644 luci-app-sqm-autorate/po/ar/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/bg/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/bn_BD/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/ca/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/cs/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/da/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/de/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/el/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/en/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/es/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/fi/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/fr/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/he/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/hi/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/hu/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/it/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/ja/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/ko/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/mr/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/ms/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/nb_NO/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/pl/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/pt/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/pt_BR/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/ro/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/ru/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/sk/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/sv/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/templates/sqm.pot mode change 100755 => 100644 luci-app-sqm-autorate/po/tr/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/uk/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/vi/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/zh_Hans/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/po/zh_Hant/sqm.po mode change 100755 => 100644 luci-app-sqm-autorate/root/usr/share/luci/menu.d/luci-app-sqm.json mode change 100755 => 100644 luci-app-sqm-autorate/root/usr/share/rpcd/acl.d/luci-app-sqm.json mode change 100755 => 100644 luci-app-sysupgrade/Makefile mode change 100755 => 100644 luci-app-sysupgrade/luasrc/view/sysupgrade.htm mode change 100755 => 100644 luci-app-sysupgrade/po/fr/sysupgrade.po mode change 100755 => 100644 luci-app-sysupgrade/po/fr/sysupgrade.po~ mode change 100755 => 100644 luci-app-sysupgrade/po/ru/sysupgrade.po mode change 100755 => 100644 luci-app-sysupgrade/po/templates/sysupgrade.pot mode change 100755 => 100644 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po mode change 100755 => 100644 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ mode change 100755 => 100644 luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json mode change 100755 => 100644 luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json mode change 100755 => 100644 luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js mode change 100755 => 100644 luci-theme-argon/LICENSE mode change 100755 => 100644 luci-theme-argon/Makefile mode change 100755 => 100644 luci-theme-argon/README.md mode change 100755 => 100644 luci-theme-argon/README_ZH.md mode change 100755 => 100644 luci-theme-argon/Screenshots/screenshot_pc.jpg mode change 100755 => 100644 luci-theme-argon/Screenshots/screenshot_phone.jpg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/background/README.md mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/css/cascade.css mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/css/dark.css mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/favicon.ico mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/argon.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/blank.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/less/cascade.less mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/less/dark.less mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/less/fonts.less mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/resources/menu-argon.js mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/footer_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/header.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/header_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/sysauth.htm mode change 100755 => 100644 luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon mode change 100755 => 100644 luci-theme-openmptcprouter/Makefile mode change 100755 => 100644 luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js mode change 100755 => 100644 luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css mode change 100755 => 100644 macvlan/Makefile mode change 100755 => 100644 macvlan/files/etc/config/macvlan mode change 100755 => 100644 macvlan/files/etc/uci-defaults/40_luci-app-macvlan mode change 100755 => 100644 mlvpn/Makefile mode change 100755 => 100644 mlvpn/files/etc/config/mlvpn mode change 100755 => 100644 mlvpn/files/etc/uci-defaults/4100-mlvpn mode change 100755 => 100644 mlvpn/patches/020-remove-cdefs.patch mode change 100755 => 100644 modemmanager/files/10-report-down mode change 100755 => 100644 mptcp/Makefile mode change 100755 => 100644 mptcp/files/etc/hotplug.d/iface/30-mptcp mode change 100755 => 100644 mptcpd/Makefile mode change 100755 => 100644 mptcpd/patches/endian.patch mode change 100755 => 100644 mptcpd/patches/stub_error_h.patch diff --git a/luci-app-dsvpn/Makefile b/luci-app-dsvpn/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js b/luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/fr/dsvpn.po b/luci-app-dsvpn/po/fr/dsvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/fr/dsvpn.po~ b/luci-app-dsvpn/po/fr/dsvpn.po~ old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/ru/dsvpn.po b/luci-app-dsvpn/po/ru/dsvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/templates/dsvpn.pot b/luci-app-dsvpn/po/templates/dsvpn.pot old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/zh_Hans/dsvpn.po b/luci-app-dsvpn/po/zh_Hans/dsvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/zh_Hans/dsvpn.po~ b/luci-app-dsvpn/po/zh_Hans/dsvpn.po~ old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json b/luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json b/luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-firewall/Makefile b/luci-app-firewall/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js b/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js old mode 100755 new mode 100644 index 73eaa4a22..5ece96be2 --- a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js +++ b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js @@ -145,14 +145,14 @@ return view.extend({ o = s.taboption('general', form.Flag, 'masq', _('Masquerading')); o.editable = true; - o = s.taboption('general', form.Flag, 'fullcone', _('Full Cone')); + + o = s.taboption('general', form.Flag, 'fullcone', _('Full Cone')); o.editable = true; - o.depends('masq', '1'); - o = s.taboption('general', form.Flag, 'mtu_fix', _('MSS clamp')); - o.modalonly = true; + o.depends('masq', '1'); + o = s.taboption('general', form.Flag, 'mtu_fix', _('MSS clamping')); o.modalonly = true; - + o = s.taboption('general', widgets.NetworkSelect, 'network', _('Covered networks')); o.modalonly = true; o.multiple = true; diff --git a/luci-app-firewall/po/bg/firewall.po b/luci-app-firewall/po/bg/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ca/firewall.po b/luci-app-firewall/po/ca/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/cs/firewall.po b/luci-app-firewall/po/cs/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/de/firewall.po b/luci-app-firewall/po/de/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/el/firewall.po b/luci-app-firewall/po/el/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/en/firewall.po b/luci-app-firewall/po/en/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/es/firewall.po b/luci-app-firewall/po/es/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/fr/firewall.po b/luci-app-firewall/po/fr/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/he/firewall.po b/luci-app-firewall/po/he/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/hi/firewall.po b/luci-app-firewall/po/hi/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/hu/firewall.po b/luci-app-firewall/po/hu/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/it/firewall.po b/luci-app-firewall/po/it/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ja/firewall.po b/luci-app-firewall/po/ja/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ko/firewall.po b/luci-app-firewall/po/ko/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/mr/firewall.po b/luci-app-firewall/po/mr/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ms/firewall.po b/luci-app-firewall/po/ms/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/nb_NO/firewall.po b/luci-app-firewall/po/nb_NO/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/pl/firewall.po b/luci-app-firewall/po/pl/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/pt/firewall.po b/luci-app-firewall/po/pt/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/pt_BR/firewall.po b/luci-app-firewall/po/pt_BR/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ro/firewall.po b/luci-app-firewall/po/ro/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ru/firewall.po b/luci-app-firewall/po/ru/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/sk/firewall.po b/luci-app-firewall/po/sk/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/sv/firewall.po b/luci-app-firewall/po/sv/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/templates/firewall.pot b/luci-app-firewall/po/templates/firewall.pot old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/tr/firewall.po b/luci-app-firewall/po/tr/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/uk/firewall.po b/luci-app-firewall/po/uk/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/vi/firewall.po b/luci-app-firewall/po/vi/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/zh_Hans/firewall.po b/luci-app-firewall/po/zh_Hans/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/zh_Hant/firewall.po b/luci-app-firewall/po/zh_Hant/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json b/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json old mode 100755 new mode 100644 diff --git a/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json b/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/Makefile b/luci-app-glorytun-tcp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js b/luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po b/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ b/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/ru/glorytun-tcp.po b/luci-app-glorytun-tcp/po/ru/glorytun-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot b/luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po b/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ b/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun b/luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun b/luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json b/luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json b/luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/Makefile b/luci-app-glorytun-udp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js b/luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/fr/glorytun-udp.po b/luci-app-glorytun-udp/po/fr/glorytun-udp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/fr/glorytun-udp.po~ b/luci-app-glorytun-udp/po/fr/glorytun-udp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/ru/glorytun-udp.po b/luci-app-glorytun-udp/po/ru/glorytun-udp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/templates/glorytun-udp.pot b/luci-app-glorytun-udp/po/templates/glorytun-udp.pot old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po b/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ b/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/etc/config/glorytun-udp b/luci-app-glorytun-udp/root/etc/config/glorytun-udp old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp b/luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp b/luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json b/luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json b/luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/LICENSE b/luci-app-haproxy-tcp/LICENSE old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/Makefile b/luci-app-haproxy-tcp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/README.md b/luci-app-haproxy-tcp/README.md old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/po/fr/haproxy-tcp.po b/luci-app-haproxy-tcp/po/fr/haproxy-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot b/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po b/luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp b/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp b/luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/Makefile b/luci-app-https-dns-proxy/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua b/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua b/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/bg/https-dns-proxy.po b/luci-app-https-dns-proxy/po/bg/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ca/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ca/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/cs/https-dns-proxy.po b/luci-app-https-dns-proxy/po/cs/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/de/https-dns-proxy.po b/luci-app-https-dns-proxy/po/de/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/el/https-dns-proxy.po b/luci-app-https-dns-proxy/po/el/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/en/https-dns-proxy.po b/luci-app-https-dns-proxy/po/en/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/es/https-dns-proxy.po b/luci-app-https-dns-proxy/po/es/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/fr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/fr/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/he/https-dns-proxy.po b/luci-app-https-dns-proxy/po/he/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/hi/https-dns-proxy.po b/luci-app-https-dns-proxy/po/hi/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/hu/https-dns-proxy.po b/luci-app-https-dns-proxy/po/hu/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/it/https-dns-proxy.po b/luci-app-https-dns-proxy/po/it/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ja/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ja/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ko/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ko/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/mr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/mr/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ms/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ms/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po b/luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/pl/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pl/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/pt/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pt/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ro/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ro/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ru/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ru/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/sk/https-dns-proxy.po b/luci-app-https-dns-proxy/po/sk/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/sv/https-dns-proxy.po b/luci-app-https-dns-proxy/po/sv/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot b/luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/tr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/tr/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/uk/https-dns-proxy.po b/luci-app-https-dns-proxy/po/uk/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/vi/https-dns-proxy.po b/luci-app-https-dns-proxy/po/vi/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po b/luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po b/luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy b/luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json b/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json b/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json old mode 100755 new mode 100644 diff --git a/luci-app-iperf/Makefile b/luci-app-iperf/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-iperf/luasrc/controller/iperf.lua b/luci-app-iperf/luasrc/controller/iperf.lua old mode 100755 new mode 100644 diff --git a/luci-app-iperf/luasrc/view/iperf/test.htm b/luci-app-iperf/luasrc/view/iperf/test.htm old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/de/iperf.po b/luci-app-iperf/po/de/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/de/iperf.po~ b/luci-app-iperf/po/de/iperf.po~ old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/fr/iperf.po b/luci-app-iperf/po/fr/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/fr/iperf.po~ b/luci-app-iperf/po/fr/iperf.po~ old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/it/iperf.po b/luci-app-iperf/po/it/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/it/iperf.po~ b/luci-app-iperf/po/it/iperf.po~ old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/oc/iperf.po b/luci-app-iperf/po/oc/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/oc/iperf.po~ b/luci-app-iperf/po/oc/iperf.po~ old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/ru/iperf.po b/luci-app-iperf/po/ru/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/templates/iperf.pot b/luci-app-iperf/po/templates/iperf.pot old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/zh_Hans/iperf.po b/luci-app-iperf/po/zh_Hans/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/zh_Hans/iperf.po~ b/luci-app-iperf/po/zh_Hans/iperf.po~ old mode 100755 new mode 100644 diff --git a/luci-app-iperf/root/etc/config/iperf b/luci-app-iperf/root/etc/config/iperf old mode 100755 new mode 100644 diff --git a/luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json b/luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json old mode 100755 new mode 100644 diff --git a/luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json b/luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json old mode 100755 new mode 100644 diff --git a/luci-app-macvlan/po/zh_Hans/macvlan.po b/luci-app-macvlan/po/zh_Hans/macvlan.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/Makefile b/luci-app-mail/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-mail/luasrc/controller/mail.lua b/luci-app-mail/luasrc/controller/mail.lua old mode 100755 new mode 100644 diff --git a/luci-app-mail/luasrc/model/cbi/mail.lua b/luci-app-mail/luasrc/model/cbi/mail.lua old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/de/mail.po b/luci-app-mail/po/de/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/de/mail.po~ b/luci-app-mail/po/de/mail.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/fr/mail.po b/luci-app-mail/po/fr/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/fr/mail.po~ b/luci-app-mail/po/fr/mail.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/it/mail.po b/luci-app-mail/po/it/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/it/mail.po~ b/luci-app-mail/po/it/mail.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/oc/mail.po b/luci-app-mail/po/oc/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/oc/mail.po~ b/luci-app-mail/po/oc/mail.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/ru/mail.po b/luci-app-mail/po/ru/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/templates/mail.pot b/luci-app-mail/po/templates/mail.pot old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/zh_Hans/mail.po b/luci-app-mail/po/zh_Hans/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/zh_Hans/mail.po~ b/luci-app-mail/po/zh_Hans/mail.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mail/root/etc/config/mail b/luci-app-mail/root/etc/config/mail old mode 100755 new mode 100644 diff --git a/luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json b/luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json old mode 100755 new mode 100644 diff --git a/luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json b/luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/Makefile b/luci-app-mlvpn/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js b/luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/fr/mlvpn.po b/luci-app-mlvpn/po/fr/mlvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/fr/mlvpn.po~ b/luci-app-mlvpn/po/fr/mlvpn.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/ru/mlvpn.po b/luci-app-mlvpn/po/ru/mlvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/templates/mlvpn.pot b/luci-app-mlvpn/po/templates/mlvpn.pot old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/zh_Hans/mlvpn.po b/luci-app-mlvpn/po/zh_Hans/mlvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/zh_Hans/mlvpn.po~ b/luci-app-mlvpn/po/zh_Hans/mlvpn.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json b/luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json b/luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/Makefile b/luci-app-mptcp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js b/luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/controller/mptcp.lua b/luci-app-mptcp/luasrc/controller/mptcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/model/cbi/mptcp.lua b/luci-app-mptcp/luasrc/model/cbi/mptcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/multipath.htm b/luci-app-mptcp/luasrc/view/mptcp/multipath.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/de/mptcp.po b/luci-app-mptcp/po/de/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/de/mptcp.po~ b/luci-app-mptcp/po/de/mptcp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/fr/mptcp.po b/luci-app-mptcp/po/fr/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/it/mptcp.po b/luci-app-mptcp/po/it/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/it/mptcp.po~ b/luci-app-mptcp/po/it/mptcp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/oc/mptcp.po b/luci-app-mptcp/po/oc/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/oc/mptcp.po~ b/luci-app-mptcp/po/oc/mptcp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/ru/mptcp.po b/luci-app-mptcp/po/ru/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/templates/mptcp.pot b/luci-app-mptcp/po/templates/mptcp.pot old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/zh_Hans/mptcp.po b/luci-app-mptcp/po/zh_Hans/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/LICENSE b/luci-app-nginx-ha/LICENSE old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/Makefile b/luci-app-nginx-ha/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/luasrc/controller/nginx-ha.lua b/luci-app-nginx-ha/luasrc/controller/nginx-ha.lua old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua b/luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/po/fr/nginx-ha.po b/luci-app-nginx-ha/po/fr/nginx-ha.po old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/po/templates/nginx-ha.pot b/luci-app-nginx-ha/po/templates/nginx-ha.pot old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/etc/config/nginx-ha b/luci-app-nginx-ha/root/etc/config/nginx-ha old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha b/luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json b/luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json b/luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/Makefile b/luci-app-omr-bypass/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js b/luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/de/omr-bypass.po b/luci-app-omr-bypass/po/de/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/de/omr-bypass.po~ b/luci-app-omr-bypass/po/de/omr-bypass.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/fr/omr-bypass.po b/luci-app-omr-bypass/po/fr/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/it/omr-bypass.po b/luci-app-omr-bypass/po/it/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/it/omr-bypass.po~ b/luci-app-omr-bypass/po/it/omr-bypass.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/oc/omr-bypass.po b/luci-app-omr-bypass/po/oc/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/oc/omr-bypass.po~ b/luci-app-omr-bypass/po/oc/omr-bypass.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/ru/omr-bypass.po b/luci-app-omr-bypass/po/ru/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/templates/omr-bypass.pot b/luci-app-omr-bypass/po/templates/omr-bypass.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/zh_Hans/omr-bypass.po b/luci-app-omr-bypass/po/zh_Hans/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/etc/config/omr-bypass b/luci-app-omr-bypass/root/etc/config/omr-bypass old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/etc/firewall.omr-bypass b/luci-app-omr-bypass/root/etc/firewall.omr-bypass old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json b/luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/usr/share/omr-bypass/omr-bypass-proto.lst b/luci-app-omr-bypass/root/usr/share/omr-bypass/omr-bypass-proto.lst old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/usr/share/omr-bypass/omr-bypass.db b/luci-app-omr-bypass/root/usr/share/omr-bypass/omr-bypass.db old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json b/luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/Makefile b/luci-app-omr-dscp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/luasrc/controller/omr-dscp.lua b/luci-app-omr-dscp/luasrc/controller/omr-dscp.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua b/luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/luasrc/model/cbi/dscp.lua b/luci-app-omr-dscp/luasrc/model/cbi/dscp.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/de/omr-dscp.po b/luci-app-omr-dscp/po/de/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/de/omr-dscp.po~ b/luci-app-omr-dscp/po/de/omr-dscp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/fr/omr-dscp.po b/luci-app-omr-dscp/po/fr/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/fr/omr-dscp.po~ b/luci-app-omr-dscp/po/fr/omr-dscp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/it/omr-dscp.po b/luci-app-omr-dscp/po/it/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/it/omr-dscp.po~ b/luci-app-omr-dscp/po/it/omr-dscp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/oc/omr-dscp.po b/luci-app-omr-dscp/po/oc/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/oc/omr-dscp.po~ b/luci-app-omr-dscp/po/oc/omr-dscp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/templates/omr-dscp.pot b/luci-app-omr-dscp/po/templates/omr-dscp.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po b/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ b/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/root/etc/config/dscp b/luci-app-omr-dscp/root/etc/config/dscp old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json b/luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json b/luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/Makefile b/luci-app-omr-quota/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/luasrc/controller/quota.lua b/luci-app-omr-quota/luasrc/controller/quota.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua b/luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm b/luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/de/omr-quota.po b/luci-app-omr-quota/po/de/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/de/omr-quota.po~ b/luci-app-omr-quota/po/de/omr-quota.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/fr/omr-quota.po b/luci-app-omr-quota/po/fr/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/fr/omr-quota.po~ b/luci-app-omr-quota/po/fr/omr-quota.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/it/omr-quota.po b/luci-app-omr-quota/po/it/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/it/omr-quota.po~ b/luci-app-omr-quota/po/it/omr-quota.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/oc/omr-quota.po b/luci-app-omr-quota/po/oc/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/oc/omr-quota.po~ b/luci-app-omr-quota/po/oc/omr-quota.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/ru/omr-quota.po b/luci-app-omr-quota/po/ru/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/templates/omr-quota.pot b/luci-app-omr-quota/po/templates/omr-quota.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/zh_Hans/omr-quota.po b/luci-app-omr-quota/po/zh_Hans/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/zh_Hans/omr-quota.po~ b/luci-app-omr-quota/po/zh_Hans/omr-quota.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json b/luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json b/luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/Makefile b/luci-app-omr-tracker/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/luasrc/controller/omr-tracker.lua b/luci-app-omr-tracker/luasrc/controller/omr-tracker.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua b/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm b/luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/de/omr-tracker.po b/luci-app-omr-tracker/po/de/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/de/omr-tracker.po~ b/luci-app-omr-tracker/po/de/omr-tracker.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/fr/omr-tracker.po b/luci-app-omr-tracker/po/fr/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/fr/omr-tracker.po~ b/luci-app-omr-tracker/po/fr/omr-tracker.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/it/omr-tracker.po b/luci-app-omr-tracker/po/it/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/it/omr-tracker.po~ b/luci-app-omr-tracker/po/it/omr-tracker.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/oc/omr-tracker.po b/luci-app-omr-tracker/po/oc/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/oc/omr-tracker.po~ b/luci-app-omr-tracker/po/oc/omr-tracker.po~ old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/templates/omr-tracker.pot b/luci-app-omr-tracker/po/templates/omr-tracker.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/zh_Hans/omr-tracker.po b/luci-app-omr-tracker/po/zh_Hans/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker b/luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json b/luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json b/luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/css/wanstatus.css b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/css/wanstatus.css old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-doing.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-doing.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-done.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-done.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-error.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-error.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-todo.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-todo.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-warn.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/status-warn.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusError.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusError.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusOK.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusOK.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusWarning.png b/luci-app-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/statusWarning.png old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/htdocs/luci-static/resources/spinner.gif b/luci-app-openmptcprouter/htdocs/luci-static/resources/spinner.gif old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/de/openmptcprouter.po b/luci-app-openmptcprouter/po/de/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/de/openmptcprouter.po~ b/luci-app-openmptcprouter/po/de/openmptcprouter.po~ old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/fr/openmptcprouter.po b/luci-app-openmptcprouter/po/fr/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/fr/openmptcprouter.po~ b/luci-app-openmptcprouter/po/fr/openmptcprouter.po~ old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/it/openmptcprouter.po b/luci-app-openmptcprouter/po/it/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/it/openmptcprouter.po~ b/luci-app-openmptcprouter/po/it/openmptcprouter.po~ old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/oc/openmptcprouter.po b/luci-app-openmptcprouter/po/oc/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/oc/openmptcprouter.po~ b/luci-app-openmptcprouter/po/oc/openmptcprouter.po~ old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/templates/openmptcprouter.pot b/luci-app-openmptcprouter/po/templates/openmptcprouter.pot old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po b/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po~ b/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po~ old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/bin/omr-modemmanager b/luci-app-openmptcprouter/root/bin/omr-modemmanager index d53865837..3cdbbda6f 100755 --- a/luci-app-openmptcprouter/root/bin/omr-modemmanager +++ b/luci-app-openmptcprouter/root/bin/omr-modemmanager @@ -6,13 +6,11 @@ timeout 1 mmcli -L | while read MODEM; do MODEM_ID=$(echo $MODEM | awk -F' ' '{print $1}' | awk -F/ '{print $6}') MODEM_INFO="$(timeout 1 mmcli -m $MODEM_ID --output-keyvalue)" if [ -n "$MODEM_INFO" ] && [ "$(echo "$MODEM_INFO" | grep 'modem.generic.device ' | awk -F": " '{print $2}')" = "$MODEM_INTF" ]; then - PERCENT=$(echo "$MODEM_INFO" | grep 'modem.generic.signal-quality.value ' | awk -F": " '{print $2}') - [ -z "$PERCENT" ] && PERCENT=$(awk -v n="$(mmcli -m $MODEM_ID --command 'AT+CSQ')" 'BEGIN{ print int(n*10) }') - OPERATOR=$(echo "$MODEM_INFO" | grep 'modem.3gpp.operator-name ' | awk -F": " '{print $2}') - [ -z "$OPERATOR" ] && OPERATOR=$(mmcli -m $MODEM_ID --command 'AT+QSPN' | awk -F[\"\"] '{ print $2 }') - NUMBER=$(echo "$MODEM_INFO" | grep 'modem.generic.own-numbders.value[1]' | awk -F": " '{print $2}') - STATE=$(echo "$MODEM_INFO" | grep 'modem.generic.state ' | awk -F": " '{print $2}') - TYPE=$(echo "$MODEM_INFO" | grep 'modem.generic.access-technologies.value\[1\]' | awk -F": " '{print $2}') + PERCENT=$(echo "$MODEM_INFO" | grep -m 1 'modem.generic.signal-quality.value ' | awk -F": " '{print $2}') + OPERATOR=$(echo "$MODEM_INFO" | grep -m 1 'modem.3gpp.operator-name ' | awk -F": " '{print $2}') + NUMBER=$(echo "$MODEM_INFO" | grep -m 1 'modem.generic.own-numbders.value[1]' | awk -F": " '{print $2}') + STATE=$(echo "$MODEM_INFO" | grep -m 1 'modem.generic.state ' | awk -F": " '{print $2}') + TYPE=$(echo "$MODEM_INFO" | grep -m 1 'modem.generic.access-technologies.value\[1\]' | awk -F": " '{print $2}') [ -z "$INFO" ] && echo $PERCENT [ "$INFO" = "all" ] && echo "$PERCENT;$OPERATOR;$NUMBER;$STATE;$TYPE" exit diff --git a/luci-app-openmptcprouter/root/etc/config/openmptcprouter b/luci-app-openmptcprouter/root/etc/config/openmptcprouter old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter b/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter index 67f6f50b7..cec97258f 100755 --- a/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter +++ b/luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter @@ -93,8 +93,8 @@ function add_interface(add_interface_ifname) ucic:set("qos","wan" .. i,"interface") ucic:set("qos","wan" .. i,"classgroup","Default") ucic:set("qos","wan" .. i,"enabled","0") - ucic:set("qos","wan" .. i,"upload","1000000") - ucic:set("qos","wan" .. i,"download","1000000") + ucic:set("qos","wan" .. i,"upload","4000") + ucic:set("qos","wan" .. i,"download","100000") ucic:save("qos") ucic:commit("qos") @@ -163,7 +163,7 @@ function set_interface(intf,proto,ipaddr,netmask,gateway,sqmenabled,downloadspee ucic:set("qos",intf,"interface") ucic:set("qos",intf,"classgroup","Default") ucic:set("qos",intf,"enabled","0") - ucic:set("qos",intf,"upload","100000") + ucic:set("qos",intf,"upload","4000") ucic:set("qos",intf,"download","100000") end diff --git a/luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json b/luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json b/luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/Makefile b/luci-app-packet-capture/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js b/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/po/fr/packet-capture.po b/luci-app-packet-capture/po/fr/packet-capture.po old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/po/templates/packet-capture.pot b/luci-app-packet-capture/po/templates/packet-capture.pot old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/po/zh_Hans/packet-capture.po b/luci-app-packet-capture/po/zh_Hans/packet-capture.po old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/root/etc/config/packet_capture b/luci-app-packet-capture/root/etc/config/packet_capture old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/Makefile b/luci-app-shadowsocks-libev/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua b/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot b/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev b/luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json b/luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json b/luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/Makefile b/luci-app-shutdown/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js b/luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/de/shutdown.po b/luci-app-shutdown/po/de/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/fr/shutdown.po b/luci-app-shutdown/po/fr/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/it/shutdown.po b/luci-app-shutdown/po/it/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/oc/shutdown.po b/luci-app-shutdown/po/oc/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/pl/shutdown.po b/luci-app-shutdown/po/pl/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/ru/shutdown.po b/luci-app-shutdown/po/ru/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/templates/shutdown.pot b/luci-app-shutdown/po/templates/shutdown.pot old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/zh_Hans/shutdown.po b/luci-app-shutdown/po/zh_Hans/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json b/luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json b/luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/luasrc/controller/snmpd.lua b/luci-app-snmpd/luasrc/controller/snmpd.lua new file mode 100644 index 000000000..2694da219 --- /dev/null +++ b/luci-app-snmpd/luasrc/controller/snmpd.lua @@ -0,0 +1,8 @@ +local ucic = luci.model.uci.cursor() +local dt = require "luci.cbi.datatypes" +module("luci.controller.snmpd", package.seeall) + +function index() + entry({"admin", "network", "snmpd"}, alias("admin", "network", "snmpd", "index"), _("SNMPd")) + entry({"admin", "network", "snmpd", "index"}, cbi("snmpd")) +end diff --git a/luci-app-snmpd/luasrc/model/cbi/snmpd.lua b/luci-app-snmpd/luasrc/model/cbi/snmpd.lua new file mode 100644 index 000000000..132b3a1d2 --- /dev/null +++ b/luci-app-snmpd/luasrc/model/cbi/snmpd.lua @@ -0,0 +1,141 @@ +-- Copyright 2018 Ycarus (Yannick Chabanois) +-- Licensed to the public under the Apache License 2.0. + +m = Map("snmpd", translate("SNMPd"), translate("SNMPd settings interface (Beta)")) + +s = m:section(TypedSection, "snmpd", translate("General")) +s.addremove = false + +enabled = s:option(Flag, "enabled", translate("Enabled")) +enabled.rmempty = false + +network = s:option(Value, "network", translate("Networks")) +network.template = "cbi/network_netlist" +network.widget = "checkbox" +network.rmempty = true +network.cast = "string" +network.nocreate = true + +s = m:section(TypedSection, "system", translate("System")) +s.addremove = false + +sysLocation = s:option(Value, "sysLocation", translate("Location")) +sysContact = s:option(Value, "sysContact", translate("Contact")) +sysName = s:option(Value, "sysName", translate("Name")) +--sysServices = s:option(Value, "sysServices", translate("Services")) +--sysDescr = s:option(Value, "sysDescr", translate("Description")) +--sysObjectID = s:option(Value, "sysObjectID", translate("ObjectID")) + +s = m:section(TypedSection, "com2sec", translate("com2sec security")) +s.addremove = true + +secname = s:option(ListValue, "secname", translate("Server")) +secname.optional = false +secname:value("ro",translate("Read-only")) +secname:value("rw",translate("Read-write")) + +source = s:option(Value, "source", translate("Source")) +source.datatype = "host" +source.optional = false +source.rmempty = false + +community = s:option(Value, "community", translate("Community")) +community.optional = false +community.rmempty = false + +--s = m:section(TypedSection, "com2sec6", translate("com2sec6")) +--s.addremove = true + +--secname = s:option(ListValue, "secname", translate("secname")) +--secname.optional = false +--secname:value("ro",translate("Read-only")) +--secname:value("rw",translate("Read-write")) + +--source = s:option(Value, "source", translate("Source")) +--source.datatype = "host" +--source.optional = false +--source.rmempty = false + +--community = s:option(Value, "community", translate("Community")) +--community.optional = false +--community.rmempty = false + +s = m:section(TypedSection, "group", translate("Group"), translate("Groups help define access methods")) +s.addremove = true +s.anonymous = false + +secname = s:option(ListValue, "secname", translate("secname")) +secname.optional = false +secname:value("ro",translate("Read-only")) +secname:value("rw",translate("Read-write")) + +group = s:option(Value, "group", translate("Group")) +group.optional = false +group.rmempty = false + +version = s:option(ListValue, "version", translate("version")) +version.optional = false +version:value("v1","v1") +version:value("v2c","v2c") +version:value("usm","usm") + +s = m:section(TypedSection, "access", translate("Access")) +s.addremove = true +s.anonymous = false + +group = s:option(Value, "group", translate("Group")) +group.optional = false +group.rmempty = false + +version = s:option(ListValue, "version", translate("version")) +version.optional = false +version:value("any",translate("any")) +version:value("v1","v1") +version:value("v2c","v2c") +version:value("usm","usm") + +context = s:option(ListValue, "context", translate("Context")) +context.optional = false +context:value("none","none") + +level = s:option(ListValue, "level", translate("Level")) +level.optional = false +level:value("noauth",translate("noauth")) +level:value("auth",translate("auth")) + +read = s:option(ListValue, "read", translate("Read")) +read.optional = false +read:value("all","all") +read:value("none","none") + +write = s:option(ListValue, "write", translate("Write")) +write.optional = false +write:value("all","all") +write:value("none","none") + +notify = s:option(ListValue, "notify", translate("Notify")) +notify.optional = false +notify:value("all","all") +notify:value("none","none") + +--s = m:section(TypedSection, "engineid", translate("engineid")) +--s.addremove = false +--s.anonymous = true + +--engineid = s:option(Value, "engineid", translate("engineid")) +--engineidtype = s:option(ListValue, "engineidtype", translate("engineidtype")) +--engineidtype:value("1",translate("IPv4")) +--engineidtype:value("2",translate("IPv6")) +--engineidtype:value("3",translate("MAC")) +--engineidnic = s:option(Value, "engineidnic", translate("engineidnic")) + +s = m:section(TypedSection, "exec", translate("Exec")) +s.addremove = true +s.anonymous = true + +miboid = s:option(Value, "miboid", translate("ObjectID")) +name = s:option(Value, "name", translate("Name")) +prog = s:option(Value, "prog", translate("Program")) +args = s:option(Value, "args", translate("Arguments")) + +return m diff --git a/luci-app-snmpd/luasrc/view/snmpd.htm b/luci-app-snmpd/luasrc/view/snmpd.htm new file mode 100644 index 000000000..74e60ca9a --- /dev/null +++ b/luci-app-snmpd/luasrc/view/snmpd.htm @@ -0,0 +1,132 @@ +<%+header%> + + + +<% + local uci = require("luci.model.uci").cursor() + local hosts = uci:get_list("dhcp", uci:get_first("dhcp","dnsmasq"), "ipset") + local ips = uci:get_list("omr-bypass", "ips", "ip") + local dpi = uci:get_list("omr-bypass", "dpi", "proto") + local tmpfile = os.tmpname() + local dpi_available_proto = luci.util.execi("cat /proc/net/xt_ndpi/proto | awk '{print $3}' | sort -u | head -n -1") + local sys = require "luci.sys" + local ifaces = sys.net:devices() + local bypassif = uci:get("omr-bypass","defaults","ifname") or "" +%> +<% if stderr and #stderr > 0 then %>
<%=pcdata(stderr)%>
<% end %> +
+
+

<%:SNMPd%>

+
+ <%:General%> +
+
+ +
+ checked<% end %>> +
+
+
+ network +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +

<%:General%>

+ +
+
+
+
+
<%:Domain, IP or network%>
+
<%:Output interface%>
+
+
+
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+

<%:Protocols%>

+
+
+
+
<%:Protocols%>
+
<%:Output interface%>
+
+
+
+
+<% + local allprt="""" + local protos = {} + for l in io.lines("/proc/net/xt_ndpi/proto") do + local a,b,c,d = l:match('(%w+) (%w+)') + if b ~= "2" and not string.match(b,"custom") then + table.insert(protos,b) + end + end + table.sort(protos) + for _,b in ipairs(protos) do + allprt=allprt .. ","" .. b .. """ + end +%> +
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+ + +<%+footer%> diff --git a/luci-app-snmpd/po/de/snmpd.po b/luci-app-snmpd/po/de/snmpd.po new file mode 100644 index 000000000..cfe49bcae --- /dev/null +++ b/luci-app-snmpd/po/de/snmpd.po @@ -0,0 +1,184 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2020-10-05 12:39+0000\n" +"Last-Translator: Weblate Admin \n" +"Language-Team: German \n" +"Language: de\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.0.4\n" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 +msgid "Access" +msgstr "Zugriff" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:81 +#: luci-app-snmpd/luasrc/view/snmpd.htm:122 +msgid "Add" +msgstr "Hinzufügen" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:66 +#: luci-app-snmpd/luasrc/view/snmpd.htm:116 +msgid "All" +msgstr "alle" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 +msgid "Arguments" +msgstr "Parameter" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 +msgid "Community" +msgstr "Community" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 +msgid "Contact" +msgstr "Kontakt" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 +msgid "Context" +msgstr "Umgebung" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:54 +msgid "Domain, IP or network" +msgstr "FQDN, IP-Adresse oder CIDR-Netzmaske" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 +#: luci-app-snmpd/luasrc/view/snmpd.htm:24 +msgid "Enabled" +msgstr "Aktiv" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 +msgid "Exec" +msgstr "Ausführung" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 +#: luci-app-snmpd/luasrc/view/snmpd.htm:21 +#: luci-app-snmpd/luasrc/view/snmpd.htm:48 +msgid "General" +msgstr "Allgemein" + +#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 +msgid "Grant UCI access for luci-app-snmpd" +msgstr "UCI-Zugriff für luci-app-snmpd gewähren" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 +msgid "Group" +msgstr "Gruppe" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +msgid "Groups help define access methods" +msgstr "Gruppen ermöglichen es, Zugriffsmethoden festzulegen" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:64 +#: luci-app-snmpd/luasrc/view/snmpd.htm:114 +msgid "Interface" +msgstr "Schnittstelle" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 +msgid "Level" +msgstr "Ebene" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 +msgid "Location" +msgstr "Ort" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 +msgid "Name" +msgstr "Name" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 +msgid "Networks" +msgstr "Netzwerke" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 +msgid "Notify" +msgstr "Benachrichten" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 +msgid "ObjectID" +msgstr "Objekt-Identifikation" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:55 +#: luci-app-snmpd/luasrc/view/snmpd.htm:90 +msgid "Output interface" +msgstr "Ausgabe-Anschluss" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 +msgid "Program" +msgstr "Programm" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:85 +#: luci-app-snmpd/luasrc/view/snmpd.htm:89 +msgid "Protocols" +msgstr "Protokolle" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 +msgid "Read" +msgstr "Lesen" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 +msgid "Read-only" +msgstr "Nur-Lesen" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 +msgid "Read-write" +msgstr "Lesen/Schreiben" + +#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +#: luci-app-snmpd/luasrc/view/snmpd.htm:19 +#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 +msgid "SNMPd" +msgstr "SNMPd" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +msgid "SNMPd settings interface (Beta)" +msgstr "SNMPd Einstellungen (Beta)" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 +msgid "Server" +msgstr "Server" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 +msgid "Source" +msgstr "Quelle" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 +msgid "System" +msgstr "System" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 +msgid "Write" +msgstr "Schreiben" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 +msgid "any" +msgstr "jede" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 +msgid "auth" +msgstr "Authentifizierung" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 +msgid "com2sec security" +msgstr "com2sec-Sicherheit" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 +msgid "noauth" +msgstr "noauth/offen" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 +msgid "secname" +msgstr "sec-Name" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 +msgid "version" +msgstr "Version" diff --git a/luci-app-snmpd/po/fr/snmpd.po b/luci-app-snmpd/po/fr/snmpd.po new file mode 100644 index 000000000..7efb48a42 --- /dev/null +++ b/luci-app-snmpd/po/fr/snmpd.po @@ -0,0 +1,184 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-02-19 07:53+0000\n" +"Last-Translator: Weblate Admin \n" +"Language-Team: French \n" +"Language: fr\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.6.1\n" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 +msgid "Access" +msgstr "Accès" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:81 +#: luci-app-snmpd/luasrc/view/snmpd.htm:122 +msgid "Add" +msgstr "Ajouter" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:66 +#: luci-app-snmpd/luasrc/view/snmpd.htm:116 +msgid "All" +msgstr "Tout" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 +msgid "Arguments" +msgstr "Arguments" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 +msgid "Community" +msgstr "Communauté" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 +msgid "Contact" +msgstr "Contact" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 +msgid "Context" +msgstr "Contexte" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:54 +msgid "Domain, IP or network" +msgstr "Domaine, IP ou réseau" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 +#: luci-app-snmpd/luasrc/view/snmpd.htm:24 +msgid "Enabled" +msgstr "Activer" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 +msgid "Exec" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 +#: luci-app-snmpd/luasrc/view/snmpd.htm:21 +#: luci-app-snmpd/luasrc/view/snmpd.htm:48 +msgid "General" +msgstr "Général" + +#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 +msgid "Grant UCI access for luci-app-snmpd" +msgstr "Accorder l'accès UCI pour luci-app-snmpd" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 +msgid "Group" +msgstr "Groupe" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +msgid "Groups help define access methods" +msgstr "Les groupes aident à définir les méthodes d'accès" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:64 +#: luci-app-snmpd/luasrc/view/snmpd.htm:114 +msgid "Interface" +msgstr "Interface" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 +msgid "Level" +msgstr "Niveau" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 +msgid "Location" +msgstr "Localisation" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 +msgid "Name" +msgstr "Nom" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 +msgid "Networks" +msgstr "Réseaux" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 +msgid "Notify" +msgstr "Notifier" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 +msgid "ObjectID" +msgstr "ObjectID" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:55 +#: luci-app-snmpd/luasrc/view/snmpd.htm:90 +msgid "Output interface" +msgstr "Interface de sortie" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 +msgid "Program" +msgstr "Programme" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:85 +#: luci-app-snmpd/luasrc/view/snmpd.htm:89 +msgid "Protocols" +msgstr "Protocoles" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 +msgid "Read" +msgstr "Lecture" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 +msgid "Read-only" +msgstr "Lecture Seule" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 +msgid "Read-write" +msgstr "Lecture-écriture" + +#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +#: luci-app-snmpd/luasrc/view/snmpd.htm:19 +#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 +msgid "SNMPd" +msgstr "SNMPd" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +msgid "SNMPd settings interface (Beta)" +msgstr "Paramètres du protocole SNMPd (Beta)" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 +msgid "Server" +msgstr "Serveur" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 +msgid "Source" +msgstr "Source" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 +msgid "System" +msgstr "Système" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 +msgid "Write" +msgstr "Ecriture" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 +msgid "any" +msgstr "Tout" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 +msgid "auth" +msgstr "Authentification" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 +msgid "com2sec security" +msgstr "com2sec security" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 +msgid "noauth" +msgstr "pas d'authentification" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 +msgid "secname" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 +msgid "version" +msgstr "version" diff --git a/luci-app-snmpd/po/it/snmpd.po b/luci-app-snmpd/po/it/snmpd.po new file mode 100644 index 000000000..5517296de --- /dev/null +++ b/luci-app-snmpd/po/it/snmpd.po @@ -0,0 +1,184 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2022-02-21 21:14+0000\n" +"Last-Translator: Deleted User \n" +"Language-Team: Italian \n" +"Language: it\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.10.1\n" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 +msgid "Access" +msgstr "Accesso" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:81 +#: luci-app-snmpd/luasrc/view/snmpd.htm:122 +msgid "Add" +msgstr "Aggiungi" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:66 +#: luci-app-snmpd/luasrc/view/snmpd.htm:116 +msgid "All" +msgstr "Tutti" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 +msgid "Arguments" +msgstr "Parametri" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 +msgid "Community" +msgstr "Community" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 +msgid "Contact" +msgstr "Contatto" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 +msgid "Context" +msgstr "Contesto" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:54 +msgid "Domain, IP or network" +msgstr "Dominio, IP o rete" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 +#: luci-app-snmpd/luasrc/view/snmpd.htm:24 +msgid "Enabled" +msgstr "Abilitato" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 +msgid "Exec" +msgstr "Esegui" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 +#: luci-app-snmpd/luasrc/view/snmpd.htm:21 +#: luci-app-snmpd/luasrc/view/snmpd.htm:48 +msgid "General" +msgstr "Generale" + +#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 +msgid "Grant UCI access for luci-app-snmpd" +msgstr "Concedi l'accesso UCI per luci-app-snmpd" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 +msgid "Group" +msgstr "Gruppo" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +msgid "Groups help define access methods" +msgstr "I gruppi aiutano a definire i metodi di accesso" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:64 +#: luci-app-snmpd/luasrc/view/snmpd.htm:114 +msgid "Interface" +msgstr "Interfaccia" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 +msgid "Level" +msgstr "Livello" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 +msgid "Location" +msgstr "Sede" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 +msgid "Name" +msgstr "Nome" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 +msgid "Networks" +msgstr "Reti" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 +msgid "Notify" +msgstr "Notificare" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 +msgid "ObjectID" +msgstr "" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:55 +#: luci-app-snmpd/luasrc/view/snmpd.htm:90 +msgid "Output interface" +msgstr "Interfaccia di output" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 +msgid "Program" +msgstr "Programma" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:85 +#: luci-app-snmpd/luasrc/view/snmpd.htm:89 +msgid "Protocols" +msgstr "Protocollo" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 +msgid "Read" +msgstr "Leggi" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 +msgid "Read-only" +msgstr "Sola lettura" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 +msgid "Read-write" +msgstr "Leggi-Scrivi" + +#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +#: luci-app-snmpd/luasrc/view/snmpd.htm:19 +#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 +msgid "SNMPd" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +msgid "SNMPd settings interface (Beta)" +msgstr "Interfaccia delle impostazioni SNMPd (Beta)" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 +msgid "Server" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 +msgid "Source" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 +msgid "System" +msgstr "Sistema" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 +msgid "Write" +msgstr "Scrittura" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 +msgid "any" +msgstr "qualsiasi" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 +msgid "auth" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 +msgid "com2sec security" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 +msgid "noauth" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 +msgid "secname" +msgstr "" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 +msgid "version" +msgstr "versione" diff --git a/luci-app-snmpd/po/oc/snmpd.po b/luci-app-snmpd/po/oc/snmpd.po new file mode 100644 index 000000000..10292f065 --- /dev/null +++ b/luci-app-snmpd/po/oc/snmpd.po @@ -0,0 +1,184 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2020-08-31 17:15+0000\n" +"Last-Translator: Quentin PAGÈS \n" +"Language-Team: Occitan \n" +"Language: oc\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.0.4\n" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 +msgid "Access" +msgstr "Accès" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:81 +#: luci-app-snmpd/luasrc/view/snmpd.htm:122 +msgid "Add" +msgstr "Ajustar" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:66 +#: luci-app-snmpd/luasrc/view/snmpd.htm:116 +msgid "All" +msgstr "Tot" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 +msgid "Arguments" +msgstr "Arguments" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 +msgid "Community" +msgstr "Comunautat" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 +msgid "Contact" +msgstr "Contacte" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 +msgid "Context" +msgstr "Contèxt" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:54 +msgid "Domain, IP or network" +msgstr "Domeni, IP o ret" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 +#: luci-app-snmpd/luasrc/view/snmpd.htm:24 +msgid "Enabled" +msgstr "Activat" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 +msgid "Exec" +msgstr "Exec" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 +#: luci-app-snmpd/luasrc/view/snmpd.htm:21 +#: luci-app-snmpd/luasrc/view/snmpd.htm:48 +msgid "General" +msgstr "General" + +#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 +msgid "Grant UCI access for luci-app-snmpd" +msgstr "Acordar l'accès UCI a luci-app-snmpd" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 +msgid "Group" +msgstr "Grop" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +msgid "Groups help define access methods" +msgstr "Los grops ajudan a gerir los metòdes d'accès" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:64 +#: luci-app-snmpd/luasrc/view/snmpd.htm:114 +msgid "Interface" +msgstr "Interfàcia" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 +msgid "Level" +msgstr "Nivèl" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 +msgid "Location" +msgstr "Emplaçament" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 +msgid "Name" +msgstr "Nom" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 +msgid "Networks" +msgstr "Rets" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 +msgid "Notify" +msgstr "Notificar" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 +msgid "ObjectID" +msgstr "ObjectID" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:55 +#: luci-app-snmpd/luasrc/view/snmpd.htm:90 +msgid "Output interface" +msgstr "Interfàcia de sortida" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 +msgid "Program" +msgstr "Programa" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:85 +#: luci-app-snmpd/luasrc/view/snmpd.htm:89 +msgid "Protocols" +msgstr "Protocòls" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 +msgid "Read" +msgstr "Lectura" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 +msgid "Read-only" +msgstr "Lectura sola" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 +msgid "Read-write" +msgstr "Lectura-escritura" + +#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +#: luci-app-snmpd/luasrc/view/snmpd.htm:19 +#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 +msgid "SNMPd" +msgstr "SNMPd" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +msgid "SNMPd settings interface (Beta)" +msgstr "Interfàcia de paramètres SNMPd (Beta)" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 +msgid "Server" +msgstr "Servidor" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 +msgid "Source" +msgstr "Font" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 +msgid "System" +msgstr "Sistèma" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 +msgid "Write" +msgstr "Escritura" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 +msgid "any" +msgstr "Quin que siá" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 +msgid "auth" +msgstr "auth" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 +msgid "com2sec security" +msgstr "seguretat com2sec" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 +msgid "noauth" +msgstr "noauth" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 +msgid "secname" +msgstr "secname" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 +msgid "version" +msgstr "version" diff --git a/luci-app-snmpd/po/zh_Hans/snmpd.po b/luci-app-snmpd/po/zh_Hans/snmpd.po new file mode 100644 index 000000000..43c9d8f1d --- /dev/null +++ b/luci-app-snmpd/po/zh_Hans/snmpd.po @@ -0,0 +1,184 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2021-05-05 11:40+0000\n" +"Last-Translator: niergouge <1150108426@qq.com>\n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6.1\n" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82 +msgid "Access" +msgstr "访问" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:81 +#: luci-app-snmpd/luasrc/view/snmpd.htm:122 +msgid "Add" +msgstr "添加" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:66 +#: luci-app-snmpd/luasrc/view/snmpd.htm:116 +msgid "All" +msgstr "所有" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139 +msgid "Arguments" +msgstr "理由" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42 +msgid "Community" +msgstr "公共" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23 +msgid "Contact" +msgstr "联系" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97 +msgid "Context" +msgstr "语境" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:54 +msgid "Domain, IP or network" +msgstr "域,IP或网络" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9 +#: luci-app-snmpd/luasrc/view/snmpd.htm:24 +msgid "Enabled" +msgstr "启用" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132 +msgid "Exec" +msgstr "执行" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6 +#: luci-app-snmpd/luasrc/view/snmpd.htm:21 +#: luci-app-snmpd/luasrc/view/snmpd.htm:48 +msgid "General" +msgstr "通用" + +#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3 +msgid "Grant UCI access for luci-app-snmpd" +msgstr "授予UCI访问luci-app-snmpd的权限" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86 +msgid "Group" +msgstr "组" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63 +msgid "Groups help define access methods" +msgstr "定义访问组帮助方法" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:64 +#: luci-app-snmpd/luasrc/view/snmpd.htm:114 +msgid "Interface" +msgstr "接口" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101 +msgid "Level" +msgstr "级别" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22 +msgid "Location" +msgstr "位置" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137 +msgid "Name" +msgstr "名称" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12 +msgid "Networks" +msgstr "网络" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116 +msgid "Notify" +msgstr "通知" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136 +msgid "ObjectID" +msgstr "对象ID" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:55 +#: luci-app-snmpd/luasrc/view/snmpd.htm:90 +msgid "Output interface" +msgstr "输出接口" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138 +msgid "Program" +msgstr "程序" + +#: luci-app-snmpd/luasrc/view/snmpd.htm:85 +#: luci-app-snmpd/luasrc/view/snmpd.htm:89 +msgid "Protocols" +msgstr "协议" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106 +msgid "Read" +msgstr "读取" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69 +msgid "Read-only" +msgstr "只读" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70 +msgid "Read-write" +msgstr "读写" + +#: luci-app-snmpd/luasrc/controller/snmpd.lua:6 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +#: luci-app-snmpd/luasrc/view/snmpd.htm:19 +#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3 +msgid "SNMPd" +msgstr "SNMPd设置" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4 +msgid "SNMPd settings interface (Beta)" +msgstr "SNMPd设置界面(测试版)" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32 +msgid "Server" +msgstr "服务器" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37 +msgid "Source" +msgstr "源" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19 +msgid "System" +msgstr "系统" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111 +msgid "Write" +msgstr "写" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92 +msgid "any" +msgstr "任何" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104 +msgid "auth" +msgstr "认证" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29 +msgid "com2sec security" +msgstr "com2sec安全" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103 +msgid "noauth" +msgstr "无认证" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67 +msgid "secname" +msgstr "第二名称" + +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76 +#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90 +msgid "version" +msgstr "版本" diff --git a/luci-app-snmpd/root/etc/config/snmpd b/luci-app-snmpd/root/etc/config/snmpd new file mode 100644 index 000000000..09a89474f --- /dev/null +++ b/luci-app-snmpd/root/etc/config/snmpd @@ -0,0 +1,91 @@ + +config agent + option agentaddress 'UDP:161,UDP6:161' + +config agentx + option agentxsocket '/var/run/agentx.sock' + +config com2sec 'public' + option secname 'ro' + option source 'default' + option community 'public' + +config com2sec 'private' + option secname 'rw' + option source 'localhost' + option community 'private' + +config group 'public_v1' + option group 'public' + option version 'v1' + option secname 'ro' + +config group 'public_v2c' + option group 'public' + option version 'v2c' + option secname 'ro' + +config group 'public_usm' + option group 'public' + option version 'usm' + option secname 'ro' + +config group 'private_v1' + option group 'private' + option version 'v1' + option secname 'rw' + +config group 'private_v2c' + option group 'private' + option version 'v2c' + option secname 'rw' + +config group 'private_usm' + option group 'private' + option version 'usm' + option secname 'rw' + +config view 'all' + option viewname 'all' + option type 'included' + option oid '.1' + +config access 'public_access' + option group 'public' + option context 'none' + option version 'any' + option level 'noauth' + option prefix 'exact' + option read 'all' + option write 'none' + option notify 'none' + +config access 'private_access' + option group 'private' + option context 'none' + option version 'any' + option level 'noauth' + option prefix 'exact' + option read 'all' + option write 'all' + option notify 'all' + +config system + option sysLocation 'office' + option sysContact 'bofh@example.com' + option sysName 'OpenMPTCProuter' + +config exec + option name 'filedescriptors' + option prog '/bin/cat' + option args '/proc/sys/fs/file-nr' + +config engineid + option engineidtype '3' + option engineidnic 'eth0' + +config snmpd 'general' + list network 'lan' + option enabled '0' + option ipv6cpipv4 '1' + diff --git a/luci-app-snmpd/root/etc/init.d/snmpd b/luci-app-snmpd/root/etc/init.d/snmpd new file mode 100755 index 000000000..39fc71445 --- /dev/null +++ b/luci-app-snmpd/root/etc/init.d/snmpd @@ -0,0 +1,349 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2008 OpenWrt.org +START=50 + +USE_PROCD=1 +PROG="/usr/sbin/snmpd" + +CONFIGFILE="/var/run/snmpd.conf" + +snmpd_agent_add() { + local cfg="$1" + + config_get agentaddress "$cfg" agentaddress + [ -n "$agentaddress" ] || return 0 + echo "agentaddress $agentaddress" >> $CONFIGFILE +} + +snmpd_agentx_add() { + local cfg="$1" + echo "master agentx" >> $CONFIGFILE + config_get agentxsocket "$cfg" agentxsocket + [ -n "$agentxsocket" ] && echo "agentXSocket $agentxsocket" >> $CONFIGFILE +} + +snmpd_system_add() { + local cfg="$1" + config_get syslocation "$cfg" sysLocation + [ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $CONFIGFILE + config_get syscontact "$cfg" sysContact + [ -n "$syscontact" ] && echo "sysContact $syscontact" >> $CONFIGFILE + config_get sysname "$cfg" sysName + [ -n "$sysname" ] && echo "sysName $sysname" >> $CONFIGFILE + config_get sysservice "$cfg" sysService + [ -n "$sysservice" ] && echo "sysService $sysservice" >> $CONFIGFILE + config_get sysdescr "$cfg" sysDescr + [ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $CONFIGFILE + config_get sysobjectid "$cfg" sysObjectID + [ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $CONFIGFILE +} + +snmpd_com2sec_add() { + local cfg="$1" + config_get secname "$cfg" secname + [ -n "$secname" ] || return 0 + config_get source "$cfg" source + [ -n "$source" ] || return 0 + config_get community "$cfg" community + [ -n "$community" ] || return 0 + echo "com2sec $secname $source $community" >> $CONFIGFILE +} + +snmpd_com2sec6_add() { + local cfg="$1" + config_get secname "$cfg" secname + [ -n "$secname" ] || return 0 + config_get source "$cfg" source + [ -n "$source" ] || return 0 + config_get community "$cfg" community + [ -n "$community" ] || return 0 + echo "com2sec6 $secname $source $community" >> $CONFIGFILE +} + +snmpd_group_add() { + local cfg="$1" + config_get group "$cfg" group + [ -n "$group" ] || return 0 + config_get version "$cfg" version + [ -n "$version" ] || return 0 + config_get secname "$cfg" secname + [ -n "$secname" ] || return 0 + echo "group $group $version $secname" >> $CONFIGFILE +} + +snmpd_view_add() { + local cfg="$1" + config_get viewname "$cfg" viewname + [ -n "$viewname" ] || return 0 + config_get type "$cfg" type + [ -n "$type" ] || return 0 + config_get oid "$cfg" oid + [ -n "$oid" ] || return 0 + # optional mask + config_get mask "$cfg" mask + echo "view $viewname $type $oid $mask" >> $CONFIGFILE +} + +snmpd_access_add() { + local cfg="$1" + config_get group "$cfg" group + [ -n "$group" ] || return 0 + config_get context "$cfg" context + [ -n $context ] || return 0 + [ "$context" == "none" ] && context='""' + config_get version "$cfg" version + [ -n "$version" ] || return 0 + config_get level "$cfg" level + [ -n "$level" ] || return 0 + config_get prefix "$cfg" prefix + [ -n "$prefix" ] || return 0 + config_get read "$cfg" read + [ -n "$read" ] || return 0 + config_get write "$cfg" write + [ -n "$write" ] || return 0 + config_get notify "$cfg" notify + [ -n "$notify" ] || return 0 + echo "access $group $context $version $level $prefix $read $write $notify" >> $CONFIGFILE +} + +snmpd_trap_hostname_add() { + local cfg="$1" + config_get hostname "$cfg" HostName + config_get port "$cfg" Port + config_get community "$cfg" Community + config_get type "$cfg" Type + echo "$type $hostname $community $port" >> $CONFIGFILE +} + +snmpd_trap_ip_add() { + local cfg="$1" + config_get host_ip "$cfg" HostIP + config_get port "$cfg" Port + config_get community "$cfg" Community + config_get type "$cfg" Type + echo "$type $host_ip $community $port" >> $CONFIGFILE +} + +snmpd_access_default_add() { + local cfg="$1" + config_get mode "$cfg" Mode + config_get community "$cfg" CommunityName + config_get oidrestrict "$cfg" RestrictOID + config_get oid "$cfg" RestrictedOID + echo -n "$mode $community default" >> $CONFIGFILE + [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE + [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE +} + +snmpd_access_HostName_add() { + local cfg="$1" + config_get hostname "$cfg" HostName + config_get mode "$cfg" Mode + config_get community "$cfg" CommunityName + config_get oidrestrict "$cfg" RestrictOID + config_get oid "$cfg" RestrictedOID + echo -n "$mode $community $hostname" >> $CONFIGFILE + [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE + [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE +} + +snmpd_access_HostIP_add() { + local cfg="$1" + config_get host_ip "$cfg" HostIP + config_get ip_mask "$cfg" IPMask + config_get mode "$cfg" Mode + config_get community "$cfg" CommunityName + config_get oidrestrict "$cfg" RestrictOID + config_get oid "$cfg" RestrictedOID + echo -n "$mode $community $host_ip/$ip_mask" >> $CONFIGFILE + [ "$oidrestrict" == "yes" ] && echo " $oid" >> $CONFIGFILE + [ "$oidrestrict" == "no" ] && echo "" >> $CONFIGFILE +} + +snmpd_pass_add() { + local cfg="$1" + local pass='pass' + + config_get miboid "$cfg" miboid + [ -n "$miboid" ] || return 0 + config_get prog "$cfg" prog + [ -n "$prog" ] || return 0 + config_get_bool persist "$cfg" persist 0 + [ $persist -ne 0 ] && pass='pass_persist' + config_get priority "$cfg" priority + priority=${priority:+-p $priority} + echo "$pass $priority $miboid $prog" >> $CONFIGFILE +} + +snmpd_exec_add() { + local cfg="$1" + + config_get name "$cfg" name + [ -n "$name" ] || return 0 + config_get prog "$cfg" prog + [ -n "$prog" ] || return 0 + config_get args "$cfg" args + config_get miboid "$cfg" miboid + echo "exec $miboid $name $prog $args" >> $CONFIGFILE +} + +snmpd_disk_add() { + local cfg="$1" + local disk='disk' + + config_get partition "$cfg" partition + [ -n "$partition" ] || return 0 + config_get size "$cfg" size + [ -n "$size" ] || return 0 + echo "$disk $partition $size" >> $CONFIGFILE +} + +snmpd_engineid_add() { + local cfg="$1" + + config_get engineid "$cfg" engineid + [ -n "$engineid" ] && echo "engineID $engineid" >> $CONFIGFILE + config_get engineidtype "$cfg" engineidtype + [ "$engineidtype" -ge 1 -a "$engineidtype" -le 3 ] && \ + echo "engineIDType $engineidtype" >> $CONFIGFILE + config_get engineidnic "$cfg" engineidnic + [ -n "$engineidnic" ] && echo "engineIDNic $engineidnic" >> $CONFIGFILE +} + +snmpd_sink_add() { + local cfg="$1" + local section="$2" + local community + local port + local host + + config_get host "$cfg" host + [ -n "section" -a -n "$host" ] || return 0 + # optional community + config_get community "$cfg" community + # optional port + config_get port "$cfg" port + port=${port:+:$port} + echo "$section $host$port $community" >> $CONFIGFILE +} + +append_parm() { + local section="$1" + local option="$2" + local switch="$3" + local _loctmp + config_get _loctmp "$section" "$option" + [ -z "$_loctmp" ] && return 0 + echo "$switch $_loctmp" >> $CONFIGFILE +} + +append_authtrapenable() { + local section="$1" + local option="$2" + local switch="$3" + local _loctmp + config_get_bool _loctmp "$section" "$option" + [ -z "$_loctmp" ] && return 0 + [ "$_loctmp" -gt 0 ] && echo "$switch $_loctmp" >> $CONFIGFILE +} + +snmpd_setup_fw_rules() { + local net="$1" + local zone + + zone=$(fw3 -q network "$net" 2>/dev/null) + + local handled_zone + for handled_zone in $HANDLED_SNMP_ZONES; do + [ "$handled_zone" = "$zone" ] && return + done + + json_add_object "" + json_add_string type rule + json_add_string src "$zone" + json_add_string proto udp + json_add_string dest_port 161 + json_add_string target ACCEPT + json_close_object + + HANDLED_SNMP_ZONES="$HANDLED_SNMP_ZONES $zone" +} + +start_service() { + [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE" + + config_load snmpd + + config_get_bool snmp_enabled general enabled 1 + [ "$snmp_enabled" -eq 0 ] && return + + procd_open_instance + + config_foreach snmpd_agent_add agent + config_foreach snmpd_agentx_add agentx + config_foreach snmpd_system_add system + config_foreach snmpd_com2sec_add com2sec + if [ "$(uci -q get snmpd.general.ipv6cpipv4)" = "1" ]; then + config_foreach snmpd_com2sec6_add com2sec + else + config_foreach snmpd_com2sec6_add com2sec6 + fi + config_foreach snmpd_group_add group + config_foreach snmpd_view_add view + config_foreach snmpd_access_add access + config_foreach snmpd_trap_hostname_add trap_HostName + config_foreach snmpd_trap_ip_add trap_HostIP + config_foreach snmpd_access_default_add access_default + config_foreach snmpd_access_HostName_add access_HostName + config_foreach snmpd_access_HostIP_add access_HostIP + config_foreach snmpd_pass_add pass + config_foreach snmpd_exec_add exec + config_foreach snmpd_disk_add disk + config_foreach snmpd_engineid_add engineid + append_parm trapcommunity community trapcommunity + config_foreach snmpd_sink_add trapsink trapsink + config_foreach snmpd_sink_add trap2sink trap2sink + config_foreach snmpd_sink_add informsink informsink + append_authtrapenable authtrapenable enable authtrapenable + append_parm v1trapaddress host v1trapaddress + append_parm trapsess trapsess trapsess + + procd_set_param command $PROG -Lf /dev/null -f + procd_set_param file $CONFIGFILE + procd_set_param respawn + + for iface in $(ls /sys/class/net 2>/dev/null); do + procd_append_param netdev "$iface" + done + + procd_open_data + + json_add_array firewall + config_list_foreach general network snmpd_setup_fw_rules + json_close_array + + procd_close_data + + procd_close_instance +} + +stop_service() { + [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE" + procd_set_config_changed firewall +} + +service_triggers(){ + local script=$(readlink "$initscript") + local name=$(basename ${script:-$initscript}) + + procd_open_trigger + procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload + procd_close_trigger + + procd_add_reload_trigger 'snmpd' +} + +service_started() { + [ "$snmp_enabled" -eq 0 ] && return + procd_set_config_changed firewall +} diff --git a/luci-app-snmpd/root/etc/uci-defaults/4400-snmpd b/luci-app-snmpd/root/etc/uci-defaults/4400-snmpd new file mode 100755 index 000000000..8c6f6a547 --- /dev/null +++ b/luci-app-snmpd/root/etc/uci-defaults/4400-snmpd @@ -0,0 +1,19 @@ +#!/bin/sh +if [ "$(uci -q get snmpd.general.network)" = "" ]; then + uci -q batch <<-EOF >/dev/null + add_list snmpd.general.network=lan + set snmpd.@system[0].sysName="OpenMPTCProuter" + set snmpd.general.enabled=0 + commit snmpd + EOF +fi + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@snmpd[-1] + add ucitrack snmpd + set ucitrack.@snmpd[-1].init=snmpd + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 \ No newline at end of file diff --git a/luci-app-sqm-autorate/Makefile b/luci-app-sqm-autorate/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/htdocs/luci-static/resources/view/network/sqm.js b/luci-app-sqm-autorate/htdocs/luci-static/resources/view/network/sqm.js old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ar/sqm.po b/luci-app-sqm-autorate/po/ar/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/bg/sqm.po b/luci-app-sqm-autorate/po/bg/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/bn_BD/sqm.po b/luci-app-sqm-autorate/po/bn_BD/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ca/sqm.po b/luci-app-sqm-autorate/po/ca/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/cs/sqm.po b/luci-app-sqm-autorate/po/cs/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/da/sqm.po b/luci-app-sqm-autorate/po/da/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/de/sqm.po b/luci-app-sqm-autorate/po/de/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/el/sqm.po b/luci-app-sqm-autorate/po/el/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/en/sqm.po b/luci-app-sqm-autorate/po/en/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/es/sqm.po b/luci-app-sqm-autorate/po/es/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/fi/sqm.po b/luci-app-sqm-autorate/po/fi/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/fr/sqm.po b/luci-app-sqm-autorate/po/fr/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/he/sqm.po b/luci-app-sqm-autorate/po/he/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/hi/sqm.po b/luci-app-sqm-autorate/po/hi/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/hu/sqm.po b/luci-app-sqm-autorate/po/hu/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/it/sqm.po b/luci-app-sqm-autorate/po/it/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ja/sqm.po b/luci-app-sqm-autorate/po/ja/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ko/sqm.po b/luci-app-sqm-autorate/po/ko/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/mr/sqm.po b/luci-app-sqm-autorate/po/mr/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ms/sqm.po b/luci-app-sqm-autorate/po/ms/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/nb_NO/sqm.po b/luci-app-sqm-autorate/po/nb_NO/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/pl/sqm.po b/luci-app-sqm-autorate/po/pl/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/pt/sqm.po b/luci-app-sqm-autorate/po/pt/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/pt_BR/sqm.po b/luci-app-sqm-autorate/po/pt_BR/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ro/sqm.po b/luci-app-sqm-autorate/po/ro/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/ru/sqm.po b/luci-app-sqm-autorate/po/ru/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/sk/sqm.po b/luci-app-sqm-autorate/po/sk/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/sv/sqm.po b/luci-app-sqm-autorate/po/sv/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/templates/sqm.pot b/luci-app-sqm-autorate/po/templates/sqm.pot old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/tr/sqm.po b/luci-app-sqm-autorate/po/tr/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/uk/sqm.po b/luci-app-sqm-autorate/po/uk/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/vi/sqm.po b/luci-app-sqm-autorate/po/vi/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/zh_Hans/sqm.po b/luci-app-sqm-autorate/po/zh_Hans/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/po/zh_Hant/sqm.po b/luci-app-sqm-autorate/po/zh_Hant/sqm.po old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/root/usr/share/luci/menu.d/luci-app-sqm.json b/luci-app-sqm-autorate/root/usr/share/luci/menu.d/luci-app-sqm.json old mode 100755 new mode 100644 diff --git a/luci-app-sqm-autorate/root/usr/share/rpcd/acl.d/luci-app-sqm.json b/luci-app-sqm-autorate/root/usr/share/rpcd/acl.d/luci-app-sqm.json old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/Makefile b/luci-app-sysupgrade/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/luasrc/view/sysupgrade.htm b/luci-app-sysupgrade/luasrc/view/sysupgrade.htm old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po b/luci-app-sysupgrade/po/fr/sysupgrade.po old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po~ b/luci-app-sysupgrade/po/fr/sysupgrade.po~ old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/ru/sysupgrade.po b/luci-app-sysupgrade/po/ru/sysupgrade.po old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/templates/sysupgrade.pot b/luci-app-sysupgrade/po/templates/sysupgrade.pot old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po b/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ b/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json b/luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json b/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js b/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/LICENSE b/luci-theme-argon/LICENSE old mode 100755 new mode 100644 diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile old mode 100755 new mode 100644 diff --git a/luci-theme-argon/README.md b/luci-theme-argon/README.md old mode 100755 new mode 100644 diff --git a/luci-theme-argon/README_ZH.md b/luci-theme-argon/README_ZH.md old mode 100755 new mode 100644 diff --git a/luci-theme-argon/Screenshots/screenshot_pc.jpg b/luci-theme-argon/Screenshots/screenshot_pc.jpg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/Screenshots/screenshot_phone.jpg b/luci-theme-argon/Screenshots/screenshot_phone.jpg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/background/README.md b/luci-theme-argon/htdocs/luci-static/argon/background/README.md old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/favicon.ico b/luci-theme-argon/htdocs/luci-static/argon/favicon.ico old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png b/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml b/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json b/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg b/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/blank.png b/luci-theme-argon/htdocs/luci-static/argon/img/blank.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less b/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/dark.less b/luci-theme-argon/htdocs/luci-static/argon/less/dark.less old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/fonts.less b/luci-theme-argon/htdocs/luci-static/argon/less/fonts.less old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less b/luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js b/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/header.htm b/luci-theme-argon/luasrc/view/themes/argon/header.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon b/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/Makefile b/luci-theme-openmptcprouter/Makefile old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js b/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css b/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css old mode 100755 new mode 100644 diff --git a/macvlan/Makefile b/macvlan/Makefile old mode 100755 new mode 100644 diff --git a/macvlan/files/etc/config/macvlan b/macvlan/files/etc/config/macvlan old mode 100755 new mode 100644 diff --git a/macvlan/files/etc/uci-defaults/40_luci-app-macvlan b/macvlan/files/etc/uci-defaults/40_luci-app-macvlan old mode 100755 new mode 100644 diff --git a/mlvpn/Makefile b/mlvpn/Makefile old mode 100755 new mode 100644 diff --git a/mlvpn/files/etc/config/mlvpn b/mlvpn/files/etc/config/mlvpn old mode 100755 new mode 100644 diff --git a/mlvpn/files/etc/uci-defaults/4100-mlvpn b/mlvpn/files/etc/uci-defaults/4100-mlvpn old mode 100755 new mode 100644 diff --git a/mlvpn/patches/020-remove-cdefs.patch b/mlvpn/patches/020-remove-cdefs.patch old mode 100755 new mode 100644 diff --git a/modemmanager/files/10-report-down b/modemmanager/files/10-report-down old mode 100755 new mode 100644 diff --git a/mptcp/Makefile b/mptcp/Makefile old mode 100755 new mode 100644 diff --git a/mptcp/files/etc/hotplug.d/iface/30-mptcp b/mptcp/files/etc/hotplug.d/iface/30-mptcp old mode 100755 new mode 100644 diff --git a/mptcpd/Makefile b/mptcpd/Makefile old mode 100755 new mode 100644 diff --git a/mptcpd/patches/endian.patch b/mptcpd/patches/endian.patch old mode 100755 new mode 100644 diff --git a/mptcpd/patches/stub_error_h.patch b/mptcpd/patches/stub_error_h.patch old mode 100755 new mode 100644 From 9d886dbb8a81a2b44c5955321b97f82c8007b615 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 06:53:48 +0800 Subject: [PATCH 13/73] fix --- .../files/etc/uci-defaults/1920-omr-network | 412 ------------------ .../files/etc/uci-defaults/2090-omr-wwan | 12 + .../files/etc/uci-defaults/2091-omr-wifi | 23 - 3 files changed, 12 insertions(+), 435 deletions(-) delete mode 100755 openmptcprouter/files/etc/uci-defaults/1920-omr-network delete mode 100755 openmptcprouter/files/etc/uci-defaults/2091-omr-wifi diff --git a/openmptcprouter/files/etc/uci-defaults/1920-omr-network b/openmptcprouter/files/etc/uci-defaults/1920-omr-network deleted file mode 100755 index 0f1b7bc14..000000000 --- a/openmptcprouter/files/etc/uci-defaults/1920-omr-network +++ /dev/null @@ -1,412 +0,0 @@ -#!/bin/sh -. /lib/functions.sh - -_setup_macaddr() { - uci -q get "network.$1.macaddr" >/dev/null && return - uci -q set "network.$1.macaddr=$2" -} - -_setup_macvlan() { - uci -q get "network.$1_dev.ifname" >/dev/null && return - - # do not create macvlan for vlan - local _ifname - _ifname=$(uci -q get "network.$1.device") - case "$_ifname" in - eth*.*) return ;; - esac - - uci -q batch <<-EOF - set network.$1_dev=device - set network.$1_dev.name=$1 - set network.$1_dev.type=macvlan - set network.$1_dev.ifname=$_ifname - set network.$1_dev.mode='vepa' - set network.$1_dev.txqueuelen=1000 - set network.$1.device=$1 - set network.$1.type=macvlan - set network.$1.masterintf=$_ifname - EOF - _macaddr=$(uci -q get "network.$1.macaddr") - _setup_macaddr "$1_dev" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" -} - -#_setup_macvlan_update() { -# uci -q get "network.$1_dev.device" >/dev/null || return -# -# uci -q batch <<-EOF -# set macvlan.$1=macvlan -# set macvlan.$1.device=$_ifname -# commit macvlan -# EOF -#} - -_setup_mptcp_handover_to_on() { - if [ "$(uci -q get network.$1.multipath)" = "handover" ]; then - uci -q set network.$1.multipath=on - fi - if [ "$(uci -q get openmptcprouter.$1.multipath)" = "handover" ]; then - uci -q set openmptcprouter.$1.multipath=on - fi -} - -_setup_multipath_off() { - uci -q get "network.$1.multipath" >/dev/null && return - uci -q set "network.$1.multipath=off" -} - -_setup_wan_interface() { - uci -q batch <<-EOF - set network.$1=interface - set network.$1.device=$2 - set network.$1.proto=static - set network.$1.ip4table=wan - set network.$1.multipath=$3 - set network.$1.defaultroute=0 - set network.$1.addlatency=0 - set network.${1}_dev=device - set network.${1}_dev.name=$2 - set network.${1}_dev.txqueuelen=1000 - commit network - add_list firewall.@zone[1].network=$1 - commit firewall - EOF - [ -n "$4" ] && uci -q set network.$1.type=$4 -} - -config_load network -#config_foreach _setup_macvlan_update interface -config_foreach _setup_mptcp_handover_to_on interface - -if [ "$(uci -q show network.lan | grep multipath)" != "" ]; then - exit 0 -fi - -lanif="eth0" -if [ "$(grep rockchip /etc/os-release)" != "" ]; then - lanif="eth1" -elif [ -d /sys/class/net/lan0 -o -n "$(ip link | grep ' lan0')" ] && [ -d /sys/class/net/wan -o -n "$(ip link | grep ' wan@')" -o -n "$(ip link | grep ' wan:')" ]; then - lanif="wan" -elif [ -d /sys/class/net/lan1 -o -n "$(ip link | grep ' lan1')" ] && [ -d /sys/class/net/wan -o -n "$(ip link | grep ' wan@')" -o -n "$(ip link | grep ' wan:')" ]; then - lanif="wan" -elif [ -d /sys/class/net/lan ] || [ -n "$(ip link | grep ' lan')" ]; then - lanif="lan" -elif [ "$(swconfig list 2>&1 | grep switch0)" != "" ] && [ "$(cat /etc/board.json | jsonfilter -q -e '@.model.platform' | tr -d '\n')" = "RUTX" ]; then - lanif="eth1" - uci -q batch <<-EOF - set network.@switch_vlan[0]=switch_vlan - set network.@switch_vlan[0].device='switch0' - set network.@switch_vlan[0].vlan=1 - set network.@switch_vlan[0].ports='1t 2t 3t 4t 0t' - set network.@switch_vlan[1]=switch_vlan - set network.@switch_vlan[1].device='switch0' - set network.@switch_vlan[1].vlan=2 - set network.@switch_vlan[1].ports='0 5' - add network switch_vlan - set network.@switch_vlan[2].device='switch0' - set network.@switch_vlan[2].vlan=3 - set network.@switch_vlan[2].ports='0t 1' - add network switch_vlan - set network.@switch_vlan[3].device='switch0' - set network.@switch_vlan[3].vlan=4 - set network.@switch_vlan[3].ports='0t 2' - add network switch_vlan - set network.@switch_vlan[4].device='switch0' - set network.@switch_vlan[4].vlan=5 - set network.@switch_vlan[4].ports='0t 3' - add network switch_vlan - set network.@switch_vlan[5].device='switch0' - set network.@switch_vlan[5].vlan=6 - set network.@switch_vlan[5].ports='0t 4' - EOF -elif [ "$(swconfig list 2>&1 | grep switch0)" != "" ] && [ -d '/sys/class/net/eth1.5' ]; then - lanif="eth1.5" - uci -q batch <<-EOF - set network.@switch_vlan[0]=switch_vlan - set network.@switch_vlan[0].device='switch0' - set network.@switch_vlan[0].vlan=1 - set network.@switch_vlan[0].vid=1 - set network.@switch_vlan[0].ports='3 5t' - add network switch_vlan - set network.@switch_vlan[1].device='switch0' - set network.@switch_vlan[1].vlan=2 - set network.@switch_vlan[1].vid=2 - set network.@switch_vlan[1].ports='2 5t' - add network switch_vlan - set network.@switch_vlan[2].device='switch0' - set network.@switch_vlan[2].vlan=3 - set network.@switch_vlan[2].vid=3 - set network.@switch_vlan[2].ports='1 5t' - add network switch_vlan - set network.@switch_vlan[3].device='switch0' - set network.@switch_vlan[3].vlan=4 - set network.@switch_vlan[3].vid=4 - set network.@switch_vlan[3].ports='0 5t' - add network switch_vlan - set network.@switch_vlan[4].device='switch0' - set network.@switch_vlan[4].vlan=5 - set network.@switch_vlan[4].vid=5 - set network.@switch_vlan[4].ports='4 6t' - EOF -elif [ "$(swconfig list 2>&1 | grep switch0)" != "" ] && [ -d /sys/class/net/eth1 ] && [ "$(grep ipq806x /etc/os-release)" != "" ]; then - lanif="eth0.2" -elif [ "$(swconfig list 2>&1 | grep switch0)" != "" ] && [ -d /sys/class/net/eth1 ]; then - lanif="eth1" -elif [ ! -d /sys/class/net/eth1 ] && [ -d /sys/class/net/eth0 ]; then - lanif="eth0" -fi -uci -q batch <<-EOF -delete network.lan.type -set network.lan=interface -set network.lan.proto=static -set network.lan.ipaddr=192.168.100.1 -set network.lan.netmask=255.255.255.0 -set network.lan.device=${lanif} -set network.lan.ifname=${lanif} -set network.lan.metric=2048 -set network.lan.ipv6=0 -set network.lan.delegate=0 -set network.lan.addlatency=0 -set network.lan.txqueuelen=2000 -set dhcp.lan.dhcpv4='server' -EOF - -uci -q batch <<-EOF -delete network.none -delete network.wan -delete network.if6rd -reorder network.loopback=0 -reorder network.globals=1 -reorder network.lan=2 -set network.globals.multipath=enable -EOF - -# Set the ip rule for the lan with a pref of 100 -uci -q show network.lan_rule >/dev/null || \ - uci -q batch <<-EOF - set network.lan_rule=rule - set network.lan_rule.lookup=lan - set network.lan_rule.priority=100 - EOF - -if [ "$(uci -q get network.vpn0.proto)" = "none" ]; then - uci -q delete network.vpn0 -fi - -config_load network -config_foreach _setup_multipath_off interface - -# Add the lan as a named routing table -if ! grep -s -q "lan" /etc/iproute2/rt_tables; then - echo "50 lan" >> /etc/iproute2/rt_tables -fi -uci -q set network.lan.ip4table='lan' - -#uci -q set "network.lan.ip6assign=64" - -# Create WAN interfaces -if [ "$(uci -q show network.wan1 | grep multipath)" = "" ] && [ -z "$(uci -q get network.wan1.multipath)" ]; then - if [ "$(grep ipq806x /etc/os-release)" != "" ]; then - _setup_wan_interface wan1 eth1.1 master - _setup_wan_interface wan2 eth1.2 on - _setup_wan_interface wan3 eth1.3 on - _setup_wan_interface wan4 eth1.4 on - elif [ "$(grep rockchip /etc/os-release)" != "" ]; then - _setup_wan_interface wan1 eth0 master macvlan - _setup_wan_interface wan2 eth0 on macvlan - _setup_macvlan wan1 - _setup_macvlan wan2 - elif [ "$(cat /etc/board.json | jsonfilter -q -e '@.model.platform' | tr -d '\n')" = "RUTX" ]; then - _setup_wan_interface wan1 eth0.3 master - _setup_wan_interface wan2 eth0.4 on - _setup_wan_interface wan3 eth0.5 on - _setup_wan_interface wan4 eth0.6 on - elif [ "$(swconfig list 2>&1 | grep switch0)" != "" ]; then - _setup_wan_interface wan1 eth0.1 master - _setup_wan_interface wan2 eth0.2 on - _setup_wan_interface wan3 eth0.3 on - _setup_wan_interface wan4 eth0.4 on - elif [ -d /sys/class/net/wan ] || [ -n "$(ip link | grep ' wan:')" ] || [ -n "$(ip link | grep ' wan@')" ]; then - if [ -d /sys/class/net/lan0 -o -n "$(ip link | grep ' lan0')" ] && [ -d /sys/class/net/lan1 -o -n "$(ip link | grep ' lan1')" ]; then - _setup_wan_interface wan1 lan0 master - _setup_wan_interface wan2 lan1 on - - _macaddr=$(uci -q get "network.lan0.macaddr") - _setup_macaddr "wan1" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - _macaddr=$(uci -q get "network.lan1.macaddr") - _setup_macaddr "wan2" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - if [ -d /sys/class/net/lan2 ] || [ -n "$(ip link | grep ' lan2')" ]; then - _setup_wan_interface wan3 lan2 on - _macaddr=$(uci -q get "network.lan2.macaddr") - _setup_macaddr "wan3" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - if [ -d /sys/class/net/lan3 ] || [ -n "$(ip link | grep ' lan3')" ]; then - _setup_wan_interface wan4 lan3 on - _macaddr=$(uci -q get "network.lan3.macaddr") - _setup_macaddr "wan4" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - fi - fi - elif [ -d /sys/class/net/lan1 -o -n "$(ip link | grep ' lan1')" ] && [ -d /sys/class/net/lan2 -o -n "$(ip link | grep ' lan2')" ]; then - _setup_wan_interface wan1 lan1 master - _setup_wan_interface wan2 lan2 on - - _macaddr=$(uci -q get "network.lan1.macaddr") - _setup_macaddr "wan1" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - _macaddr=$(uci -q get "network.lan2.macaddr") - _setup_macaddr "wan2" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - if [ -d /sys/class/net/lan3 ] || [ -n "$(ip link | grep ' lan3')" ]; then - _setup_wan_interface wan3 lan3 on - _macaddr=$(uci -q get "network.lan3.macaddr") - _setup_macaddr "wan3" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - if [ -d /sys/class/net/lan4 ] || [ -n "$(ip link | grep ' lan4')" ]; then - _setup_wan_interface wan4 lan4 on - _macaddr=$(uci -q get "network.lan4.macaddr") - _setup_macaddr "wan4" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - fi - fi - else - _setup_wan_interface wan1 wan master macvlan - _setup_wan_interface wan2 wan on macvlan - _setup_macvlan wan1 - _setup_macvlan wan2 - fi - elif [ -d /sys/class/net/wan1 ] || [ -n "$(ip link | grep ' wan1')" ]; then - if [ -d /sys/class/net/wan2 ] || [ -n "$(ip link | grep ' wan2')" ]; then - _setup_wan_interface wan1 wan1 master - _setup_wan_interface wan2 wan2 on - - _macaddr=$(uci -q get "network.wan1.macaddr") - _setup_macaddr "wan1" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - _macaddr=$(uci -q get "network.wan2.macaddr") - _setup_macaddr "wan2" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - - if [ -d /sys/class/net/wan3 ] || [ -n "$(ip link | grep ' wan3')" ]; then - _setup_wan_interface wan3 wan3 on - _macaddr=$(uci -q get "network.wan3.macaddr") - _setup_macaddr "wan3" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - if [ -d /sys/class/net/wan4 ] || [ -n "$(ip link | grep ' wan4')" ]; then - _setup_wan_interface wan4 wan4 on - _macaddr=$(uci -q get "network.wan4.macaddr") - _setup_macaddr "wan4" "${_macaddr:-$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null | md5sum | sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/' -e 's/^\(.\)[13579bdf]/\10/')}" - fi - fi - else - _setup_wan_interface wan1 wan1 master macvlan - _setup_wan_interface wan2 wan1 on macvlan - _setup_macvlan wan1 - _setup_macvlan wan2 - fi - elif [ -d /sys/class/net/eth1 ] || [ -n "$(ip link | grep ' eth1:')" ]; then - if [ -d /sys/class/net/eth2 ] || [ -n "$(ip link | grep ' eth2:')" ]; then - _setup_wan_interface wan1 eth1 master - _setup_wan_interface wan2 eth2 on - if [ -d /sys/class/net/eth3 ] || [ -n "$(ip link | grep ' eth3:')" ]; then - _setup_wan_interface wan3 eth3 on - fi - if [ -d /sys/class/net/eth4 ] || [ -n "$(ip link | grep ' eth4:')" ]; then - _setup_wan_interface wan4 eth4 on - fi - if [ -d /sys/class/net/eth5 ] || [ -n "$(ip link | grep ' eth5:')" ]; then - _setup_wan_interface wan5 eth5 on - fi - if [ -d /sys/class/net/eth6 ] || [ -n "$(ip link | grep ' eth6:')" ]; then - _setup_wan_interface wan6 eth6 on - fi - if [ -d /sys/class/net/eth7 ] || [ -n "$(ip link | grep ' eth7:')" ]; then - _setup_wan_interface wan7 eth7 on - fi - if [ -d /sys/class/net/eth8 ] || [ -n "$(ip link | grep ' eth8:')" ]; then - _setup_wan_interface wan8 eth8 on - fi - else - _setup_wan_interface wan1 eth1 master macvlan - _setup_wan_interface wan2 eth1 on macvlan - _setup_macvlan wan1 - _setup_macvlan wan2 - fi - elif [ -d /sys/class/net/eth0.1 ] && [ -d /sys/class/net/eth0.2 ]; then - _setup_wan_interface wan1 eth0.1 master - _setup_wan_interface wan2 eth0.2 on - else - _setup_wan_interface wan1 eth0 master macvlan - _setup_wan_interface wan2 eth0 on macvlan - _setup_macvlan wan1 - _setup_macvlan wan2 - fi - #uci -q batch <<-EOF - #add network route6 - #set network.@route6[-1].interface='lan' - #set network.@route6[-1].target='::/0' - #EOF -fi - -# Replace omrip to oip in config for old config -sed -i 's/omrip/oip/g' /etc/config/* - -# Fix config from ifname to device for loopback -uci -q delete network.loopback.ifname -uci -q set network.loopback.device='lo' - -local board=$(board_name) -if [ "$board" = "teltonika,rutx" ] && [ -f /sbin/mnf_info ]; then - # Same part for RUTX12 and RUTX11, maybe other RUTX ? - uci -q batch <<-EOF - set network.modem1=interface - set network.modem1.proto='modemmanager' - set network.modem1.apn='' - set network.modem1.auth='none' - set network.modem1.iptype='ipv4v6' - set network.modem1.addlatency='0' - set network.modem1.force_link='1' - set network.modem1.device='/sys/devices/platform/soc/60f8800.usb2/6000000.dwc3/xhci-hcd.1.auto/usb3/3-1' - set network.modem1.peerdns='0' - set network.modem1.multipath='on' - set network.modem1.defaultroute='0' - commit network - add_list firewall.@zone[1].network='modem1' - commit firewall - EOF - if [ "$(mnf_info -n)" = "RUTX1200XXXX" ]; then - uci -q batch <<-EOF - set network.modem2=interface - set network.modem2.proto='modemmanager' - set network.modem2.apn='' - set network.modem2.auth='none' - set network.modem2.iptype='ipv4v6' - set network.modem2.addlatency='0' - set network.modem2.force_link='1' - set network.modem2.device='/sys/devices/platform/soc/8af8800.usb3/8a00000.dwc3/xhci-hcd.0.auto/usb1/1-1/1-1.2' - set network.modem2.peerdns='0' - set network.modem2.multipath='on' - set network.modem2.defaultroute='0' - set network.modem2.ip4table=wan - commit network - add_list firewall.@zone[1].network='modem2' - commit firewall - EOF - fi - uci -q batch <<-EOF - set network.wifi24=interface - set network.wifi24.proto='none' - set network.wifi5=interface - set network.wifi5.proto='none' - commit network - set wireless.radio0.cell_density='0' - set wireless.default_radio0.network='wifi24' - set wireless.radio1.cell_density='0' - set wireless.default_radio1.network='wifi5' - commit wireless - add ucitrack led - set ucitrack.@led[-1].init=led - del_list ucitrack.@firewall[0].affects=led - add_list ucitrack.@firewall[0].affects=led - commit ucitrack - EOF - -fi - - -uci -q commit macvlan -uci -q commit network -uci -q commit dhcp -rm -f /tmp/luci-indexcache -exit 0 diff --git a/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan b/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan index cab4295ea..55fc0b2d3 100755 --- a/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan +++ b/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan @@ -7,6 +7,18 @@ if [ "$(grep usbmode /etc/rc.local)" = "" ]; then /sbin/usbmode -l 2>&1 /dev/null /bin/sleep 3 /sbin/usbmode -s 2>&1 /dev/null + /bin/sleep 10 +echo 0 >/sys/class/leds/green:5g1pwr/brightness +/bin/sleep 2 +echo 0 >/sys/class/leds/green:5g2pwr/brightness +/bin/sleep 2 +echo 0 >/sys/class/leds/green:5g3pwr/brightness +/bin/sleep 3 +echo 1 >/sys/class/leds/green:5g1pwr/brightness +/bin/sleep 3 +echo 1 >/sys/class/leds/green:5g2pwr/brightness +/bin/sleep 3 +echo 1 >/sys/class/leds/green:5g3pwr/brightnes exit 0 EOF fi diff --git a/openmptcprouter/files/etc/uci-defaults/2091-omr-wifi b/openmptcprouter/files/etc/uci-defaults/2091-omr-wifi deleted file mode 100755 index 2925bb104..000000000 --- a/openmptcprouter/files/etc/uci-defaults/2091-omr-wifi +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -if [ "$(uci -q get wifi-iface.radio0)" != "" ] && [ "$(uci -q get wifi-iface.default_radio0.key)" = "12345678" ]; then - if [ "$(uci -q get wifi-device.radio0.country)" = "" ]; then - uci -q batch <<-EOF >/dev/null - set wifi-device.radio0.country='FR' - commit wifi-device - EOF - fi - if [ -n "$(uci -q get wifi-iface.radio0.network | grep lan)" ]; then - uci -q batch <<-EOF >/dev/null - set wifi-iface.default_radio0.network='wifi' - commit wifi-iface - EOF - fi - if [ -n "$(uci -q get wifi-device.radio0.cell_density)" ]; then - uci -q batch <<-EOF >/dev/null - delete wifi-device.radio0.cell_density - commit wifi-device - EOF - fi -fi - -exit 0 From e436642cf2793ea65a8099e2cff5e229875efdc4 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 06:56:50 +0800 Subject: [PATCH 14/73] Update 2090-omr-wwan --- .../files/etc/uci-defaults/2090-omr-wwan | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan b/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan index 55fc0b2d3..2dc9403ba 100755 --- a/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan +++ b/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan @@ -8,17 +8,17 @@ if [ "$(grep usbmode /etc/rc.local)" = "" ]; then /bin/sleep 3 /sbin/usbmode -s 2>&1 /dev/null /bin/sleep 10 -echo 0 >/sys/class/leds/green:5g1pwr/brightness -/bin/sleep 2 -echo 0 >/sys/class/leds/green:5g2pwr/brightness -/bin/sleep 2 -echo 0 >/sys/class/leds/green:5g3pwr/brightness -/bin/sleep 3 -echo 1 >/sys/class/leds/green:5g1pwr/brightness -/bin/sleep 3 -echo 1 >/sys/class/leds/green:5g2pwr/brightness -/bin/sleep 3 -echo 1 >/sys/class/leds/green:5g3pwr/brightnes + echo 0 >/sys/class/leds/green:5g1pwr/brightness + /bin/sleep 2 + echo 0 >/sys/class/leds/green:5g2pwr/brightness + /bin/sleep 2 + echo 0 >/sys/class/leds/green:5g3pwr/brightness + /bin/sleep 3 + echo 1 >/sys/class/leds/green:5g1pwr/brightness + /bin/sleep 3 + echo 1 >/sys/class/leds/green:5g2pwr/brightness + /bin/sleep 3 + echo 1 >/sys/class/leds/green:5g3pwr/brightnes exit 0 EOF fi From a12bae3e87d13936616c2c55a997e8981d56c01d Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 07:30:41 +0800 Subject: [PATCH 15/73] fix syslg --- syslogd/Makefile | 59 -------------------------------- syslogd/files/etc/init.d/syslogd | 24 ------------- 2 files changed, 83 deletions(-) delete mode 100644 syslogd/Makefile delete mode 100755 syslogd/files/etc/init.d/syslogd diff --git a/syslogd/Makefile b/syslogd/Makefile deleted file mode 100644 index 527d62024..000000000 --- a/syslogd/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -# -# Copyright (C) 2023 Ycarus (Yannick Chabanois) for OpenMPTCProuter -# -# This is free software, licensed under the GNU General Public License v3 or later. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=syslogd -PKG_VERSION:=1 -PKG_RELEASE:=1 - -PKG_MAINTAINER:=Ycarus (Yannick Chabanois) -PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) - -include $(INCLUDE_DIR)/package.mk - -define Package/syslogd - SECTION:=utilities - CATEGORY:=Utilities - TITLE:=Busybox syslogd OpenWRT init script - DEPENDS:=+busybox - KCONFIG:=\ - CONFIG_BUSYBOX_CUSTOM=y \ - CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG=y \ - CONFIG_BUSYBOX_CONFIG_LOGREAD=y \ - CONFIG_BUSYBOX_CONFIG_SYSLOGD=y \ - CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOGD_CFG=y \ - CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS=y \ - CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 \ - CONFIG_BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG=y \ - CONFIG_BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=64 - PKGARCH:=all -endef - -define Package/syslogd/description - Busybox syslogd package with init script for OpenWRT -endef - -define Package/syslogd/conffiles -/etc/syslog.conf -endef - -define Build/Prepare -endef - -define Build/Configure -endef - -define Build/Compile -endef - -define Package/syslogd/install - $(INSTALL_DIR) $(1) - $(CP) ./files/* $(1)/ -endef - -$(eval $(call BuildPackage,syslogd)) diff --git a/syslogd/files/etc/init.d/syslogd b/syslogd/files/etc/init.d/syslogd deleted file mode 100755 index 30afc3b66..000000000 --- a/syslogd/files/etc/init.d/syslogd +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=11 - -USE_PROCD=1 -NAME=syslogd -PROG=/sbin/syslogd - -start_service() { - local log_size=$(uci -q get system.@system[0].log_size) - local log_ip=$(uci -q get system.@system[0].log_ip) - local log_port=$(uci -q get system.@system[0].log_port || echo '514') - local log_file=$(uci -q get system.@system[0].log_file) - local conloglevel=$(uci -q get system.@system[0].conloglevel) - - procd_open_instance - procd_set_param command "$PROG" -n ${log_size:+-C"$log_size"} ${log_ip:+-R"$log_ip":"$log_port"} ${log_file:+-O "$log_file"} ${conloglevel:+-l "$conloglevel"} - procd_set_param respawn - procd_close_instance -} - -reload_service() { - procd_send_signal syslogd -} From ae968dc4a231f71248dbd16ad833a414324b25ca Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 07:36:24 +0800 Subject: [PATCH 16/73] fixx --- luci-theme-bootstrap/Makefile | 26 + .../htdocs/luci-static/bootstrap-dark | 1 + .../htdocs/luci-static/bootstrap-light | 1 + .../htdocs/luci-static/bootstrap/cascade.css | 2556 +++++++++++++++++ .../htdocs/luci-static/bootstrap/favicon.png | Bin 0 -> 592 bytes .../htdocs/luci-static/bootstrap/mobile.css | 428 +++ .../luci-static/resources/menu-bootstrap.js | 101 + .../resources/view/bootstrap/sysauth.js | 34 + .../etc/uci-defaults/30_luci-theme-bootstrap | 28 + .../ucode/template/themes/bootstrap-dark | 1 + .../ucode/template/themes/bootstrap-light | 1 + .../ucode/template/themes/bootstrap/footer.ut | 20 + .../ucode/template/themes/bootstrap/header.ut | 83 + .../template/themes/bootstrap/sysauth.ut | 48 + luci-theme-openwrt/Makefile | 22 + .../luci-static/openwrt.org/cascade.css | 2092 ++++++++++++++ .../htdocs/luci-static/openwrt.org/tabbg.png | Bin 0 -> 80 bytes .../luci-static/resources/menu-openwrt.js | 133 + .../luasrc/view/themes/openwrt.org/footer.htm | 19 + .../luasrc/view/themes/openwrt.org/header.htm | 95 + .../etc/uci-defaults/30_luci-theme-openwrt | 12 + 21 files changed, 5701 insertions(+) create mode 100644 luci-theme-bootstrap/Makefile create mode 120000 luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark create mode 120000 luci-theme-bootstrap/htdocs/luci-static/bootstrap-light create mode 100644 luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css create mode 100644 luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png create mode 100644 luci-theme-bootstrap/htdocs/luci-static/bootstrap/mobile.css create mode 100644 luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js create mode 100644 luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js create mode 100755 luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap create mode 120000 luci-theme-bootstrap/ucode/template/themes/bootstrap-dark create mode 120000 luci-theme-bootstrap/ucode/template/themes/bootstrap-light create mode 100644 luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut create mode 100644 luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut create mode 100644 luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut create mode 100644 luci-theme-openwrt/Makefile create mode 100644 luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css create mode 100644 luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png create mode 100644 luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js create mode 100644 luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm create mode 100644 luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm create mode 100755 luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt diff --git a/luci-theme-bootstrap/Makefile b/luci-theme-bootstrap/Makefile new file mode 100644 index 000000000..1e7f49a12 --- /dev/null +++ b/luci-theme-bootstrap/Makefile @@ -0,0 +1,26 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Bootstrap Theme (default) +LUCI_DEPENDS:= + +PKG_LICENSE:=Apache-2.0 + +define Package/luci-theme-bootstrap/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.Bootstrap + uci -q delete luci.themes.BootstrapDark + uci -q delete luci.themes.BootstrapLight + uci commit luci +} +endef + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark b/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark new file mode 120000 index 000000000..ac7bcbbf3 --- /dev/null +++ b/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark @@ -0,0 +1 @@ +bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light b/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light new file mode 120000 index 000000000..ac7bcbbf3 --- /dev/null +++ b/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light @@ -0,0 +1 @@ +bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css new file mode 100644 index 000000000..6b51189ff --- /dev/null +++ b/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css @@ -0,0 +1,2556 @@ +/*! + * LuCI Bootstrap Theme + * Copyright 2012 Nut & Bolt + * By David Menting + * Based on Bootstrap v1.4.0 + * + * Copyright 2011 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +/* Variables + * --------- */ + +:root { + --background-color-delta-l-sign: -1; + --background-color-h: 0; + --background-color-s: 0%; + --background-color-l: 100%; + + --background-color-high-hsl: + var(--background-color-h), + var(--background-color-s), + var(--background-color-l); + --background-color-high: hsl(var(--background-color-high-hsl)); + + --background-color-medium-hsl: + var(--background-color-h), + var(--background-color-s), + calc(var(--background-color-l) + var(--background-color-delta-l-sign) * calc(6 / 255 * 100%)); + --background-color-medium: hsl(var(--background-color-medium-hsl)); + + --background-color-low-hsl: + var(--background-color-h), + var(--background-color-s), + calc(var(--background-color-l) + var(--background-color-delta-l-sign) * calc(10 / 255 * 100%)); + --background-color-low: hsl(var(--background-color-low-hsl)); + + --text-color-delta-l-sign: 1; + --text-color-h: 0; + --text-color-s: 0%; + --text-color-l: 0%; + + --text-color-highest-hsl: + var(--text-color-h), + var(--text-color-s), + var(--text-color-l); + --text-color-highest: hsl(var(--text-color-highest-hsl)); + + --text-color-high-hsl: + var(--text-color-h), + var(--text-color-s), + calc(var(--text-color-l) + var(--text-color-delta-l-sign) * calc(64 / 255 * 100%)); + --text-color-high: hsl(var(--text-color-high-hsl)); + + --text-color-medium-hsl: + var(--text-color-h), + var(--text-color-s), + calc(var(--text-color-l) + var(--text-color-delta-l-sign) * calc(128 / 255 * 100%)); + --text-color-medium: hsl(var(--text-color-medium-hsl)); + + --text-color-low-hsl: + var(--text-color-h), + var(--text-color-s), + calc(var(--text-color-l) + var(--text-color-delta-l-sign) * calc(191 / 255 * 100%)); + --text-color-low: hsl(var(--text-color-low-hsl)); + + --border-color-delta-l-sign: -1; + --border-color-h: var(--background-color-h); + --border-color-s: var(--background-color-s); + --border-color-l: var(--background-color-l); + + --border-color-high-hsl: + var(--border-color-h), + var(--border-color-s), + calc(var(--border-color-l) + var(--border-color-delta-l-sign) * calc(51 / 255 * 100%)); + --border-color-high: hsl(var(--border-color-high-hsl)); + + --border-color-medium-hsl: + var(--border-color-h), + var(--border-color-s), + calc(var(--border-color-l) + var(--border-color-delta-l-sign) * calc(34 / 255 * 100%)); + --border-color-medium: hsl(var(--border-color-medium-hsl)); + + --border-color-low-hsl: + var(--border-color-h), + var(--border-color-s), + calc(var(--border-color-l) + var(--border-color-delta-l-sign) * calc(17 / 255 * 100%)); + --border-color-low: hsl(var(--border-color-low-hsl)); + + --primary-color-high: #1976d2; + --primary-color-medium: #1564c0; + --primary-color-low: #0d46a1; + --on-primary-color: var(--background-color-high); + + --error-color-high-rgb: 246, 43, 18; + --error-color-high: rgb(var(--error-color-high-rgb)); + --error-color-medium: #e8210d; + --error-color-low: #d00000; + --on-error-color: var(--background-color-high); + + --success-color-high-rgb: 0, 172, 89; + --success-color-high: rgb(var(--success-color-high-rgb)); + --success-color-medium: #009a4c; + --success-color-low: #007936; + --on-success-color: var(--background-color-high); + + --warn-color-high: #efbd0b; + --warn-color-medium: #f0c629; + --warn-color-low: #f2d24f; + --on-warn-color: var(--text-color-highest); + + --disabled-opacity: .7; + + color-scheme: light; +} + +:root[data-darkmode="true"] { + --background-color-delta-l-sign: 1; + --background-color-h: 0; + --background-color-s: 0%; + --background-color-l: calc(34 / 255 * 100%); + --text-color-delta-l-sign: -1; + --text-color-h: 0; + --text-color-s: 0%; + --text-color-l: 100%; + --border-color-delta-l-sign: 1; + + --primary-color-high: #4da1c0; + --primary-color-medium: #448da6; + --primary-color-low: #3c7a8d; + + --error-color-high-rgb: 209, 86, 83; + --error-color-medium: #bf4e4c; + --error-color-low: #b14946; + + --success-color-high-rgb: 0, 166, 108; + --success-color-medium: #00945e; + --success-color-low: #008252; + + --warn-color-high: #a69461; + --warn-color-medium: #a68d45; + --warn-color-low: #a68732; + --on-warn-color: var(--background-color-high); + + --disabled-opacity: .4; + + color-scheme: dark; +} + +/* Reset.less + * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). + * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ + +*, *::before, *::after { + margin: 0; + padding: 0; + border: 0; + box-sizing: border-box; +} + +abbr[title], acronym[title] { + border-bottom: 1px dotted; + font-weight: inherit; + cursor: help; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +ol, ul { + list-style: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + height: 100%; +} + +a:focus { + outline: thin dotted; +} + +a:hover, a:active { + outline: 0; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + -ms-interpolation-mode: bicubic; +} + +button, +input, +select, +option, +textarea { + font-size: 100%; + margin: 0; + box-sizing: border-box; + vertical-align: baseline; + line-height: 2em; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; + word-break: break-all; +} + +button[disabled], +input[type="button"][disabled], +input[type="reset"][disabled], +input[type="submit"][disabled] { + opacity: var(--disabled-opacity); +} + +input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.control-group { + display: inline-flex; + gap: .2em; +} + +.control-group > input + :not(input):not(select), +.control-group > select + :not(input):not(select) { + margin-left: calc(-.2em + -2px); + border-radius: 0 3px 3px 0; + padding: 0 6px; +} + +/* + * Scaffolding + * Basic and global styles for generating a grid system, structural layout, and page templates + * ------------------------------------------------------------------------------------------- */ +body { + background-color: var(--background-color-high); + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 18px; + color: var(--text-color-high); + padding: 5px; + min-height: 100%; + display: flex; + flex-direction: column; +} + +.container { + width: 100%; + max-width: 940px; + margin-left: auto; + margin-right: auto; + zoom: 1; +} + +a { + color: var(--primary-color-high); + text-decoration: none; + line-height: inherit; + font-weight: inherit; +} + +a:hover { + color: var(--primary-color-low); + text-decoration: underline; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.nowrap { + white-space: nowrap; +} + +/* Typography.less + * Headings, body text, lists, code, and more for a versatile and durable typography system + * ---------------------------------------------------------------------------------------- */ +p, +.cbi-map-descr, +.cbi-section-descr, +.table .tr.cbi-section-table-descr .th { + font-size: 13px; + font-weight: normal; + line-height: 18px; + margin-bottom: 9px; +} + +p small { + font-size: 11px; + color: var(--text-color-low); +} + +h1, +h2, +h3, legend, +h4, +h5, +h6 { + font-weight: bold; + color: var(--text-color-high); +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + color: var(--text-color-low); +} + +h1 { + margin-bottom: 18px; + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 14px; +} + +h3, legend, +h4, +h5, +h6 { + line-height: 36px; +} + +h3, legend { + font-size: 18px; +} + +h3 small { + font-size: 14px; +} + +h4 { + font-size: 16px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 13px; + color: var(--text-color-low); + text-transform: uppercase; +} + +ul, ol { + margin: 0 0 18px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 18px; + color: var(--text-color-medium); +} + +ul.unstyled { + list-style: none; + margin-left: 0; +} + +dl { + margin-bottom: 18px; +} + +dl dt, dl dd { + line-height: 18px; +} + +dl dt { + font-weight: bold; +} + +dl dd { + margin-left: 9px; +} + +hr { + margin: 20px 0 19px; + border: 0; + border-bottom: 1px solid var(--border-color-low); +} + +strong { + font-style: inherit; + font-weight: bold; +} + +em { + font-style: italic; + font-weight: inherit; + line-height: inherit; +} + +small { font-size: 0.9em } + +address { + display: block; + line-height: 18px; + margin-bottom: 18px; +} + +code, pre { + padding: 0 3px 2px; + font-family: Monaco, Andale Mono, Courier New, monospace; + font-size: 12px; + border-radius: 3px; +} + +code { + background-color: var(--border-color-low); + color: var(--text-color-high); + padding: 1px 3px; +} + +pre { + --border-color-h: var(--background-color-h); + --border-color-s: var(--background-color-s); + --border-color-delta-l: 100%; + --border-color-l: calc(var(--background-color-l) + var(--background-color-delta-l-sign) * var(--border-color-delta-l)); + --border-color-a: 0.15; + --border-color: hsla(var(--border-color-hsl), var(--border-color-a)); + + background-color: var(--background-color-low); + display: block; + padding: 8.5px; + margin: 0 0 18px; + line-height: 18px; + font-size: 12px; + border: 1px solid var(--border-color); + border-radius: 3px; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* Forms.less + * Base styles for various input types, form layouts, and states + * ------------------------------------------------------------- */ +fieldset { + margin-bottom: 9px; + padding-top: 9px; +} + +fieldset legend { + display: block; + font-size: 19.5px; + line-height: 1; + color: var(--text-color-high); + padding-top: 20px; +} + +label, +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: normal; +} + +.cbi-value { + display: flex; + flex-wrap: wrap; + margin-bottom: 18px; +} + +.cbi-value-field { + margin-left: 20px; + flex: 1; +} + +.cbi-value label.cbi-value-title { + padding-top: 6px; + font-size: 13px; + line-height: 18px; + flex: 0 0 180px; + text-align: right; + color: var(--text-color-high); +} + +.cbi-value > .cbi-section, +.cbi-value > .cbi-tblsection { + width: 100%; +} + +label > input[type="checkbox"], +label > input[type="radio"] { + vertical-align: text-top; + margin: 0; +} + +label[for] { + cursor: pointer; +} + +input, +textarea, +select, +.cbi-select, +.cbi-dropdown:not(.btn):not(.cbi-button) { + display: inline-block; + width: 210px; + padding: 4px; + background: var(--background-color-high); + color: var(--text-color-high); + font-size: 13px; + line-height: 18px; + border: 1px solid var(--border-color-high); + border-radius: 3px; +} + +input, +select, +.cbi-select, +.cbi-dropdown:not(.btn):not(.cbi-button) { + height: 30px; +} + +.cbi-dropdown:not(.btn):not(.cbi-button), +.cbi-dynlist { + min-width: 210px; + max-width: 400px; + width: auto; +} + +.cbi-dynlist { + height: auto; + min-height: 30px; + display: inline-flex; + flex-direction: column; +} + +.cbi-dynlist > .item { + margin-bottom: 4px; + box-shadow: 0 0 2px var(--border-color-high); + background: var(--background-color-high); + padding: 6px 2em 6px 4px; + border: 1px solid var(--border-color-high); + border-radius: 3px; + color: var(--text-color-high); + position: relative; + pointer-events: none; + overflow: hidden; + word-break: break-all; +} + +.cbi-dynlist > .item::after { + content: "×"; + position: absolute; + display: inline-flex; + align-items: center; + top: -1px; + right: -1px; + bottom: -1px; + padding: 0 6px; + border: 1px solid var(--border-color-high); + border-radius: 0 3px 3px 0; + font-weight: bold; + color: #c44; + pointer-events: auto; +} + +.cbi-dynlist > .add-item { + display: flex; +} + +.cbi-dynlist > .add-item > input, +.cbi-dynlist > .add-item > button { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.cbi-value-field > .cbi-checkbox, +.cbi-value-field > div > .cbi-radio { + height: 30px; + display: inline-flex; + align-items: center; +} + +.cbi-radio { + cursor: pointer; + gap: .125em; +} + +.cbi-select { + padding: 0; + position: relative; + background: linear-gradient(var(--background-color-high), var(--border-color-low)); +} + +.cbi-select select, +.cbi-select select:focus { + -webkit-appearance: none; + appearance: none; + outline: none; + border: none; + background: transparent; + height: 100%; + width: 100%; + padding: 0 .3em; + cursor: pointer; + margin-right: .6em; +} + +.cbi-select::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + content: "▾"; + padding: 0 .3em; + background: linear-gradient(var(--background-color-high), var(--border-color-low)); + pointer-events: none; + border-radius: 3px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.cbi-select select option { + background: var(--background-color-low); + color: var(--text-color-high); +} + +.cbi-select select option:hover { + background: var(--primary-color-low); + color: var(--on-primary-color); +} + +.cbi-select select option:checked { + background: var(--primary-color-medium); + color: var(--on-primary-color); +} + +input[type=file] { + padding: initial; + border: initial; + line-height: initial; + box-shadow: none; + width: auto !important; +} + +input[type=button], input[type=reset], input[type=submit] { + width: auto; + height: auto; +} + +select[multiple] { + height: inherit; + background-color: #fff; +} + +input[type="checkbox"], +input[type="radio"] { + --bd-color: var(--border-color-high); + --fg-color: var(--text-color-high); + + appearance: none; + -webkit-appearance: none; + width: 14px; + height: 14px; + color: var(--fg-color); + position: relative; + display: inline-block; + cursor: pointer; + background: none; + border: none; +} + +input[type="checkbox"]::before, +input[type="checkbox"]::after, +input[type="radio"]::before, +input[type="radio"]::after { + position: absolute; + content: ""; +} + +input[type="checkbox"]::before, +input[type="radio"]::before { + top: 0; + left: 0; + width: 14px; + height: 14px; + background: linear-gradient(var(--background-color-high), var(--background-color-low)); + border: 1px solid var(--bd-color); + border-radius: 2px; +} + +input[type="radio"], +input[type="radio"]::before { + border-radius: 50%; +} + +input[type="checkbox"]::after, +input[type="radio"]::after { + top: 2px; + left: 2px; + width: 10px; + height: 10px; +} + +input[type="checkbox"]:checked::after, +input[type="radio"]:checked::after { + --checkmark-icon: url("data:image/svg+xml,"); + -webkit-mask: var(--checkmark-icon) center/cover no-repeat; + mask: var(--checkmark-icon) center/cover no-repeat; + background: var(--fg-color); +} + +input[type="radio"]:checked:after { + --checkmark-icon: url("data:image/svg+xml,"); +} + +input[type="checkbox"].cbi-input-invalid, +input[type="radio"].cbi-input-invalid { + --bd-color: var(--error-color-medium); + --fg-color: var(--error-color-high); +} + +.td > input[type=text], +.td > input[type=password], +.td > select, +.td > .cbi-dropdown:not(.btn):not(.cbi-button), +.cbi-dynlist > .add-item > .cbi-dropdown { + width: 100%; +} + +::placeholder { + color: var(--text-color-medium); +} + +.item::after, +.btn, +.cbi-button, +.cbi-select, +.cbi-dropdown, +.cbi-dynlist > .item, +input[type="checkbox"]::before, +input[type="radio"]::before, +input, button, textarea, select { + transition: border linear 0.2s, box-shadow linear 0.2s; + box-shadow: inset 0 1px 3px hsla(var(--border-color-low-hsl), .01); +} + +.item:hover::after, +.btn:hover, .btn:focus, +.cbi-button:hover, .cbi-button:focus, +.cbi-select.focus, +.cbi-dropdown:focus, .cbi-dropdown[open], +.cbi-dynlist > .item:focus, +input[type="checkbox"]:focus::before, +input[type="radio"]:focus::before, +input:focus, button:hover, textarea:focus, select:focus { + --focus-color-rgb: 82, 168, 236; + + outline: 0; + border-color: rgba(var(--focus-color-rgb), 0.8) !important; + box-shadow: inset 0 1px 3px hsla(var(--border-color-low-hsl), .01), 0 0 8px rgba(var(--focus-color-rgb), 0.6); + text-decoration: none; +} + +.cbi-input-invalid:focus, +.cbi-select.cbi-input-invalid, +input[type="checkbox"].cbi-input-invalid:focus::before, +input[type="radio"].cbi-input-invalid:focus::before { + --focus-color-rgb: var(--error-color-high-rgb); +} + +input[disabled], +button[disabled], +select[disabled], +textarea[disabled], +.cbi-select[disabled]::before, +.cbi-dropdown[disabled]:not(.btn):not(.cbi-button), +input[type="checkbox"][disabled]::before, +input[type="checkbox"][disabled]::after, +input[type="radio"][disabled]::before, +input[type="radio"][disabled]::after { + opacity: var(--disabled-opacity); + pointer-events: none; + cursor: default; +} + +input[readonly], +select[readonly], +textarea[readonly] { + border-color: hsla(var(--border-color-high-hsl), var(--disabled-opacity)); + pointer-events: auto; + cursor: auto; +} + +.cbi-optionals, +.cbi-section-create { + padding: 0 0 10px 10px; +} + +.cbi-section-create { + margin: -3px; + display: inline-flex; + align-items: center; +} + +.cbi-section-create > * { + margin: 3px; + flex: 1 1 auto; +} + +.cbi-section-create > * > input { + width: 100%; +} + +.actions, +.cbi-page-actions { + background: var(--background-color-low); + margin-bottom: 18px; + padding: 17px 20px 18px 17px; + border-top: 1px solid var(--border-color-medium); + border-radius: 0 0 3px 3px; + text-align: right; +} + +.actions .secondary-action, +.cbi-page-actions .secondary-action{ + float: right; +} + +.actions .secondary-action a, +.cbi-page-actions .secondary-action a { + line-height: 30px; +} + +.actions .secondary-action a:hover, +.cbi-page-actions .secondary-action a:hover { + text-decoration: underline; +} + +.cbi-page-actions > form { + display: inline; + margin: 0; +} + +/* + * Tables.less + * Tables for, you guessed it, tabular data + * ---------------------------------------- */ +.tr { display: table-row; } +.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; } +.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; } + +.table { + display: table; + width: 100%; + margin-bottom: 18px; + padding: 0; + font-size: 13px; + border-collapse: collapse; + position: relative; +} + +.table .th, .table .td { + display: table-cell; + vertical-align: middle; /* Fixme */ + padding: 10px 10px 9px; + line-height: 18px; + text-align: left; +} + +.table .tr:first-child .th { + padding-top: 9px; + font-weight: bold; + vertical-align: top; +} + +.table .td, .table .th { + border-top: 1px solid var(--border-color-medium); +} + +.tr.placeholder { + height: calc(3em + 20px); +} + +.tr.placeholder > .td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 3em; +} + +.tr.drag-over-above, +.tr.drag-over-below { + border: 2px solid #0069d6; + border-width: 2px 0 0 0; +} + +.tr.drag-over-below { + border-width: 0 0 2px 0; +} + +/* Patterns.less + * Repeatable UI elements outside the base styles provided from the scaffolding + * ---------------------------------------------------------------------------- */ +header { + position: sticky; + top: 0; + z-index: 800; + overflow: visible; + color: #BFBFBF; + margin: -5px -5px 15px -5px; + display: flex; +} + +header a { + color: #bfbfbf; + text-shadow: 0 -1px 0 hsla(var(--border-color-low-hsl), .25); +} + +header .brand:hover, header ul .active > a { + background-color: #333; + background-color: rgba(255, 255, 255, 0.05); + color: #fff; + text-decoration: none; +} + +header .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -15px; + color: #fff; + font-size: 20px; + font-weight: 200; + line-height: 1; +} + +header .pull-right { + margin-left: auto; + margin-right: 5px; + align-self: center; +} + +header p { + margin: 0; + line-height: 40px; +} + +header { + background: linear-gradient(#333333, #222222); + box-shadow: 0 1px 3px hsla(var(--border-color-low-hsl), .25), inset 0 -1px 0 hsla(var(--border-color-low-hsl), .01); + padding: 0; + /* the redundant properties below work around a csstidy bug */ + padding-left: calc((100% - 940px) / 2); + padding-right: calc((100% - 940px) / 2); +} + +.nav { + display: block; + float: left; + margin: 0 10px 0 0; + position: relative; + left: 0; +} + +.nav > li { + display: block; + float: left; +} + +.nav a { + display: block; + float: none; + padding: 10px 10px 11px; + line-height: 19px; + text-decoration: none; +} + +.nav a:hover { + color: #fff; + text-decoration: none; +} + +.nav .active > a { + background-color: #222; + background-color: rgba(0, 0, 0, 0.5); +} + +.nav a.menu:hover { + background: #444; + background: rgba(255, 255, 255, 0.05); +} + +.nav .dropdown-menu { + background-color: #333; +} + +.nav .dropdown-menu a.menu { + color: #fff; +} + +.nav .dropdown-menu li a { + color: #999; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} + +.nav .dropdown-menu li a:hover { + background-color: #191919; + background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #292929, #191919); + color: #fff; +} + +.nav .dropdown-menu .active a { + color: #fff; +} + +.nav .dropdown-menu li a { + padding: 4px 15px; +} + +li.menu, .dropdown { + position: relative; +} + +a.menu:after { + width: 0; + height: 0; + display: inline-block; + content: "↓"; + text-indent: -99999px; + vertical-align: top; + margin-top: 8px; + margin-left: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #fff; + opacity: 0.5; +} + +.dropdown-menu { + background-color: #fff; + float: left; + position: absolute; + top: 40px; + left: -9999px; + z-index: 900; + min-width: 160px; + max-width: 220px; + margin-left: 0; + margin-right: 0; + padding: 6px 0; + zoom: 1; + border-color: #999; + border-color: rgba(0, 0, 0, 0.2); + border-style: solid; + border-width: 0 1px 1px; + border-radius: 0 0 6px 6px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + background-clip: padding-box; +} + +.dropdown-menu li { + float: none; + display: block; + background-color: transparent; +} + +.dropdown-menu a { + display: block; + padding: 4px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #808080; + text-shadow: 0 1px 0 #fff; +} + +.dropdown-menu a:hover { + background-color: #ddd; + background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #eee, #ddd); + color: #404040; + text-decoration: none; + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); +} + +.dropdown:hover ul.dropdown-menu { + left: 0; +} + +.dropdown-menu .dropdown-menu { + position: absolute; + left: 159px; +} + +.dropdown-menu li { + position: relative; +} + +.tabs, .cbi-tabmenu { + --tab-bar-background-color: var(--background-color-high); + --tab-inactive-background-color-h: var(--border-color-low-h); + --tab-inactive-background-color-s: var(--border-color-low-s); + --tab-inactive-background-color-l: var(--border-color-low-l); + --tab-inactive-background-color: var(--border-color-low); + --tab-inactive-border-color: var(--border-color-medium); + --tab-inactive-text-color-delta-l: calc(85 / 255 * 100%); + --tab-inactive-text-color-l: calc(var(--tab-inactive-background-color-l) + var(--background-color-delta-l-sign) * var(--tab-inactive-text-color-delta-l)); + --tab-inactive-text-color: hsl(var(--tab-inactive-background-color-hsl)); + --tab-inactive-hover-background-color: var(--background-color-high); + --tab-active-background-color: var(--background-color-high); + --tab-active-text-color: #0069d6; + --tab-active-border-color: var(--border-color-medium); + + margin: 0 -5px 18px; + padding: 0 2px; + list-style: none; + display: flex; + flex-wrap: wrap; + background: linear-gradient(var(--tab-bar-background-color) 28px, var(--tab-inactive-border-color) 28px); + background-size: 1px 29px; + background-position: left bottom; +} + +.tabs > li, .cbi-tabmenu > li { + flex: 0 1 auto; + display: flex; + align-items: center; + height: 25px; + max-width: 48%; + margin: 4px 2px 0 2px; + background: var(--tab-active-background-color); + border: 1px solid var(--tab-active-border-color); + border-bottom: none; + border-radius: 4px 4px 0 0; + color: var(--primary-color-high); +} + +.tabs > li > a, .cbi-tabmenu > li > a { + padding: 4px 6px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: inherit; + text-decoration: none; + border-radius: 4px 4px 0 0; + line-height: 25px; + outline: none; +} + +.tabs > li > a:focus-visible, .cbi-tabmenu > li > a:focus-visible { + text-decoration: underline; +} + +.tabs > li:not(.active):hover, .cbi-tabmenu > .cbi-tab-disabled:hover { + background: linear-gradient(var(--tab-inactive-hover-background-color) 90%, var(--tab-inactive-border-color) 100%); +} + +.tabs > li:not(.active), .cbi-tabmenu > .cbi-tab-disabled { + color: var(--tab-inactive-text-color); + background: linear-gradient(var(--tab-inactive-background-color) 90%, var(--tab-inactive-border-color) 100%); +} + +.cbi-tab-disabled[data-errors]::after { + content: attr(data-errors); + background: #c43c35; + color: #fff; + height: 16px; + min-width: 16px; + border-radius: 8px; + text-align: center; + margin: 0 5px 0 0; + padding: 3px 2px 1px 2px; + display: inline-flex; + flex-direction: column; + justify-content: center; + font-size: 12px; +} + +.cbi-tabmenu.map { + margin: 0; +} + +.cbi-tabmenu.map > li { + font-size: 16.5px; + font-weight: bold; +} + +.cbi-tab-descr { + margin: -9px 0 18px 0; +} + +.tabs .menu-dropdown, .tabs .dropdown-menu { + top: 35px; + border-width: 1px; + border-radius: 0 6px 6px 6px; +} + +.tabs a.menu:after, .tabs .dropdown-toggle:after { + border-top-color: #999; + margin-top: 15px; + margin-left: 5px; +} + +.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle { + border-color: #999; +} + +.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after { + border-top-color: #555; +} + +.tab-content > .tab-pane, +.tab-content > div { + display: none; +} + +.tab-content > .active { + display: block; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + background: linear-gradient(to bottom, var(--background-color-high), var(--background-color-low)); + border: 1px solid var(--border-color-medium); + border-radius: 3px; + display: flex; + flex: 0; +} + +.breadcrumb li { + list-style: none; +} + +.breadcrumb li:not(:last-child)::after { + content: "|"; + padding: 0 5px; +} + +.breadcrumb .active a { + color: var(--text-color-medium); +} + +footer { + padding-top: 17px; + margin-top: auto; + border-top: 1px solid var(--border-color-low); + display: flex; + flex-wrap: wrap; + align-items: baseline; + justify-content: space-between; + font-size: 12px; + color: var(--text-color-medium); + /* the redundant properties below work around a csstidy bug */ + padding-left: calc((100% - 940px) / 2); + padding-right: calc((100% - 940px) / 2); +} + +footer a { + color: var(--primary-color-low); +} + +footer span { + margin-bottom: 1em; +} + +footer ul.breadcrumb { + margin-left: auto; +} + +#modal_overlay { + position: fixed; + top: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.7); + z-index: 900; + overflow: auto; + transition: opacity .125s ease-in; + opacity: 0; + visibility: hidden; +} + +.modal { + width: 90%; + margin: 5em auto; + min-height: 32px; + max-width: 600px; + border-radius: 3px; + background: var(--background-color-high); + border: 1px solid var(--border-color-low); + box-shadow: 0 0 3px var(--background-color-low); + padding: 1em 1em .5em 1em; + min-width: 270px; +} + +.modal > * { + line-height: normal; + margin-bottom: .5em; + max-width: 100%; +} + +.modal > pre, +.modal > textarea { + white-space: pre-wrap; + overflow: auto; + width: 100%; +} + +body.modal-overlay-active { + overflow: hidden; + height: 100vh; +} + +body.modal-overlay-active #modal_overlay { + left: 0; + right: 0; + opacity: 1; + visibility: visible; +} + +.btn .close, .alert-message .close { + font-family: Arial, sans-serif; + line-height: 18px; +} + +.btn.danger, +.alert-message.danger, +.btn.error, +.alert-message.error, +.cbi-tooltip.error { + background: linear-gradient(var(--error-color-low), var(--error-color-medium)); + color: var(--on-error-color); + border-color: var(--error-color-high) var(--error-color-high) var(--error-color-low); +} + +.btn.success, .alert-message.success, .cbi-tooltip.success { + background: linear-gradient(var(--success-color-low), var(--success-color-medium)); + color: var(--on-error-color); + border-color: var(--success-color-high) var(--success-color-high) var(--success-color-low); +} + +.btn.info, .alert-message.info, .cbi-tooltip.info { + background: linear-gradient(var(--primary-color-low), var(--primary-color-medium)); + color: var(--on-primary-color); + border-color: var(--primary-color-high) var(--primary-color-high) var(--primary-color-low); +} + +.alert-message.notice, .cbi-tooltip.notice { + background: linear-gradient(var(--background-color-low), var(--background-color-medium)); + border-color: var(--background-color-high) var(--background-color-high) var(--background-color-low); + color: var(--text-color-high); +} + +.alert-message.warning { + background: linear-gradient(var(--warn-color-low), var(--warn-color-medium)); + border-color: var(--warn-color-high) var(--warn-color-high) var(--warn-color-low); + color: var(--on-warn-color); +} + +.modal.alert-message { + color: var(--text-color-high); +} + +.item::after, +.btn, +.cbi-button { + --default-btn-background: linear-gradient(var(--background-color-high), var(--background-color-high) 25%, var(--background-color-low)); + --on-color: var(--text-color-high); + + cursor: pointer; + display: inline-block; + background: var(--default-btn-background); + padding: 0 14px; + color: var(--on-color); + font-size: 13px; + line-height: 2em; + border: 1px solid var(--border-color-high); + border-radius: 4px; + white-space: pre; +} + +.cbi-input-invalid, +.cbi-input-invalid.cbi-dropdown:not(.btn):not(.cbi-button), +.cbi-input-invalid.cbi-dropdown:not([open]) > ul > li, +.cbi-value-error input { + color: var(--error-color-high); + border-color: var(--error-color-medium); +} + +.cbi-button-positive, +.cbi-button-fieldadd, +.cbi-button-add, +.cbi-button-save { + --on-color: var(--success-color-high); + border-color: var(--on-color); +} + +.cbi-button-neutral, +.cbi-button-download, +.cbi-button-find, +.cbi-button-link, +.cbi-button-up, +.cbi-button-down { + color: var(--text-color-high); +} + +.btn.primary, +.cbi-button-action, +.cbi-button-apply, +.cbi-button-reload, +.cbi-button-edit { + --on-color: var(--primary-color-high); + border-color: var(--on-color); +} + +.cbi-button-negative, +.cbi-section-remove .cbi-button, +.cbi-button-reset, +.cbi-button-remove { + --on-color: var(--error-color-high); + border-color: var(--on-color); +} + +.cbi-page-actions::after { + display: table; + content: ""; + clear: both; +} + +.cbi-page-actions > * { + vertical-align: middle; +} + +.cbi-page-actions > :not([method="post"]):not(.cbi-button-apply):not(.cbi-button-negative):not(.cbi-button-save):not(.cbi-button-reset) { + float: left; + margin-right: .4em; +} + +.btn.primary, +.cbi-button-action.important, +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit { + --on-color: var(--on-primary-color); + background: linear-gradient(var(--primary-color-medium), var(--primary-color-low)); + border-color: var(--primary-color-high); +} + +.cbi-button-positive.important, +.cbi-page-actions .cbi-button-save { + --on-color: var(--on-success-color); + background: linear-gradient(var(--success-color-medium), var(--success-color-low)); + border-color: var(--success-color-high); +} + +.cbi-button-negative.important { + --on-color: var(--on-error-color); + background: linear-gradient(var(--error-color-medium), var(--error-color-low)); + border-color: var(--error-color-high); +} + +.cbi-page-actions .cbi-button-apply + .cbi-button-save, +.cbi-page-actions .cbi-button-negative + .cbi-button-save { + --on-color: var(--success-color-high); + border-color: var(--on-color); + background: var(--default-btn-background); +} + +.cbi-dropdown { + display: inline-flex !important; + cursor: pointer; + height: auto; + position: relative; + padding: 0 !important; +} + +.cbi-dropdown:not(.btn):not(.cbi-button) { + background: linear-gradient(var(--background-color-high) 0%, var(--border-color-low) 100%); + border: 1px solid var(--border-color-high); + border-radius: 3px; + color: var(--text-color-high); +} + +.cbi-dropdown > ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: hidden; + display: flex; + width: 100%; +} + +.cbi-dropdown.btn > ul:not(.dropdown), +.cbi-dropdown.cbi-button > ul:not(.dropdown) { + margin: 0 0 0 13px !important; +} + +.cbi-dropdown.btn.spinning > ul:not(.dropdown), +.cbi-dropdown.cbi-button.spinning > ul:not(.dropdown) { + margin: 0 !important; +} + +.cbi-dropdown > ul.preview { + display: none; +} + +.cbi-dropdown > .open, +.cbi-dropdown > .more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + line-height: 2em; + padding: 0 .3em; +} + +.cbi-dropdown.btn > .open, +.cbi-dropdown.cbi-button > .open { + padding: 0 .5em; + margin-left: .5em; + border-left: 1px solid; +} + +.cbi-dropdown > .more, +.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li[placeholder] { + color: var(--text-color-medium); + display: none; +} + +.cbi-dropdown > ul > li { + display: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + color: inherit; +} + +.cbi-dropdown > ul.dropdown > li, +.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li { + min-height: 20px; + padding: .25em; + color: var(--text-color-high); +} + +.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } +.cbi-dropdown > ul > li .hide-close { display: none; } + +.cbi-dropdown > ul > li[display]:not([display="0"]) { + border-left: 1px solid var(--border-color-high); +} + +.cbi-dropdown[empty] > ul { + max-width: 1px; +} + +.cbi-dropdown > ul > li > form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown > ul > li img { + vertical-align: middle; + margin-right: .25em; +} + +.cbi-dropdown > ul > li > form > input[type="checkbox"] { + margin: 0 .25em 0 0; +} + +.cbi-dropdown > ul > li input[type="text"] { + height: 20px; +} + +.cbi-dropdown[open] { + position: relative; +} + +.cbi-dropdown[open] > ul.dropdown { + display: block; + background: var(--background-color-low); + border: 1px solid #918e8c; + box-shadow: 0 0 4px #918e8c; + position: absolute; + z-index: 1100; + max-width: none; + min-width: 100%; + width: auto; + transition: max-height .125s ease-in; + overflow-y: auto; +} + +.cbi-dropdown > ul > li[display], +.cbi-dropdown[open] > ul.preview, +.cbi-dropdown[open] > ul.dropdown > li, +.cbi-dropdown[multiple] > ul > li > label, +.cbi-dropdown[multiple][open] > ul.dropdown > li, +.cbi-dropdown[multiple][more] > .more, +.cbi-dropdown[multiple][empty] > .more { + flex-grow: 1; + display: flex !important; +} + +.cbi-dropdown[empty] > ul > li, +.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder] { + display: block !important; +} + +.cbi-dropdown[multiple][open] > ul.dropdown > li > form { + display: flex !important; +} + +.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } +.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } + +.cbi-dropdown[open] > ul.dropdown > li { + border-bottom: 1px solid var(--border-color-high); +} + +.cbi-dropdown[open] > ul.dropdown > li[selected] { + background: var(--primary-color-medium); + color: var(--on-primary-color); +} + +.cbi-dropdown[open] > ul.dropdown > li.focus { + background: var(--primary-color-low); + color: var(--on-primary-color); +} + +.cbi-dropdown[open] > ul.dropdown > li[selected].focus { + background: linear-gradient(90deg, var(--primary-color-medium) 50%, var(--primary-color-low)); +} + +.cbi-dropdown[open] > ul.dropdown > li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[open] > ul.dropdown > li[unselectable] { + opacity: 0.7; +} + +.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { + width: 100%; +} + +.cbi-title-ref { + color: #37c; +} + +.cbi-title-ref::after { + content: "➙"; +} + +.cbi-tooltip-container { + cursor: help; +} + +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -10000px; + box-shadow: 0 0 2px var(--border-color-high); + border-radius: 3px; + background: var(--background-color-high); + white-space: pre; + padding: 2px 5px; + opacity: 0; + transition: opacity .25s ease-in; +} + +.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { + left: auto; + opacity: 1; + transition: opacity .25s ease-in; +} + +.cbi-progressbar { + border: 1px solid var(--border-color-high); + border-radius: 3px; + position: relative; + min-width: 170px; + height: 8px; + margin: 1.4em 0 4px 0; + background: var(--background-color-medium); +} + +.cbi-progressbar > div { + background: var(--primary-color-medium); + height: 100%; + transition: width .25s ease-in; + width: 0%; + border-radius: 2px; +} + +.cbi-progressbar::before { + position: absolute; + top: -1.4em; + left: 0; + content: attr(title); + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; +} + +.zonebadge .cbi-tooltip { + padding: 1px; + background: inherit; + margin: -1.6em 0 0 -5px; + border-radius: 3px; + pointer-events: none; + box-shadow: 0 0 3px #444; +} + +.zonebadge .cbi-tooltip > * { + margin: 1px; + z-index: 2; + position: relative; +} + +.zone-forwards { + display: flex; + flex-wrap: wrap; +} + +.zone-forwards > * { + flex: 1 1 40%; + padding: 1px; +} + +.zone-forwards > span { + flex-basis: 10%; + text-align: center; +} + +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} + +.btn.active, .btn:active { + box-shadow: inset 0 2px 4px hsla(var(--border-color-low-hsl), .25), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + opacity: var(--disabled-opacity); + box-shadow: none; +} + +.btn.large { + font-size: 15px; + line-height: normal; + padding: 9px 14px 9px; + border-radius: 6px; +} + +.btn.small { + padding: 7px 9px 7px; + font-size: 11px; +} + +button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +.close { + float: right; + color: #000; + font-size: 20px; + font-weight: bold; + line-height: 13.5px; + text-shadow: 0 1px 0 #fff; + opacity: 0.25; +} + +.close:hover { + color: #000; + text-decoration: none; + opacity: 0.4; +} + +.alert-message { + position: relative; + padding: .5em .5em .25em .5em; + margin-bottom: .5em; + color: var(--on-warn-color); + background: linear-gradient(#fceec1, #eedc94); + border: 1px solid var(--border-color-low); + border-color: var(--border-color-high) var(--border-color-high) var(--border-color-low); + border-radius: 4px; + box-shadow: 1px 1px 1px var(--border-color-low); + white-space: unset; +} + +.alert-message .close { + margin-top: 1px; +} + +.alert-message h4, +.alert-message h5, +.alert-message pre, +.alert-message ul, +.alert-message li, +.alert-message p { + color: inherit; + border: none; + line-height: inherit; + background: transparent; + padding: 0; + margin: .25em 0; +} + +.alert-message button { + margin: .25em 0; +} + +.label, +header [data-indicator] { + padding: 3px 3px 2px; + font-size: 9.75px; + font-weight: bold; + color: var(--text-color-high); + text-transform: uppercase; + white-space: nowrap; + background-color: var(--background-color-low); + border-radius: 3px; + text-shadow: none; + margin: .125em 0 .125em .4em; +} + +header [data-indicator][data-clickable] { + cursor: pointer; +} + +a.label:link, +a.label:visited { + color: #fff; +} + +a.label:hover { + text-decoration: none; +} + +.label.important { + background-color: var(--primary-color-high); + color: var(--on-primary-color); +} + +.label.warning { + background-color: var(--warn-color-high); + color: var(--on-warn-color); +} + +.label.success { + background-color: var(--success-color-high); + color: var(--on-success-color); +} + +.label.notice, +header [data-indicator][data-style="active"] { + color: var(--on-primary-color); + background-color: var(--primary-color-high); +} + +/* LuCI specific items */ +.hidden { display: none } + +form.inline { display: inline; margin-bottom: 0; } + +#modemenu li:last-child span.divider { display: none } + +#syslog { + width: 100%; + color: var(--text-color-highest); + margin-bottom: 18px; +} + +.cbi-section-table .tr:hover .td, +.cbi-section-table .tr:hover .th, +.cbi-section-table .tr:hover::before { + background-color: var(--background-color-low); +} + +.cbi-section-table .tr.cbi-section-table-descr .th { + font-weight: normal; +} + +.cbi-section-table-titles.named::before, +.cbi-section-table-descr.named::before, +.cbi-section-table-row[data-title]::before { + content: attr(data-title) " "; + display: table-cell; + padding: 10px 10px 9px; + line-height: 18px; + font-weight: bold; + vertical-align: middle; +} + +.cbi-section-table-titles.named::before, +.cbi-section-table-descr.named::before, +.cbi-section-table-row[data-title]::before { + border-top: 1px solid var(--border-color-medium); +} + +.left { text-align: left !important; } +.right { text-align: right !important; } +.center { text-align: center !important; } +.top { vertical-align: top !important; } +.middle { vertical-align: middle !important; } +.bottom { vertical-align: bottom !important; } + +table table td, +.cbi-value-field table td { + border: none; +} + +.table.cbi-section-table input[type="password"], +.table.cbi-section-table input[type="text"], +.table.cbi-section-table textarea, +.table.cbi-section-table select, +.table.cbi-section-table .cbi-select { + width: 100%; + min-width: auto; +} + +.table.cbi-section-table .td.cbi-section-table-cell { + white-space: nowrap; + text-align: right; +} + +.table.cbi-section-table .td.cbi-section-table-cell select, +.table.cbi-section-table .td.cbi-section-table-cell .cbi-select { + width: inherit; +} + +.td.cbi-section-actions { + text-align: right; + vertical-align: middle; + width: 15%; +} + +.td.cbi-section-actions > * { + display: flex; +} + +.td.cbi-section-actions > :not(.cbi-dropdown) > *, +.td.cbi-section-actions > * > form > * { + flex: 1 1 4em; + margin: 0 1px; +} + +.td.cbi-section-actions > * > form { + display: inline-flex; + margin: 0; +} + +.table.valign-middle .td { + vertical-align: middle; +} + +.cbi-rowstyle-2, +.tr.table-titles, +.tr.cbi-section-table-titles { + background: var(--background-color-medium); +} + +th[data-sortable-row] { cursor: pointer; } +th[data-sort-direction="asc"]::after { content: "\a0\25b2"; } +th[data-sort-direction="desc"]::after { content: "\a0\25bc"; } + +.cbi-value-description { + margin: .25em 0 0 1.25em; + position: relative; +} + +.cbi-value-description:not(:empty)::before { + --help-icon: url("data:image/svg+xml,"); + + position: absolute; + left: -1.25em; + content: "\a0"; + display: inline-block; + width: 1em; + height: 1em; + margin-right: .25em; + background: var(--primary-color-high); + mask-image: var(--help-icon); + mask-size: cover; + -webkit-mask-image: var(--help-icon); + -webkit-mask-size: cover; +} + +.cbi-section-error { + border: 1px solid #f00; + border-radius: 3px; + background-color: #fce6e6; + padding: 5px; + margin-bottom: 18px; +} + +.cbi-section-error ul { margin: 0 0 0 20px; } + +.cbi-section-error ul li { + color: #f00; + font-weight: bold; +} + +.ifacebox { + border: 1px solid var(--border-color-high); + margin: 0 10px; + text-align: center; + white-space: nowrap; + background: linear-gradient(var(--background-color-high), var(--background-color-medium)); + border-radius: 4px; + box-shadow: inset 0 1px 0 hsla(var(--text-color-low-hsl), 0.05); + display: inline-flex; + flex-direction: column; + line-height: 1.2em; + min-width: 100px; +} + +.ifacebox .ifacebox-head { + border-bottom: 1px solid var(--border-color-high); + border-radius: 3px 3px 0 0; + padding: 2px; + background: #eee; + color: var(--text-color-high); +} + +.ifacebox .ifacebox-head[style] { + text-shadow: 0 1px 1px hsla(var(--background-color-high-hsl), 0.75); +} + +.ifacebox .ifacebox-head.active { + background: var(--primary-color-high); + color: var(--on-primary-color); +} + +[data-darkmode="true"] .zonebadge[style], +[data-darkmode="true"] .ifacebox-head[style] { + background: linear-gradient(rgba(var(--zone-color-rgb), .4), rgba(var(--zone-color-rgb), .3)) !important; +} + +.ifacebox .ifacebox-body { + padding: .25em; +} + +.ifacebadge { + display: inline-block; + flex-direction: row; + white-space: nowrap; + border: 1px solid var(--border-color-high); + padding: 2px; + background: linear-gradient(var(--background-color-high), var(--background-color-high) 25%, var(--background-color-medium)); + color: var(--text-color-high); + text-shadow: 0 1px 1px hsla(var(--background-color-high-hsl), 0.75); + border-radius: 4px; + box-shadow: inset 0 1px 0 hsla(var(--background-color-high-hsl), 0.05); + cursor: default; + line-height: 1.2em; +} + +.ifacebadge img { + width: 16px; + height: 16px; + vertical-align: middle; +} + +.ifacebadge-active { + border-color: #000; + font-weight: bold; +} + +.network-status-table { + display: flex; + flex-wrap: wrap; +} + +.network-status-table .ifacebox { + margin: .5em; + flex-grow: 1; +} + +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + height: 100%; + text-align: left; +} + +.network-status-table .ifacebox-body > * { + margin: .25em; +} + +.network-status-table .ifacebox-body > span { + flex: 10 10 auto; + height: 100%; +} + +.network-status-table .ifacebox-body > div { + margin: -.125em; + display: flex; + flex-wrap: wrap; +} + +#dsl_status_table .ifacebox-body span > strong { + display: inline-block; + min-width: 35%; +} + +.ifacebadge.large, +.network-status-table .ifacebox-body .ifacebadge { + display: flex; + flex: 1; + padding: .25em; + min-width: 220px; + margin: .125em; +} + +.ifacebadge.large { + display: inline-flex; +} + +.network-status-table .ifacebox-body .ifacebadge > span { + overflow: hidden; + text-overflow: ellipsis; +} + +.ifacebadge > *, +.ifacebadge.large > * { + margin: 0 .125em; +} + +.zonebadge { + padding: 2px; + border-radius: 4px; + display: inline-block; + white-space: nowrap; + color: var(--text-color-high); + text-shadow: 0 1px 1px hsla(var(--background-color-high-hsl), 0.75); +} + +.zonebadge > em, +.zonebadge > strong { + margin: 0 2px; + display: inline-block; +} + +.zonebadge input { + width: 6em; +} + +.zonebadge > .ifacebadge { + margin-left: 2px; +} + +.zonebadge-empty { + border: 1px dashed #aaa; + color: #aaa; + font-style: italic; + font-size: smaller; +} + +div.cbi-value var, +.td.cbi-value-field var { + font-style: italic; + color: #0069d6; +} + +div.cbi-value var[data-tooltip], +.td.cbi-value-field var[data-tooltip], +div.cbi-value var.cbi-tooltip-container, +.td.cbi-value-field var.cbi-tooltip-container { + cursor: help; + border-bottom: 1px dotted #0069d6; +} + +div.cbi-value var.cbi-tooltip-container, +.td.cbi-value-field var.cbi-tooltip-container .cbi-tooltip { + font-style: normal; + white-space: normal; + color: var(--text-color-high); +} + +#modal_overlay > .modal.uci-dialog, +#modal_overlay > .modal.cbi-modal { + max-width: 900px; +} + +#modal_overlay > .modal.login > button.important { + font-size: 120% !important; + margin-top: .5em; + width: 100%; +} + +.uci-change-list { + line-height: 170%; + white-space: pre; +} + +.uci-dialog div > del, +.uci-dialog div > ins, +.uci-dialog div > var { + margin-bottom: 2px; + border: 1px solid var(--border-color-high); + line-height: 15px; + overflow: hidden; + text-overflow: ellipsis; + padding: 2px; + position: relative; + background-color: var(--background-color-low); +} + +.uci-dialog div > ins { + background-color: rgba(var(--success-color-high-rgb), .3); + border-color: rgba(var(--success-color-high-rgb), .6); +} + +.uci-dialog div > del { + background-color: rgba(var(--error-color-high-rgb), .3); + border-color: rgba(var(--error-color-high-rgb), .6); +} + +.uci-dialog var > ins { + background-color: rgba(var(--success-color-high-rgb), .3); +} + +.uci-dialog var > del { + background-color: rgba(var(--error-color-high-rgb), .3); +} + +.uci-change-list > var > * { + overflow: hidden; + text-overflow: ellipsis; +} + +.uci-dialog del, +.uci-dialog ins, +.uci-dialog var { + text-decoration: none; + font-family: monospace; + font-style: normal; + color: var(--text-color-high); + display: block; +} + +.uci-change-legend { + display: flex; + flex-wrap: wrap; +} + +.uci-change-legend-label { + flex-basis: 150px; + margin: 2px; + display: flex; + align-items: center; +} + +.uci-change-legend-label > ins, +.uci-change-legend-label > del, +.uci-change-legend-label > var { + margin-right: 4px; + width: 16px; + height: 16px; + display: flex; +} + +.uci-change-legend-label > * > * { + flex-basis: 100%; + padding: 1px; +} + +#applyreboot-section { + line-height: 300%; +} + +@keyframes flash { + 0% { opacity: 1; } + 50% { opacity: .5; } + 100% { opacity: 1; } +} + +.flash { + animation: flash .35s; +} + +#view > div.spinning:first-child { + display: table; + margin: 15vh auto; +} + +.spinning { + position: relative; + padding-left: 32px !important; +} + +.spinning::before { + --spinner-icon: url("data:image/svg+xml,"); + + position: absolute; + top: calc(50% - 10px); + left: 6px; + width: 20px; + height: 20px; + content: " "; + background: var(--on-color, #000); + mask: var(--spinner-icon) center/cover no-repeat; + -webkit-mask: var(--spinner-icon) center/cover no-repeat; +} + +[data-darkmode="true"] .spinning::before { + background: var(--on-color, #fff); +} + +[data-tab-title] { + height: 0; + opacity: 0; + overflow: hidden; +} + +[data-tab-active="true"] { + opacity: 1; + height: auto; + overflow: visible; + transition: opacity .25s ease-in; +} + +.cbi-filebrowser { + min-width: 210px; + max-width: 100%; + border: 1px solid #ccc; + border-radius: 3px; + display: flex; + flex-direction: column; + opacity: 0; + height: 0; + overflow: hidden; +} + +.cbi-filebrowser.open { + opacity: 1; + height: auto; + overflow: visible; + transition: opacity .25s ease-in; +} + +.cbi-filebrowser > * { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + padding: 0 0 .25em 0; + margin: .25em .25em 0px .25em; + white-space: nowrap; + border-bottom: 1px solid #ccc; +} + +.cbi-filebrowser .cbi-button-positive { + margin-right: .25em; +} + +.cbi-filebrowser > div { + border-bottom: none; +} + +.cbi-filebrowser > ul > li { + display: flex; + flex-direction: row; +} + +.cbi-filebrowser > ul > li:hover { + background: #f5f5f5; +} + +.cbi-filebrowser > ul > li > div:first-child { + flex: 10; + overflow: hidden; + text-overflow: ellipsis; +} + +.cbi-filebrowser > ul > li > div:last-child { + flex: 3; + text-align: right; +} + +.cbi-filebrowser > ul > li > div:last-child > button { + padding: .125em .25em; + margin: 1px 0 1px .25em; +} + +.cbi-filebrowser .upload { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 0 -.125em .25em -.125em; + padding: 0 0 .125em 0px; + border-bottom: 1px solid #ccc; +} + +.cbi-filebrowser .upload > * { + margin: .125em; + flex: 1; +} + +.cbi-filebrowser .upload > .btn { + flex-basis: 60px; +} + +.cbi-filebrowser .upload > div { + flex: 10; + min-width: 150px; +} + +.cbi-filebrowser .upload > div > input { + width: 100%; +} + +@keyframes fade-in { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +@keyframes fade-out { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +.fade-in { + animation: fade-in .4s ease; +} + +.fade-out { + animation: fade-out .4s ease; +} + +.assoclist .ifacebadge { + display: flex; + flex-direction: column; + align-items: center; + white-space: normal; + text-align: center; +} + +.assoclist .ifacebadge > img { + margin: .2em; +} + +.assoclist .td:nth-of-type(3), +.assoclist .td:nth-of-type(5) { + width: 25%; +} + +.assoclist .td:nth-of-type(6) button { + word-break: normal; +} + +[data-darkmode="true"] [data-page="admin-statistics-graphs"] [data-plugin] img { + filter: invert(100%) hue-rotate(150deg); +} + +[data-page="admin-system-admin-sshkeys"] .cbi-dynlist { + max-width: none; +} diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png b/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..90adf2f94f5551c42f373ce68e583734674bb5c0 GIT binary patch literal 592 zcmV-W0sx-8_0H705DDyb8#cVN;Glw$k z+G8+nC!myy0N~(pI3i;?Zs3-Ijs3#_k*ZP*Fo^L8D`Amc+daHCV!K|1$c!#+z-N98 zVt;aV3mgGNM-%Lym^xoLozqKr6<o-c0x6&HixcW#uZ^&-w@%LEO;QQ=jt%5?4B<;!g%k`k8#@@}+@&tT<*oQ%)F@6Q zDlTL{Bn4?<= li, .cbi-tabmenu > li { + height: 30px; + } + + .tabs > li > a, .cbi-tabmenu > li > a { + padding: 0 8px; + line-height: 30px; + } + + .table { + display: flex; + flex-direction: column; + width: 100%; + } + + .tr { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-end; + border-top: 1px solid var(--border-color-medium); + padding: 5px 0; + margin: 0 -3px; + } + + .table .th, + .table .td, + .table .tr::before { + flex: 1 1 50%; + align-self: flex-start; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: break-word; + display: inline-block; + border-top: none; + padding: 3px; + box-sizing: border-box; + } + + .table .td.cbi-dropdown-open { + overflow: visible; + } + + .col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; } + .col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; } + .col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; } + .col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; } + .col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; } + .col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; } + .col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; } + .col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; } + .col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; } + .col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; } + + .td select { + word-wrap: normal; + } + + .td[data-widget="button"], + .td[data-widget="fvalue"] { + flex: 1 1 17%; + text-align: left; + } + + .td.cbi-value-field { + align-self: flex-start; + flex-basis: 100%; + margin-bottom: .3em; + } + + .td.cbi-value-field .cbi-button { + width: 100%; + } + + .table.cbi-section-table { + border: none; + background: none; + margin: 0; + } + + .tr.table-titles, + .cbi-section-table-titles, + .cbi-section-table-descr { + display: none; + } + + .cbi-section-table-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 0 0 .5em 0; + } + + .cbi-section-table + .cbi-section-create { + padding-top: 0; + } + + .tr[data-title]::before { + display: block; + flex: 1 1 100%; + background: var(--background-color-low) !important; + font-size: 16px; + border-bottom: 1px solid var(--border-color-medium); + } + + .td[data-title]::before { + content: attr(data-title); + font-weight: bold; + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: pre-line; + } + + .td[data-description]::after { + display: block; + } + + .td[data-title] ~ .td.cbi-section-actions { + align-self: flex-start; + } + + .td.cbi-section-actions { + overflow: initial; + max-width: 100%; + padding: 3px 2px; + flex-basis: 100%; + } + + .hide-sm, + .hide-xs { + display: none !important; + } + + .td.cbi-value-field[data-widget="CBI.DummyValue"], + .td.cbi-value-field[data-widget="CBI.Button"], + .td.cbi-value-field[data-widget="CBI.FlagValue"], + .td.cbi-value-field[data-widget="dvalue"], + .td.cbi-value-field[data-widget="button"], + .td.cbi-value-field[data-widget="fvalue"] { + flex-basis: 50%; + text-align: left; + } + + .cbi-section-table .tr:hover .td, + .cbi-section-table .tr:hover .th, + .cbi-section-table .tr:hover::before { + background-color: transparent; + } + + .cbi-tab-descr { + margin: 0 0 .5em 0; + } + + .cbi-value { + padding-bottom: .5em; + border-bottom: 1px solid var(--border-color-high); + margin-bottom: .5em; + display: block; + } + + .cbi-value.hidden { + display: none; + } + + .cbi-value .cbi-value:last-child { + border-bottom: none; + padding-bottom: inherit; + margin-bottom: inherit; + } + + .cbi-value label.cbi-value-title { + font-weight: bold; + } + + .cbi-value-field, .cbi-select, .cbi-dynlist, .cbi-dropdown:not(.btn):not(.cbi-button) { + width: 100%; + margin: 0; + } + + .cbi-dynlist > .item { + min-height: 30px; + display: flex; + align-items: center; + } + + input, textarea, select, + .cbi-dropdown > ul > li { + font-size: 16px !important; + height: auto; + } + + .cbi-dropdown > ul > li input[type="text"] { + line-height: 28px; + } + + select, input[type="text"], input[type="password"], + .cbi-dropdown > ul > li input[type="text"], + .cbi-value-field .control-group { + width: 100%; + height: 30px; + } + + input.cbi-input-password { + width: calc(100% - 25px); + } + + input[type="text"] + .cbi-button, + input[type="password"] + .cbi-button, + select + .cbi-button { + overflow: hidden; + text-overflow: ellipsis; + } + + .cbi-value-field input[type="checkbox"], + .cbi-value-field input[type="radio"] { + margin: 0; + } + + button, .btn, .cbi-button { + font-size: 14px !important; + padding: 0 8px; + } + + .actions, + .cbi-page-actions { + border-top: none; + margin-top: -.5em; + padding: 8px; + } + + [data-page="admin-status-overview"] .td[width="33%"] { + flex-basis: 33%; + } + + header .pull-right .label { + white-space: normal; + display: inline-block; + text-align: center; + line-height: 12px; + margin: 1px 0; + } + + header > .fill { + padding: 1px; + } + + header > .fill > .container { + display: flex; + flex-direction: row; + } + + header .nav { + flex: 3 3 80%; + margin: 2px 5px 2px 0; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + } + + header .nav a { + padding: 2px 6px; + } + + header .pull-right { + flex: 0 1 20%; + display: flex; + flex-direction: column; + padding: 0; + justify-content: space-around; + margin: .2em 5px .2em auto; + } + + .menu-dropdown, .dropdown-menu { + top: 23px; + } + + .cbi-optionals, + .cbi-section-create { + padding: 0 0 14px 0; + } + + #cbi-network-switch_vlan .th, + #cbi-network-switch_vlan .td { + flex-basis: 12%; + } + + #cbi-network-switch_vlan .td.cbi-section-actions > * { + width: auto; + display: block; + } + + #wifi_assoclist_table .td, + [data-page="admin-status-processes"] .td { + flex-basis: 50% !important; + } + + [data-page="admin-status-processes"] .td[data-widget="button"] { + flex-basis: 33% !important; + } + + [data-page="admin-status-processes"] .td[data-name="PID"], + [data-page="admin-status-processes"] .td[data-name="USER"] { + flex-basis: 25% !important; + } + + [data-page="admin-system-fstab"] .td[data-widget="button"]::before, + [data-page="admin-system-startup"] .td[data-widget="button"]::before, + [data-page="admin-status-processes"] .td[data-widget="button"]::before { + display: none; + } + + [data-name="bridge-vlan"] > div { + overflow: visible !important; + } + + [data-name="bridge-vlan"] .td[data-title] { + flex-basis: 33%; + } + + [data-name="bridge-vlan"] .td[data-title]::before { + content: attr(data-title); + } + + [data-page="admin-network-network"] .td[data-name="_ifacebox"] { + flex-basis: 40%; + } + + [data-page="admin-network-network"] .td[data-name="_ifacestat"] { + flex-basis: 60%; + } +} + +@media screen and (max-device-width: 375px) { + .cbi-page-actions { + display: flex; + justify-content: space-between; + margin: 0 -1px; + padding: 0; + } + + .cbi-page-actions button { + overflow: hidden; + text-overflow: ellipsis; + } + + .cbi-page-actions .cbi-button { + flex: 1; + margin: 1px !important; + line-height: 2em; + } + + .cbi-page-actions .cbi-button-negative, + .cbi-page-actions .cbi-button-primary, + .cbi-page-actions .cbi-button-apply { + flex: 3; + } + + .cbi-section-actions .cbi-button { + overflow: hidden; + text-overflow: ellipsis; + margin: 1px !important; + } + + body[data-page="admin-network-wireless"] .td[data-name="_badge"] { + max-width: 50px; + align-self: center; + } + + body[data-page="admin-network-wireless"] .td[data-name="_badge"] .ifacebadge { + display: flex; + align-items: center; + flex-direction: column; + } + + body[data-page="admin-network-wireless"] .td[data-name="_stat"] { + flex-basis: 60%; + } + + body[data-page="admin-network-network"] .td.cbi-section-actions::before, + body[data-page="admin-network-wireless"] .td.cbi-section-actions::before { + content: none !important; + } + + [data-page="admin-network-network"] .td[data-name="_ifacebox"], + [data-page="admin-network-network"] .td[data-name="_ifacestat"] { + flex-basis: 100%; + } + + .td .ifacebox { + width: 100%; + margin: 0 !important; + flex-direction: row; + } + + .td .ifacebox .ifacebox-head { + min-width: 25%; + justify-content: space-around; + border-radius: 4px 0 0 4px; + } + + .td .ifacebox .ifacebox-head, + .td .ifacebox .ifacebox-body { + display: flex; + border-bottom: none; + align-items: center; + } + + .td .ifacebox .ifacebox-head > *, + .ifacebox .ifacebox-body > * { + margin: .125em; + } +} diff --git a/luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js b/luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js new file mode 100644 index 000000000..32922f384 --- /dev/null +++ b/luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js @@ -0,0 +1,101 @@ +'use strict'; +'require baseclass'; +'require ui'; + +return baseclass.extend({ + __init__: function() { + ui.menu.load().then(L.bind(this.render, this)); + }, + + render: function(tree) { + var node = tree, + url = ''; + + this.renderModeMenu(tree); + + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) + this.renderTabMenu(node, url); + } + }, + + renderTabMenu: function(tree, url, level) { + var container = document.querySelector('#tabmenu'), + ul = E('ul', { 'class': 'tabs' }), + children = ui.menu.getChildren(tree), + activeNode = null; + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[3 + (level || 0)] == children[i].name), + activeClass = isActive ? ' active' : '', + className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); + + ul.appendChild(E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] )])); + + if (isActive) + activeNode = children[i]; + } + + if (ul.children.length == 0) + return E([]); + + container.appendChild(ul); + container.style.display = ''; + + if (activeNode) + this.renderTabMenu(activeNode, url + '/' + activeNode.name, (level || 0) + 1); + + return ul; + }, + + renderMainMenu: function(tree, url, level) { + var ul = level ? E('ul', { 'class': 'dropdown-menu' }) : document.querySelector('#topmenu'), + children = ui.menu.getChildren(tree); + + if (children.length == 0 || level > 1) + return E([]); + + for (var i = 0; i < children.length; i++) { + var submenu = this.renderMainMenu(children[i], url + '/' + children[i].name, (level || 0) + 1), + subclass = (!level && submenu.firstElementChild) ? 'dropdown' : null, + linkclass = (!level && submenu.firstElementChild) ? 'menu' : null, + linkurl = submenu.firstElementChild ? '#' : L.url(url, children[i].name); + + var li = E('li', { 'class': subclass }, [ + E('a', { 'class': linkclass, 'href': linkurl }, [ _(children[i].title) ]), + submenu + ]); + + ul.appendChild(li); + } + + ul.style.display = ''; + + return ul; + }, + + renderModeMenu: function(tree) { + var ul = document.querySelector('#modemenu'), + children = ui.menu.getChildren(tree); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + ul.appendChild(E('li', { 'class': isActive ? 'active' : null }, [ + E('a', { 'href': L.url(children[i].name) }, [ _(children[i].title) ]) + ])); + + if (isActive) + this.renderMainMenu(children[i], children[i].name); + } + + if (ul.children.length > 1) + ul.style.display = ''; + } +}); diff --git a/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js b/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js new file mode 100644 index 000000000..fd936c9b1 --- /dev/null +++ b/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js @@ -0,0 +1,34 @@ +'use strict'; +'require ui'; +'require view'; + +return view.extend({ + render: function() { + var form = document.querySelector('form'), + btn = document.querySelector('button'); + + var dlg = ui.showModal( + _('Authorization Required'), + [].slice.call(document.querySelectorAll('section > *')), + 'login' + ); + + form.addEventListener('keypress', function(ev) { + if (ev.key == 'Enter') + btn.click(); + }); + + btn.addEventListener('click', function() { + dlg.querySelectorAll('*').forEach(function(node) { node.style.display = 'none' }); + dlg.appendChild(E('div', { 'class': 'spinning' }, _('Logging in…'))); + + form.submit() + }); + + document.querySelector('input[type="password"]').focus(); + + return ''; + }, + + addFooter: function() {} +}); diff --git a/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap b/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap new file mode 100755 index 000000000..f83d84702 --- /dev/null +++ b/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap @@ -0,0 +1,28 @@ +#!/bin/sh + +changed=0 + +set_opt() { + local key=$1 + local val=$2 + + if ! uci -q get "luci.$key" 2>/dev/null; then + uci set "luci.$key=$val" + changed=1 + fi +} + +set_opt themes.Bootstrap /luci-static/bootstrap + +if [ "$PKG_UPGRADE" != 1 ] && [ $changed = 1 ]; then + set_opt main.mediaurlbase /luci-static/bootstrap +fi + +set_opt themes.BootstrapDark /luci-static/bootstrap-dark +set_opt themes.BootstrapLight /luci-static/bootstrap-light + +if [ $changed = 1 ]; then + uci commit luci +fi + +exit 0 diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap-dark b/luci-theme-bootstrap/ucode/template/themes/bootstrap-dark new file mode 120000 index 000000000..ac7bcbbf3 --- /dev/null +++ b/luci-theme-bootstrap/ucode/template/themes/bootstrap-dark @@ -0,0 +1 @@ +bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap-light b/luci-theme-bootstrap/ucode/template/themes/bootstrap-light new file mode 120000 index 000000000..ac7bcbbf3 --- /dev/null +++ b/luci-theme-bootstrap/ucode/template/themes/bootstrap-light @@ -0,0 +1 @@ +bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut b/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut new file mode 100644 index 000000000..603172405 --- /dev/null +++ b/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut @@ -0,0 +1,20 @@ + {% if (!blank_page): %} +
+ + + {% endif %} + + diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut b/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut new file mode 100644 index 000000000..b7bc770b4 --- /dev/null +++ b/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut @@ -0,0 +1,83 @@ +{# + Copyright 2008 Steven Barth + Copyright 2012 David Menting + Copyright 2008-2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% + import { getuid, getspnam } from 'luci.core'; + + const boardinfo = ubus.call('system', 'board'); + const darkpref = (theme == 'bootstrap-dark' ? 'true' : (theme == 'bootstrap-light' ? 'false' : null)); + + http.prepare_content('text/html; charset=UTF-8'); +-%} + + + + + + {{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI + {% if (!darkpref): %} + + {% endif %} + + + + + {% if (node?.css): %} + + {% endif %} + {% if (css): %} + + {% endif %} + + + + + + {% if (!blank_page): %} +
+ {{ striptags(boardinfo.hostname ?? '?') }} + +
+
+ +
+ {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %} +
+

{{ _('No password set!') }}

+

{{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

+ {% if (dispatcher.lookup("admin/system/admin")): %} + + {% endif %} +
+ {% endif %} + + {% if (boardinfo.rootfs_type == "initramfs"): %} +
+

{{ _('System running in recovery (initramfs) mode.') }}

+

{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

+ {% if (dispatcher.lookup("admin/system/flash")): %} + + {% endif %} +
+ {% endif %} + + + + + {% endif %} diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut b/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut new file mode 100644 index 000000000..a172d95d7 --- /dev/null +++ b/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut @@ -0,0 +1,48 @@ +{# + Copyright 2022 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-#} + +{% include('header', { blank_page: true }) %} + + + +
+
{{ _('Loading view…') }}
+ +
+ +{% include('footer', { blank_page: true }) %} diff --git a/luci-theme-openwrt/Makefile b/luci-theme-openwrt/Makefile new file mode 100644 index 000000000..41f479157 --- /dev/null +++ b/luci-theme-openwrt/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI OpenWrt.org theme +LUCI_DEPENDS:= + +define Package/luci-theme-openwrt/postrm +#!/bin/sh +[ -n "$${IPKG_INSTROOT}" ] || { + uci -q delete luci.themes.OpenWrt + uci commit luci +} +endef + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css new file mode 100644 index 000000000..186ce88e1 --- /dev/null +++ b/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css @@ -0,0 +1,2092 @@ +@charset "utf-8"; + +.lang_he { + direction: RTL; + unicode-bidi: embed; +} + +@media all { + +html { + min-height: 100%; + height: auto; + position:relative; +} + +body { + color: #ffffff; + background-color: #4a6b7c; + background-position: bottom center; + background-repeat: repeat-x; + font-family: Arial, Verdana, sans-serif; + font-size: 13px; + padding-bottom: 1.5em; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.table { display: table; width: 100%; position: relative; border-collapse: collapse; } +.tr { display: table-row; } +.thead { display: table-header-group; } +.tbody { display: table-row-group; } +.tfoot { display: table-footer-group; } +.td, .th { display: table-cell; vertical-align: middle; } +.th { font-weight: bold; } + +.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; } +.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; } + +.col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; } +.col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; } +.col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; } +.col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; } +.col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; } +.col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; } +.col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; } +.col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; } +.col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; } +.col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; } + +.tr.placeholder { + height: 3.5em; +} + +.tr.placeholder > .td { + position: absolute; + left: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 3em; +} + +.nowrap { + white-space: nowrap; +} + +a img { + border: none; + text-decoration: none; +} + +#maincontainer { + display: flex; +} + +#maincontent { + flex-basis: 100%; +} + +#mainmenu { + max-width: 200px; + background: #f5f5f5; + border: 1px solid #444; + border-width: 0 0 1px 1px; + font-size: 15px; + padding-bottom: 1em; +} + +#mainmenu ul { + display: block; + margin: 0; + padding: 0; +} + +#mainmenu ul li { + display: block; + white-space: nowrap; +} + +#mainmenu ul li > a { + display: block; + color: #444; + padding: .4em .5em; + text-decoration: none; +} + +#mainmenu ul li.selected > a { + background: #fff; + color: #37c; + border: 1px dotted #444; + border-width: 1px 0; +} + +#mainmenu ul li.selected:first-child > a { + border-top: none; +} + +#mainmenu ul li li > a { + font-size: 85%; + padding-left: 1.5em; +} + +#mainmenu ul li > ul { + flex-basis: 100%; + max-height: 0; + visibility: hidden; + transition: max-height .15s; +} + +#mainmenu ul:not(.active) li.selected > ul, +#mainmenu ul li.active > ul { + max-height: 1000px; + visibility: visible; + transition: max-height .25s; +} + +#mainmenu ul li.mainmenu-item-logout { + margin-top: 15%; +} + +#tabmenu { + padding: 0; + margin: -.5em -.5em .5em -.5em; + background: #bbb; +} + +#tabmenu ul { + border-color: #444; + padding-top: .5em; + flex-wrap: wrap; + background: repeating-linear-gradient(#f5f5f5, #bbb 2.4em, #f5f5f5 2.4em, #bbb); + line-height: 1em; +} + +#tabmenu ul li { + border-color: #444; +} + +#tabmenu ul li.cbi-tab { + background: #f5f5f5; +} + +abbr, +acronym { + font-style: normal; + font-variant: normal; +} + +abbr[title], +acronym[title] { + border-bottom: 1px dotted; + cursor: help; +} + +a:link abbr[title], +a:visited abbr[title], +a:link acronym[title], +a:visited acronym[title] { + cursor: pointer; +} + +code { + font-family: monospace; + white-space: pre; +} + +hr { + margin: .5em 0; + padding: 0; + border: 1px solid #444; + border-width: 0 0 1px 0; +} + +#maincontent ul { + margin-left: 2em; +} + +#modal_overlay { + position: fixed; + top: 0; + bottom: 0; + left: -10000px; + right: 10000px; + background: rgba(0, 0, 0, 0.7); + z-index: 900; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + transition: opacity .125s ease-in; + opacity: 0; + visibility: hidden; +} + +.modal { + width: 90%; + margin: 5em auto !important; + display: flex; + flex-wrap: wrap; + min-height: 32px; + max-width: 600px; + align-items: center; + border-radius: 3px; + background: #f5f5f5; + border: 1px solid #000; + padding: .5em .5em .25em .5em !important; + min-width: 270px; + color: #444; +} + +.modal > * { + flex-basis: 100%; + line-height: normal; + margin-bottom: .5em; +} + +.modal > pre, +.modal > textarea { + white-space: pre-wrap; + overflow: auto; +} + +body.modal-overlay-active { + overflow: hidden; +} + +body.modal-overlay-active #modal_overlay { + left: 0; + right: 0; + opacity: 1; + visibility: visible; +} + +.warning { + color: red; + background-color: white; + font-weight: bold; +} + +.clear { + clear: both; +} + +.skiplink, +.navigation, +.hidden { + position: absolute; + left: -1000px; + top: -1000px; + width: 0px; + height: 0px; + overflow: hidden; + display: inline; +} + +.error { + color: #ff0000; + background-color: white; +} + +.alert-message { + font-weight: normal; + padding: .5em; + border-radius: 3px; + border: 1px solid #a22; + margin: 0 0 .5em 0; +} + +.label { + padding: 1px 2px; + font-size: 10px; + color: #fff; + text-transform: uppercase; + white-space: nowrap; + background-color: #aaa; + border-radius: 3px; +} + +.alert-message, .cbi-tooltip.error, .label.error { + border-color: #a22; + background: #fee; + color: #a22; +} + +.alert-message.notice, .cbi-tooltip.notice, .label.notice { + border-color: #15a; + background: #e6f6ff; + color: #15a; +} + +.alert-message.warning, .cbi-tooltip.warning, .label.warning { + border-color: #ed5; + background: #fe9; + color: #650; +} + +.alert-message.success, .cbi-tooltip.success, .label.success { + border-color: #161; + background: #efe; + color: #161; +} + +div.hostinfo { + float: left; + margin: 0; + padding: 0; + width: auto; + padding: 0.5em; +} + +.lang_he div.hostinfo { + float: right; +} + +#menubar { + position: relative; + width: 100%; + background: #000000; + color: #ffffff; + display: flex; + flex-wrap: wrap; +} + +#menubar .hostinfo, +#indicators, +#modemenu { + flex: 1 1 450px; + display: flex; + align-items: center; +} + +#indicators { + justify-content: flex-end; + flex-wrap: wrap; + margin-right: 1em; +} + +#indicators > *, +#indicators > #xhr_poll_status > * { + flex: 0 0 auto; + display: inline-flex; +} + +#modemenu { + flex: 1 1 auto; + padding: 0; + margin: 0; +} + +#modemenu > * { + padding: .5em; +} + +#menubar .warning { + color: red; + background-color: #557788; +} + +#indicators > #xhr_poll_status, +#indicators > [data-clickable="true"] { + cursor: pointer; +} + +#indicators > :not([id="xhr_poll_status"]), +#indicators > #xhr_poll_status > * { + text-transform: uppercase; + background: #90c0e0 !important; + color: #000 !important; + font-size: 11px; + padding: .125em .5em; + margin: .125em; + border-radius: .6em; +} + +#indicators > [data-style="inactive"], +#indicators > * > #xhr_poll_status_off { + border: 1px solid #90c0e0; + background: #000 !important; + color: #90c0e0 !important; + padding: calc(.125em-1px) calc(.5em-1px); +} + +html #menubar a:link, +html #menubar a:visited { + background: #000000; + color: #ffffff; + text-decoration: none; +} + +html #menubar a:link:hover, +html #menubar a:visited:hover, +html #menubar a:link:active, +html #menubar a:visited:active, +#menubar a:link:focus, +#menubar a:visited:focus { + background: #000000; + color: #ffff00; + font-weight: bold; +} + +html #menubar a:link.active, +html #menubar a:visited.active, +html #menubar a:link.preactive, +html #menubar a:visited.preactive { + background: #000000; + color: #ffff00; + font-weight: bold; +} + +html #menubar a:link.warning, +html #menubar a:visited.warning { + background: #000000; + color: red; + font-weight: bold; +} + +#modemenu { + width: auto; + background: #000000; + color: #ffffff; + list-style: none; + margin-right: 1px; + margin-left: 2em; + float: right; +} + +#modemenu li { + float: right; + list-style: none; +} + +#savemenu { + float: right; +} + +.lang_he #savemenu { + float: left; +} + +.lang_de #submenu_admin_uci { + width: 12em; +} + +.lang_ru #submenu_admin_uci { + width: 11.5em; +} + +textarea#syslog { + width: 98%; + min-height: 500px; + border: 3px solid #cccccc; + padding: 5px; + font-family: monospace; + overflow-y: hidden; +} + +#maincontainer { + clear: both; + width: 96%; + margin: 0 auto; + height:100%; +} + +#maincontent { + padding: 0.5em; + background: #f5f5f5; + color: #000000; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #444444; +} + +#applyreboot-section { + margin: 2rem; + line-height: 300%; +} + +.lang_he #maincontent { + direction: rtl; +} + +h2, h3, h4, h5, legend { + font-size: 150%; + font-family: Trebuchet MS, Verdana, sans-serif; + font-weight: bold; + margin: .25em 0 .5em 0; + border-bottom: 1px solid; + padding-bottom: 4px; + display: block; + width: 100%; +} + +h3, legend { + font-size: 125%; +} + +h4 { + font-size: 112%; +} + +h5 { + font-size: 105%; +} + +fieldset { border: none; } +fieldset > legend { float: left; } +fieldset > legend + * { clear: both; } + +p { + margin-bottom: .5em; +} + +.cbi-section { + margin: 0 0 .5em 0; +} + +.cbi-section > h3, +.cbi-section > legend { + margin-top: .5em; +} + +.cbi-section-descr { + margin-bottom: 0.5em; + font-size: 95%; +} + +.cbi-section-descr:empty { + display: none; +} + +.cbi-title-ref { + color: #37c; +} + +.cbi-title-ref::after { + content: "➙"; +} + +ul.cbi-apply { + font-size: 90%; +} + +input:-webkit-input-placeholder { + color: #AAAAAA; +} + +input:-moz-placeholder { + color: #AAAAAA; +} + +input:-ms-input-placeholder { + color: #AAAAAA; +} + +input[type=submit], +input[type=reset], +input[type=image], +input[type=button] { + cursor: pointer; +} + +select, +input, +textarea { + background: #eeeeee; + color: #000000; + border-width: 1px; + border-color: #000000; +} + +input[type=image] { + border: none; +} + +input:focus, +input:not(.btn):not(.cbi-button):hover, +select:focus, +select:hover { + background-color: #ffffff; + color: #000000; +} + +input[type=text], +input[type=password] { + padding: .25em; +} + +select, +input[type=text], +input[type=password], +.cbi-dropdown:not(.btn):not(.cbi-button) { + width: 20em; + height: 22px; + font-family: inherit; + font-size: inherit; +} + +select[multiple] { + height: auto; +} + +input[type=radio], +input[type=checkbox], +[data-dynlist] > input + img, +input.cbi-input-password + img { + vertical-align: middle; +} + +label > input[type="checkbox"], +label > input[type="radio"] { + vertical-align: bottom; + margin: 0; +} + +.td select, +.td .cbi-dropdown, +.td input[type=text], +.cbi-dynlist > .add-item > .cbi-dropdown { + width: 100%; +} + +.td input.cbi-input-password { + width: calc(100% - 20px); +} + +img.cbi-image-button { + cursor: pointer; + margin: 0 2px; + vertical-align: middle; +} + +.btn, .cbi-button, .item::after { + padding: 0 .5em; + border-radius: 3px; + border: 1px solid #aaa; + text-decoration: none; + color: #000; + display: inline-block; + font-size: inherit; + -webkit-appearance: none; + background: #fff; + text-align: center; + font-weight: bold; + line-height: 12px; + min-height: 22px; + line-height: 20px; + box-sizing: border-box; + cursor: pointer; +} + +.btn:hover, .cbi-button:hover, .item:hover::after { + box-shadow: 0 0 3px #37c; +} + +.btn[disabled], +.btn[disabled]:hover, +.cbi-button[disabled], +.cbi-button[disabled]:hover { + opacity: .6; + cursor: default; + pointer-events: none; +} + +.cbi-button-positive, +.cbi-button-fieldadd, +.cbi-button-add, +.cbi-button-save { + border-color: #595; + color: #595; +} + +.cbi-button-neutral, +.cbi-button-reset, +.cbi-button-download, +.cbi-button-find, +.cbi-button-link, +.cbi-button-up, +.cbi-button-down { + border-color: #444; + color: #444; +} + +.cbi-button-action, +.cbi-button-apply, +.cbi-button-reload, +.cbi-button-edit { + border-color: #37c; + color: #37c; +} + +.cbi-button-negative, +.cbi-section-remove .cbi-button, +.cbi-button-remove { + border-color: #a22; + color: #a22; +} + +.cbi-button-action.important, +.cbi-page-actions .cbi-button-apply, +.cbi-section-actions .cbi-button-edit { + color: #fff; + background: #37c; +} + +.cbi-button-positive.important, +.cbi-page-actions .cbi-button-save { + color: #fff; + background: #595; +} + +.cbi-button-negative.important { + color: #fff; + background: #a22; +} + +.cbi-page-actions .cbi-button-apply + .cbi-button-save, +.cbi-page-actions .cbi-button-negative + .cbi-button-save { + background: #fff; + color: #595; +} + +.cbi-input-invalid:not([open]) { + color: #FF0000 !important; + border-color: #FF0000; +} + +table td, table th { + color: #000000; +} + +.table .td, .table .th { + color: #000000; + padding: .25em; +} + +.table.smalltext { + background: #f5f5f5; + color: #000000; + border-top: 1px solid #666666; + border-right: 1px solid #666666; + border-bottom: 1px solid #666666; + font-size: 90%; + width: 80%; + margin-left: auto; + margin-right: auto; + border-collapse: collapse; +} + +.table.smalltext .tr:hover .td { + background-color: #bbddee; + color: #000000; +} + +.table.smalltext .tr .th { + padding: 0 0.25em; + border-left: 1px solid #666666; + text-align: left; +} + +.table.smalltext .tr .td { + padding: 0 0.25em; + border-top: 1px solid #666666; + border-left: 1px solid #666666; +} + +.cbi-rowstyle-1 { + background-color: #eeeeff; + color: #000000; +} + +.cbi-rowstyle-2 { + color: #000000; +} + +.cbi-value { + clear: left; + vertical-align: middle; + padding: 0.25em 0.6em; + border-bottom: 1px dotted #bbbbbb; +} + +.cbi-value:hover { + background: #f8f8f8; + color: #000000; +} + +.cbi-value-title { + float: left; + width: 40%; + line-height: 1.8em; +} + +.cbi-value-field { + width: 58%; + margin-left: 40%; + padding: 0.25em 0; +} + +.td.cbi-value-field { + width: auto; + margin-left: 0; + align-self: center; + vertical-align: middle; +} + +.cbi-value-description { + background-image: url(/luci-static/resources/cbi/help.gif); + background-position: .25em .25em; + background-repeat: no-repeat; + margin: .25em 0 0 0; + padding: .25em .25em .25em 1.75em; +} + +.cbi-section-create { + padding: 0 0 .25em 0; + margin: -3px; + display: inline-flex; + align-items: center; +} + +.cbi-section-create > * { + margin: 3px; + flex: 1 1 auto; +} + +.cbi-section-create > * > input { + width: 100%; +} + +.cbi-section-remove > .cbi-button { + margin-bottom: -1px; + border-radius: 3px 3px 0 0; +} + +.cbi-section-node + .cbi-section-create { + padding-top: 0; +} + +div.cbi-map-descr { + margin-bottom: 1em; +} + +div.cbi-optionals { + padding: 0.25em; + border-bottom: 1px dotted #bbbbbb; +} + +.cbi-section-node { + clear: both; + padding-bottom: 0; + position: relative; + border: 1px dotted #555; + background: #fff; + margin-bottom: .5em; +} + +.cbi-section-node-tabbed { + border-top: none; + margin-top: -.5em; +} + +.cbi-section-node .cbi-value:last-child, +.cbi-section-node .cbi-optionals:last-child { + border-bottom: none; +} + +.table.cbi-section-table { + width: 100%; + font-size: 95%; + border: 1px dotted #444; + background: #fff; + margin: 0 0 .5em 0; +} + +.cbi-section-node > .table.cbi-section-table { + border: none; + margin: 0; +} + +.tr.cbi-section-table-descr .th { + font-weight: normal; + font-size: 90%; + vertical-align: top; +} + +.td.cbi-section-table-optionals { + text-align: left !important; + padding-top: 1em; +} + +.th.cbi-section-actions, +.td.cbi-section-actions { + align-self: center; + vertical-align: middle; +} + +.th.cbi-section-actions > *, +.td.cbi-section-actions > * { + display: flex; + justify-content: flex-end; + flex-direction: row; + flex: 1 1 150px; + margin: auto -1px auto auto; +} + +.td.cbi-section-actions > * > *, +.td.cbi-section-actions > * > form > * { + flex: 1 1 4em; + margin: 0 1px; +} + +.td.cbi-section-actions > * > form { + display: flex; + margin: 0; +} + +.cbi-page-actions { + display: flex; + justify-content: flex-end; + margin: -3px; +} + +.cbi-page-actions > form { + display: flex; +} + +.cbi-page-actions > * { + flex: 0 1 auto; + margin: 3px; +} + +.cbi-page-actions > form > * { + flex: 1; + margin: 0 3px 0 0; +} + +.cbi-page-actions > .cbi-button-save, +.cbi-page-actions > .cbi-button-apply, +.cbi-page-actions > form[method="post"] { + margin-left: auto; +} + +*::-ms-backdrop, +.cbi-page-actions > .cbi-button-save, +.cbi-page-actions > .cbi-button-apply, +.cbi-page-actions > form[method="post"] { + margin-left: 50%; +} + +.cbi-page-actions > .cbi-button-apply + .cbi-button-save, +.cbi-page-actions > .cbi-button-negative + .cbi-button-save, +.cbi-page-actions > .cbi-button-save + form[method="post"], +.cbi-page-actions > form[method="post"] + form[method="post"] { + margin-left: 3px; +} + +.th[data-widget="button"], .td[data-widget="button"], +.th[data-widget="fvalue"], .td[data-widget="fvalue"] { + flex: 1 1 2em; + text-align: center; +} + +#cbi-network-switch_vlan .th, +#cbi-network-switch_vlan .td { + flex-basis: 12%; +} + +.td[data-title]::before { + content: attr(data-title) ":\20"; + font-weight: bold; + text-align: left; + display: none; + padding: 1px 0; + white-space: nowrap; +} + +.td[data-description]::after { + content: attr(data-description); + font-size: 90%; + text-align: left; + display: none; + background: url(/luci-static/resources/cbi/help.gif) left top no-repeat; + padding: .125em 0 .125em 18px; + margin: .125em 0; +} + +.tr.placeholder .td[data-title]::before, +.tr.placeholder .td[data-description]::after { + display: none; +} + +.tr[data-title]::before, +.tr.cbi-section-table-titles.named::before { + content: attr(data-title) "\20"; + font-weight: bold; + text-align: left; + display: table-cell; + align-self: center; + flex: 1 1 5%; + padding: .25em; + white-space: normal; + word-wrap: break-word; + vertical-align: middle; +} + +.cbi-value-helpicon img { + vertical-align: bottom; +} + +.td.cbi-value-error { + border-color: red; +} + +.cbi-value-error input, +.cbi-value-error select { + color: red; + background-color: #ffcccc; +} + +.cbi-section-error { + color: red; + background-color: white; + font-size: 95%; + border: 1px dotted red; + margin: 3px; + padding: 3px; +} + +.cbi-value-field var { + color: #2222FF; +} + +ul.cbi-tabmenu { + list-style-type: none; + display: flex; + margin: 0 0 .5em 0 !important; + padding: 0 0 0 5px; + border-bottom: 1px solid #bbb; +} + +#tabmenu > ul.cbi-tabmenu { + margin: 0 !important; +} + +ul.cbi-tabmenu li { + display: inline-flex; + margin: 0 5px -1px 0; + flex: 0 1 auto; + border: 1px solid #bbb; + border-bottom: none; + border-radius: 3px 3px 0 0; + background: linear-gradient(#ddd 90%, #aaa 100%); + color: #888; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: break-word; +} + +ul.cbi-tabmenu li a, +ul.cbi-tabmenu li a:hover { + text-decoration: none; + color: inherit; + padding: 5px; + flex: 1 1 auto; + width: 100%; + height: 100%; + outline: none; +} + +ul.cbi-tabmenu li.cbi-tab { + color: #000; + background: #f5f5f5; +} + +ul.cbi-tabmenu li.cbi-tab-disabled[data-errors]::after { + content: attr(data-errors); + background: #c43c35; + color: #fff; + min-width: 12px; + line-height: 14px; + border-radius: 8px; + text-align: center; + margin: 4px 5px 4px 0; + padding: 1px 2px; + word-wrap: normal; + flex: 1 0 auto; +} + +.cbi-section ul.cbi-tabmenu li.cbi-tab { + background: #fff; +} + +.cbi-tab-descr { + background-image: url(/luci-static/resources/cbi/help.gif); + background-position: .25em 50%; + background-repeat: no-repeat; + border-bottom: 1px solid #ccc; + margin: 0 .25em .25em .25em; + padding: .5em .5em .5em 2em; +} + +[data-tab-title] { + height: 0; + opacity: 0; + overflow: hidden; +} + +[data-tab-active="true"] { + opacity: 1; + height: auto; + overflow: visible; + transition: opacity .25s ease-in; +} + + +.cbi-dropdown { + border: 1px inset #000; + display: inline-flex; + cursor: pointer; + background: #eee; + position: relative; + padding: 0; + color: #000; + max-width: 100%; +} + +.cbi-dropdown:not(.btn):not(.cbi-button) { + min-width: 20em; +} + +.cbi-dropdown:not(.btn):not(.cbi-button):hover { + background: #fff; +} + +.cbi-dropdown:focus, +.cbi-dynlist > .item:focus { + outline: 2px solid #4b6e9b; +} + +.cbi-dropdown > ul { + margin: 0 !important; + padding: 0; + list-style: none; + overflow-x: hidden; + overflow-y: auto; + display: flex; + width: 100%; +} + +.cbi-dropdown > ul.preview { + display: none; +} + +.cbi-dropdown > .open { + border: 2px outset #eee; + flex-basis: 15px; +} + +.cbi-dropdown > .open, +.cbi-dropdown > .more { + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + padding: 0 .25em; +} + +.cbi-dropdown > .more, +.cbi-dropdown > ul > li[placeholder] { + color: #777; + font-weight: bold; + text-shadow: 1px 1px 0px #fff; + display: none; + min-height: 22px; +} + +.cbi-dropdown > ul > li { + display: none; + padding: .25em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 1; + flex-grow: 1; + align-items: center; + align-self: center; + min-height: 22px; +} + +.cbi-dropdown > ul > li .hide-open { display: initial; } +.cbi-dropdown > ul > li .hide-close { display: none; } + +.cbi-dropdown > ul > li[display]:not([display="0"]) { + border-left: 1px solid #ccc; +} + +.cbi-dropdown[empty] > ul { + max-width: 1px; +} + +.cbi-dropdown > ul > li > form { + display: none; + margin: 0; + padding: 0; + pointer-events: none; +} + +.cbi-dropdown > ul > li img { + vertical-align: middle; + margin-right: .25em; +} + +.cbi-dropdown > ul > li > form > input[type="checkbox"] { + margin: 0; +} + +.cbi-dropdown[open] { + position: relative; +} + +.cbi-dropdown[open] > ul.dropdown { + display: block; + background: #f6f6f5; + border: 1px solid #918e8c; + box-shadow: 0 0 4px #918e8c; + position: absolute; + z-index: 1100; + max-width: none; + min-width: 100%; + width: auto; + transition: max-height .125s ease-in; +} + +.cbi-dropdown > ul > li[display], +.cbi-dropdown[open] > ul.preview, +.cbi-dropdown[open] > ul.dropdown > li, +.cbi-dropdown[multiple] > ul > li > label, +.cbi-dropdown[multiple][open] > ul.dropdown > li, +.cbi-dropdown[multiple][more] > .more, +.cbi-dropdown[multiple][empty] > .more { + flex-grow: 1; + display: flex; + align-items: center; +} + +.cbi-dropdown[empty] > ul > li, +.cbi-dropdown[multiple][open] > ul.dropdown > li > form { + display: block; +} + +.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } +.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; } + +.cbi-dropdown[open] > ul.dropdown > li { + border-bottom: 1px solid #ccc; +} + +.cbi-dropdown[open] > ul.dropdown > li[selected] { + background: #b0d0f0; +} + +.cbi-dropdown[open] > ul.dropdown > li.focus { + background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); +} + +.cbi-dropdown[open] > ul.dropdown > li { + color: #444; +} + +.cbi-dropdown[open] > ul.dropdown > li:last-child { + margin-bottom: 0; + border-bottom: none; +} + +.cbi-dropdown[open] > ul.dropdown > li[unselectable] { + opacity: 0.7; +} + +.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { + width: 100%; +} + +.cbi-dropdown[disabled] { + pointer-events: none; + opacity: .6; +} + +.cbi-dynlist { + height: auto; + min-height: 30px; + min-width: 210px; + max-width: 100%; + width: auto; + display: inline-flex; + flex-direction: column; +} + +.cbi-dynlist > .item { + margin-bottom: 4px; + background: #eee; + padding: 2px 2em 2px 4px; + border: 1px outset #000; + border-radius: 3px; + position: relative; + pointer-events: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.cbi-dynlist > .item::after { + content: "×"; + position: absolute; + display: inline-flex; + align-items: center; + top: -1px; + right: -1px; + bottom: -1px; + padding: 0 6px; + border: 1px outset #000; + background: #fff; + border-radius: 0 3px 3px 0; + font-weight: bold; + color: #c44; + pointer-events: auto; + height: auto; +} + +.cbi-dynlist > .add-item { + display: flex; +} + +.cbi-dynlist > .add-item > input { + flex: 1 1 auto; +} + +input[type="text"] + .cbi-button, +input[type="password"] + .cbi-button, +select + .cbi-button { + border-radius: 0 3px 3px 0; + border: 1px outset #000; + margin: 0 0 0 -2px; + padding: 0 6px; + vertical-align: top; + display: inline-block; + height: 22px; + font-size: 12px; + line-height: 20px; +} + +.cbi-tooltip-container { + cursor: help; +} + +.cbi-tooltip { + position: absolute; + z-index: 1000; + left: -1000px; + border-radius: 3px; + background: #fff; + padding: 2px 5px; + white-space: pre; + opacity: 0; + transition: opacity .25s ease-out; + pointer-events: none; + box-shadow: 0 0 2px #444; + color: #444; +} + +.cbi-tooltip-container:hover .cbi-tooltip { + left: auto; + opacity: 1; + transition: opacity .25s ease-in; + white-space: normal; +} + +.cbi-progressbar { + background: #ddd; + border: 1px solid #bbb; + border-radius: 3px; + position: relative; + min-width: 170px; + height: 20px; + margin: 4px 0; + line-height: 20px; +} + +.cbi-progressbar > div { + background: #90c0e0; + height: 100%; + transition: width .25s ease-in; + width: 0%; +} + +.cbi-progressbar::after { + position: absolute; + bottom: 0; + top: 0; + right: 0; + left: 0; + text-align: center; + text-shadow: 0 0 2px #fff; + content: attr(title); + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; +} + + +.zonebadge .cbi-tooltip { + padding: 1px; + background: inherit; + margin: -1.6em 0 0 -5px; +} + + +.zone-forwards { + display: flex; + flex-wrap: wrap; +} + +.zone-forwards > * { + flex: 1 1 45%; + padding: 1px; +} + +.zone-forwards > span { + flex-basis: 10%; + text-align: center; +} + +.zone-forwards .zone-src, +.zone-forwards .zone-dest { + display: flex; + flex-direction: column; +} + + +.left, .left::before, .left::after { text-align: left !important; } +.right, .right::before, .right::after { text-align: right !important; } +.center, .center::before, .center::after { text-align: center !important; } + +.top, .top::before, .top::after { vertical-align: top !important; } +.middle, .middle::before, .middle::after { vertical-align: middle !important; } +.bottom, .bottom::before, .bottom::after { vertical-align: bottom !important; } + +.td.top { align-self: flex-start; vertical-align: top; } +.td.middle { align-self: center; vertical-align: middle; } +.td.bottom { align-self: flex-end; vertical-align: bottom; } + +.luci { + position: absolute; + bottom: 0; + left: 1em; + height: 1.5em; + font-size: 80%; + margin-bottom: 0; +} + +.luci a:link, +.luci a:visited { + background-color: transparent; + color: #666666; + text-decoration: none; + font-size: 70%; +} + +.inline { + display: inline; +} + +.error500 { + white-space: normal; + border: 1px dotted #ff0000; + background-color: #ffffff; + color: #000000; + padding: 0.5em; +} + + +.ifacebadge, .ifacebox { + display: inline-flex; + align-content: center; + border: 1px solid #ccc; + border-radius: 3px; + padding: 2px; + background: #fff; +} + +.ifacebox-head { + background: #eee; +} + +.ifacebox-head.active { + background: #90c0e0; +} + +.ifacebadge, .zonebadge { + align-items: center; +} + +.ifacebadge > * { + align-self: center; +} + +.ifacebadge > img, +.ifacebadge > em { + margin-right: 5px; + display: inline-block; + height: 16px; +} + +.ifacebadge-active { + border-color: #000000; + font-weight: bold; +} + +.ifacebox { + flex-direction: column; + margin: 0; + padding: 0; + min-width: 100px; + text-align: center; +} + +.ifacebox > * { + padding: 2px; +} + +.td > .ifacebadge, +.td > .zonebadge { + margin: 0; + vertical-align: top; +} + +.network-status-table { + display: flex; + flex-wrap: wrap; + margin: -.25em -.25em .25em -.25em; +} + +.network-status-table .ifacebox { + margin: .25em; + font-size: 90%; + flex-grow: 1; +} + +.network-status-table .ifacebox-body { + display: flex; + flex-direction: column; + flex: 1 0 auto; + padding: .5em; +} + +.network-status-table .ifacebox-body > span { + flex: 10 10 auto; +} + +.network-status-table .ifacebox-body > div { + display: flex; + flex-wrap: wrap; +} + +.ifacebadge.large, +.network-status-table .ifacebox-body .ifacebadge { + flex: 1; + -webkit-flex: 1 1 auto; + padding: .5em; + min-width: 220px; + white-space: nowrap; +} + +.network-status-table .ifacebox-body .ifacebadge { + margin: .5em 0 0 0; +} + +#dsl_status_table .ifacebox-body span > strong { + display: inline-block; + min-width: 35%; +} + + +.zonebadge { + padding: 2px; + display: inline-block; + white-space: nowrap; + border-radius: 3px; +} + +.zonebadge > em, +.zonebadge > strong { + margin: 3px; +} + +.zonebadge input { + width: 6em; + height: 1.5em; +} + +.zonebadge .ifacebadge, +.cbi-dropdown .ifacebadge { + margin: 1px; +} + +.zonebadge .ifacebadge img, +.zonebadge .ifacebadge em, +.cbi-dropdown .ifacebadge img, +.cbi-dropdown .ifacebadge em { + margin: 0 1px; +} + +.zonebadge-empty { + border: 1px dashed #AAAAAA; + color: #AAAAAA; + font-style: italic; + font-size: smaller; +} + + +.uci-change-list { + font-family: monospace; + white-space: pre; +} + +.uci-change-list del, +.uci-change-list ins, +.uci-change-list var, +.uci-change-legend-label del, +.uci-change-legend-label ins, +.uci-change-legend-label var { + text-decoration: none; + font-style: normal; + border: 1px solid #ccc; + background: #eee; + padding: 2px; + display: block; + line-height: 15px; + margin-bottom: 1px; +} + +.uci-change-list ins, +.uci-change-legend-label ins { + border-color: #0f0; + background: #cfc; +} + +.uci-change-list del, +.uci-change-legend-label del { + border-color: #f00; + background: #fcc; +} + +.uci-change-list var, +.uci-change-legend-label var { + border-color: #ccc; + background: #eee; +} + +.uci-change-list var ins, +.uci-change-list var del { + display: inline-block; + border: none; + width: 100%; + padding: 0; +} + +.uci-change-legend { + padding: 5px; +} + +.uci-change-legend-label { + width: 150px; + float: left; + font-size: 80%; +} + +.uci-change-legend-label>ins, +.uci-change-legend-label>del, +.uci-change-legend-label>var { + float: left; + margin-right: 4px; + width: 12px; + height: 12px; + display: block; + position: relative; +} + +.uci-change-legend-label var ins, +.uci-change-legend-label var del { + border: none; + position: absolute; + top: 1px; + left: 1px; + right: 1px; + bottom: 1px; +} + + +@keyframes flash { + 0% { opacity: 1; } + 50% { opacity: .5; } + 100% { opacity: 1; } +} + +.flash { + animation: flash .35s; +} + +.spinning { + position: relative; + padding-left: 32px !important; +} + +.spinning::before { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 32px; + content: " "; + background: url(../resources/icons/loading.gif) no-repeat center; + background-size: 16px; +} + +} + +@media screen and (max-width: 992px) { + body { + -webkit-text-size-adjust: 100%; + } + + #maincontainer { + flex-direction: column; + width: 100%; + } + + #maincontent { + width: 96%; + margin: auto; + flex-basis: auto; + } + + #mainmenu { + border: none; + border-radius: 0; + max-width: none; + background: #000; + box-shadow: 0 0 2px #444; + padding: 0; + border-top: 1px solid #444; + position: relative; + } + + #mainmenu ul > li.selected > a { + background: #444; + color: #fff; + border-top: none; + } + + #mainmenu ul > li.selected:not(.active) > ul { + max-height: 0; + visibility: hidden; + } + + #mainmenu ul > li > a { + flex: 1 1 auto; + color: #fff; + border: 1px solid #444; + border-width: 0 0 1px 1px; + } + + #mainmenu ul.l1 { + display: flex; + flex-direction: row; + flex-wrap: wrap; + position: relative; + margin-left: -1px; + width: 100%; + } + + #mainmenu ul.l1 > li { + display: inline-flex; + flex: 1 1 auto; + position: relative; + height: 2em; + } + + #mainmenu ul.l1 ul.l2 { + position: absolute; + top: 2em; + right: 0; + z-index: 1000; + background: #000; + box-shadow: 0 0 2px #444; + min-width: 120px; + display: block; + } + + #mainmenu ul.l1 ul.l2.align-left { + right: auto; + left: 0; + } + + #mainmenu ul.l2 > li { + display: block; + } + + #mainmenu ul.l2 > li > a { + padding: .5em; + } + + #mainmenu ul li.mainmenu-item-logout { + margin-top: 0; + margin-left: auto; + } + + #mainmenu ul li.mainmenu-item-logout::before { + content: "\0a"; + flex: 10; + border: 1px solid #444; + border-width: 0 0 1px 1px; + } + + .table { + display: flex; + flex-direction: column; + width: 100%; + } + + .tr { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-end; + } + + .th, .td { + flex: 2 2 25%; + align-self: flex-start; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: break-word; + display: inline-block; + } + + .td.cbi-dropdown-open { + overflow: visible; + } + + .td select { + word-wrap: normal; + } + + .td[data-widget="button"], + .td[data-widget="fvalue"] { + flex: 1 1 12.5%; + text-align: left; + } + + .td.cbi-value-field { + align-self: flex-start; + } + + .td.cbi-value-field .cbi-button { + width: 100%; + } + + .table.cbi-section-table { + border: none; + background: none; + margin: 0; + } + + .tr.table-titles, + .cbi-section-table-titles, + .cbi-section-table-descr { + display: none; + } + + .cbi-section-table-row { + display: flex; + flex-direction: row; + flex-wrap: wrap; + border: 1px dotted #444; + margin: 0 0 .5em 0; + background: #fff; + } + + .cbi-section-table-row:hover { + border: 1px solid #4a6b7c; + } + + .cbi-section-table + .cbi-section-create { + padding-top: 0; + } + + .tr[data-title]::before { + display: block; + flex: 1 1 100%; + background: #eef; + } + + .td[data-title]::before, + .td[data-description]::after { + display: block; + } + + .td[data-title] ~ .td.cbi-section-actions { + align-self: flex-start; + } + + .td[data-title] ~ .td.cbi-section-actions::before { + display: block; + content: "\a0"; + } + + .hide-sm, + .hide-xs { + display: none; + } + + #dsl_status_table .ifacebox-body > span > strong { + min-width: 50%; + } +} + +@media screen and (max-width: 480px) { + body { + font-size: 16px; + } + + input, textarea, select, .cbi-button, .cbi-dropdown { + font-size: 16px !important; + line-height: 30px; + } + + select, input[type="text"], input[type="password"] { + width: 100%; + height: 30px; + border-radius: 3px; + } + + input[type="text"] + .cbi-button, + input[type="password"] + .cbi-button, + select + .cbi-button { + height: 30px; + line-height: 30px; + margin-left: -5px; + min-width: 30px; + } + + input.cbi-input-password, + [data-dynlist] > .add-item > input { + width: calc(100% - 25px); + } + + .label { + font-size: 14px; + } + + .cbi-dynlist, + .cbi-dropdown { + min-width: 100%; + height: auto; + display: flex; + } + + .cbi-dropdown > .more, + .cbi-dropdown > ul > li, + .cbi-dropdown > ul > li[placeholder] { + min-height: 30px; + } + + .btn, .cbi-button { + font-size: 16px !important; + line-height: 30px; + height: 30px; + overflow: hidden; + text-overflow: ellipsis; + } + + #maincontent { + padding: .25em; + } + + #tabmenu { + margin: -.25em -.25em 1em -.25em; + } + + .th, .td { + flex: 2 2 50%; + } + + .td.cbi-value-field { + flex-basis: 100%; + } + + .td.cbi-value-field[data-widget="dvalue"] { + flex-basis: 50%; + } + + .td.cbi-value-field[data-widget="button"], + .td.cbi-value-field[data-widget="fvalue"] { + flex-basis: 25%; + text-align: left; + } + + .cbi-value-title { + float: none; + font-weight: bold; + } + + .cbi-value-field { + width: 100%; + margin: 0; + } + + .cbi-value-description { + margin-top: 5px; + display: block; + } + + .cbi-section-create { + margin-bottom: 1em; + } + + .cbi-page-actions { + flex-wrap: wrap; + margin: -2px; + } + + .cbi-page-actions > .cbi-button-link { + flex-basis: 100%; + margin-right: 2px; + } + + .cbi-page-actions > * { + flex: 1 1 auto; + margin: 2px; + } + + ul.cbi-tabmenu { + padding: 0 3px; + } + + .hide-xs { + display: none; + } + + #cbi-network .td[id] > strong { + display: block; + } + + #cbi-network-switch_vlan .td.cbi-section-actions { + flex-basis: 100%; + } + + #dsl_status_table .ifacebox-body > span > strong { + display: block; + width: 100%; + margin-top: .5em; + } + + #cbi-firewall-rule .td[data-widget="fvalue"], + #cbi-firewall-redirect .td[data-widget="fvalue"] { + display: none; + } +} diff --git a/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png b/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9d03018882de9bb92f2d708bcd93b671beaa03 GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O0VEi%{+3=0q{Ka4978H@CI2|}MV$T5;V=9L d*(U#Y&|%1xk+@qLpJ4-1>gnp|vd$@?2>=7W7QX-h literal 0 HcmV?d00001 diff --git a/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js b/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js new file mode 100644 index 000000000..ca97838d3 --- /dev/null +++ b/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js @@ -0,0 +1,133 @@ +'use strict'; +'require baseclass'; +'require ui'; + +return baseclass.extend({ + __init__: function() { + ui.menu.load().then(L.bind(this.render, this)); + }, + + render: function(tree) { + var node = tree, + url = ''; + + this.renderModeMenu(tree); + + if (L.env.dispatchpath.length >= 3) { + for (var i = 0; i < 3 && node; i++) { + node = node.children[L.env.dispatchpath[i]]; + url = url + (url ? '/' : '') + L.env.dispatchpath[i]; + } + + if (node) + this.renderTabMenu(node, url); + } + }, + + handleMenuExpand: function(ev) { + var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling; + + document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) { + if (li !== a.parentNode) + li.classList.remove('active'); + }); + + if (!ul2) + return; + + if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth) + ul2.classList.add('align-left'); + + ul1.classList.add('active'); + a.parentNode.classList.add('active'); + a.blur(); + + ev.preventDefault(); + ev.stopPropagation(); + }, + + renderMainMenu: function(tree, url, level) { + var l = (level || 0) + 1, + ul = E('ul', { 'class': 'mainmenu l%d'.format(l) }), + children = ui.menu.getChildren(tree); + + if (children.length == 0 || l > 2) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l] == children[i].name), + activeClass = 'mainmenu-item-%s%s'.format(children[i].name, isActive ? ' selected' : ''); + + ul.appendChild(E('li', { 'class': activeClass }, [ + E('a', { + 'href': L.url(url, children[i].name), + 'click': (l == 1) ? this.handleMenuExpand : null, + }, [ _(children[i].title) ]), + this.renderMainMenu(children[i], url + '/' + children[i].name, l) + ])); + } + + if (l == 1) { + var container = document.querySelector('#mainmenu'); + + container.appendChild(ul); + container.style.display = ''; + } + + return ul; + }, + + renderModeMenu: function(tree) { + var ul = document.querySelector('#modemenu'), + children = ui.menu.getChildren(tree); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); + + ul.appendChild(E('li', {}, [ + E('a', { + 'href': L.url(children[i].name), + 'class': isActive ? 'active' : null + }, [ _(children[i].title) ]) + ])); + + if (isActive) + this.renderMainMenu(children[i], children[i].name); + } + + if (ul.children.length > 1) + ul.style.display = ''; + }, + + renderTabMenu: function(tree, url, level) { + var container = document.querySelector('#tabmenu'), + l = (level || 0) + 1, + ul = E('ul', { 'class': 'cbi-tabmenu' }), + children = ui.menu.getChildren(tree), + activeNode = null; + + if (children.length == 0) + return E([]); + + for (var i = 0; i < children.length; i++) { + var isActive = (L.env.dispatchpath[l + 2] == children[i].name), + activeClass = isActive ? ' cbi-tab' : '', + className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); + + ul.appendChild(E('li', { 'class': className }, [ + E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] ) + ])); + + if (isActive) + activeNode = children[i]; + } + + container.appendChild(ul); + container.style.display = ''; + + if (activeNode) + container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l)); + + return ul; + } +}); diff --git a/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm b/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm new file mode 100644 index 000000000..356b6dac1 --- /dev/null +++ b/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm @@ -0,0 +1,19 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +
+
+
+ +

+ <% local ver = require "luci.version" -%> + Powered by <%= ver.luciname %> (<%= ver.luciversion %>) +

+ + + + + diff --git a/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm new file mode 100644 index 000000000..1d95bae88 --- /dev/null +++ b/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm @@ -0,0 +1,95 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008-2010 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local ver = require "luci.version" + + local sysinfo = util.ubus("system", "info") or { } + local loadinfo = sysinfo.load or { 0, 0, 0 } + local boardinfo = util.ubus("system", "board") or { } + + local node = disp.context.dispatched + + http.prepare_content("application/xhtml+xml") +-%> + + + + + + + + + +<% if node and node.css then %> +<% end -%> +<% if css then %> +<% end -%> + + + +<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI + +"> + + + + + +
+ + +
+ + + + + <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+

<%:No password set!%>

+

<%:There is no password set on this router. Please configure a root password to protect the web interface.%>

+ <% if disp.lookup("admin/system/admin") then %> + + <% end %> +
+ <%- end -%> + + <%- if boardinfo.rootfs_type == "initramfs" then -%> +
+

<%:System running in recovery (initramfs) mode.%>

+

<%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%>

+ <% if disp.lookup("admin/system/flash") then %> + + <% end %> +
+ <%- end -%> diff --git a/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt b/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt new file mode 100755 index 000000000..7ee8c193d --- /dev/null +++ b/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ "$PKG_UPGRADE" != 1 ]; then + uci get luci.themes.OpenWrt >/dev/null 2>&1 || \ + uci batch <<-EOF + set luci.themes.OpenWrt=/luci-static/openwrt.org + set luci.main.mediaurlbase=/luci-static/openwrt.org + commit luci + EOF +fi + +exit 0 From 3596eb1df0e90a7c6eff66b3defb8103c03f7bf7 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 07:41:06 +0800 Subject: [PATCH 17/73] fix --- luci-theme-bootstrap/Makefile | 2 +- luci-theme-openwrt/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/luci-theme-bootstrap/Makefile b/luci-theme-bootstrap/Makefile index 1e7f49a12..b80a18ee1 100644 --- a/luci-theme-bootstrap/Makefile +++ b/luci-theme-bootstrap/Makefile @@ -21,6 +21,6 @@ define Package/luci-theme-bootstrap/postrm } endef -include ../../luci.mk +include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-openwrt/Makefile b/luci-theme-openwrt/Makefile index 41f479157..8c75e93c4 100644 --- a/luci-theme-openwrt/Makefile +++ b/luci-theme-openwrt/Makefile @@ -17,6 +17,6 @@ define Package/luci-theme-openwrt/postrm } endef -include ../../luci.mk +include $(TOPDIR)/feeds/luci/luci.mk # call BuildPackage - OpenWrt buildroot signature From 6491ff86a766cbe33554280d42d515e79f97f1ba Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 07:43:12 +0800 Subject: [PATCH 18/73] afix --- .../htdocs/luci-static/bootstrap-dark | 1 - .../htdocs/luci-static/bootstrap-light | 1 - .../htdocs/luci-static/bootstrap/cascade.css | 2556 ----------------- .../htdocs/luci-static/bootstrap/favicon.png | Bin 592 -> 0 bytes .../htdocs/luci-static/bootstrap/mobile.css | 428 --- .../luci-static/resources/menu-bootstrap.js | 101 - .../resources/view/bootstrap/sysauth.js | 34 - .../etc/uci-defaults/30_luci-theme-bootstrap | 28 - .../ucode/template/themes/bootstrap-dark | 1 - .../ucode/template/themes/bootstrap-light | 1 - .../ucode/template/themes/bootstrap/footer.ut | 20 - .../ucode/template/themes/bootstrap/header.ut | 83 - .../template/themes/bootstrap/sysauth.ut | 48 - .../luci-static/openwrt.org/cascade.css | 2092 -------------- .../htdocs/luci-static/openwrt.org/tabbg.png | Bin 80 -> 0 bytes .../luci-static/resources/menu-openwrt.js | 133 - .../luasrc/view/themes/openwrt.org/footer.htm | 19 - .../luasrc/view/themes/openwrt.org/header.htm | 95 - .../etc/uci-defaults/30_luci-theme-openwrt | 12 - 19 files changed, 5653 deletions(-) delete mode 120000 luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark delete mode 120000 luci-theme-bootstrap/htdocs/luci-static/bootstrap-light delete mode 100644 luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css delete mode 100644 luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png delete mode 100644 luci-theme-bootstrap/htdocs/luci-static/bootstrap/mobile.css delete mode 100644 luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js delete mode 100644 luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js delete mode 100755 luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap delete mode 120000 luci-theme-bootstrap/ucode/template/themes/bootstrap-dark delete mode 120000 luci-theme-bootstrap/ucode/template/themes/bootstrap-light delete mode 100644 luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut delete mode 100644 luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut delete mode 100644 luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut delete mode 100644 luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css delete mode 100644 luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png delete mode 100644 luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js delete mode 100644 luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm delete mode 100644 luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm delete mode 100755 luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark b/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark deleted file mode 120000 index ac7bcbbf3..000000000 --- a/luci-theme-bootstrap/htdocs/luci-static/bootstrap-dark +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light b/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light deleted file mode 120000 index ac7bcbbf3..000000000 --- a/luci-theme-bootstrap/htdocs/luci-static/bootstrap-light +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css deleted file mode 100644 index 6b51189ff..000000000 --- a/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css +++ /dev/null @@ -1,2556 +0,0 @@ -/*! - * LuCI Bootstrap Theme - * Copyright 2012 Nut & Bolt - * By David Menting - * Based on Bootstrap v1.4.0 - * - * Copyright 2011 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -/* Variables - * --------- */ - -:root { - --background-color-delta-l-sign: -1; - --background-color-h: 0; - --background-color-s: 0%; - --background-color-l: 100%; - - --background-color-high-hsl: - var(--background-color-h), - var(--background-color-s), - var(--background-color-l); - --background-color-high: hsl(var(--background-color-high-hsl)); - - --background-color-medium-hsl: - var(--background-color-h), - var(--background-color-s), - calc(var(--background-color-l) + var(--background-color-delta-l-sign) * calc(6 / 255 * 100%)); - --background-color-medium: hsl(var(--background-color-medium-hsl)); - - --background-color-low-hsl: - var(--background-color-h), - var(--background-color-s), - calc(var(--background-color-l) + var(--background-color-delta-l-sign) * calc(10 / 255 * 100%)); - --background-color-low: hsl(var(--background-color-low-hsl)); - - --text-color-delta-l-sign: 1; - --text-color-h: 0; - --text-color-s: 0%; - --text-color-l: 0%; - - --text-color-highest-hsl: - var(--text-color-h), - var(--text-color-s), - var(--text-color-l); - --text-color-highest: hsl(var(--text-color-highest-hsl)); - - --text-color-high-hsl: - var(--text-color-h), - var(--text-color-s), - calc(var(--text-color-l) + var(--text-color-delta-l-sign) * calc(64 / 255 * 100%)); - --text-color-high: hsl(var(--text-color-high-hsl)); - - --text-color-medium-hsl: - var(--text-color-h), - var(--text-color-s), - calc(var(--text-color-l) + var(--text-color-delta-l-sign) * calc(128 / 255 * 100%)); - --text-color-medium: hsl(var(--text-color-medium-hsl)); - - --text-color-low-hsl: - var(--text-color-h), - var(--text-color-s), - calc(var(--text-color-l) + var(--text-color-delta-l-sign) * calc(191 / 255 * 100%)); - --text-color-low: hsl(var(--text-color-low-hsl)); - - --border-color-delta-l-sign: -1; - --border-color-h: var(--background-color-h); - --border-color-s: var(--background-color-s); - --border-color-l: var(--background-color-l); - - --border-color-high-hsl: - var(--border-color-h), - var(--border-color-s), - calc(var(--border-color-l) + var(--border-color-delta-l-sign) * calc(51 / 255 * 100%)); - --border-color-high: hsl(var(--border-color-high-hsl)); - - --border-color-medium-hsl: - var(--border-color-h), - var(--border-color-s), - calc(var(--border-color-l) + var(--border-color-delta-l-sign) * calc(34 / 255 * 100%)); - --border-color-medium: hsl(var(--border-color-medium-hsl)); - - --border-color-low-hsl: - var(--border-color-h), - var(--border-color-s), - calc(var(--border-color-l) + var(--border-color-delta-l-sign) * calc(17 / 255 * 100%)); - --border-color-low: hsl(var(--border-color-low-hsl)); - - --primary-color-high: #1976d2; - --primary-color-medium: #1564c0; - --primary-color-low: #0d46a1; - --on-primary-color: var(--background-color-high); - - --error-color-high-rgb: 246, 43, 18; - --error-color-high: rgb(var(--error-color-high-rgb)); - --error-color-medium: #e8210d; - --error-color-low: #d00000; - --on-error-color: var(--background-color-high); - - --success-color-high-rgb: 0, 172, 89; - --success-color-high: rgb(var(--success-color-high-rgb)); - --success-color-medium: #009a4c; - --success-color-low: #007936; - --on-success-color: var(--background-color-high); - - --warn-color-high: #efbd0b; - --warn-color-medium: #f0c629; - --warn-color-low: #f2d24f; - --on-warn-color: var(--text-color-highest); - - --disabled-opacity: .7; - - color-scheme: light; -} - -:root[data-darkmode="true"] { - --background-color-delta-l-sign: 1; - --background-color-h: 0; - --background-color-s: 0%; - --background-color-l: calc(34 / 255 * 100%); - --text-color-delta-l-sign: -1; - --text-color-h: 0; - --text-color-s: 0%; - --text-color-l: 100%; - --border-color-delta-l-sign: 1; - - --primary-color-high: #4da1c0; - --primary-color-medium: #448da6; - --primary-color-low: #3c7a8d; - - --error-color-high-rgb: 209, 86, 83; - --error-color-medium: #bf4e4c; - --error-color-low: #b14946; - - --success-color-high-rgb: 0, 166, 108; - --success-color-medium: #00945e; - --success-color-low: #008252; - - --warn-color-high: #a69461; - --warn-color-medium: #a68d45; - --warn-color-low: #a68732; - --on-warn-color: var(--background-color-high); - - --disabled-opacity: .4; - - color-scheme: dark; -} - -/* Reset.less - * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). - * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ - -*, *::before, *::after { - margin: 0; - padding: 0; - border: 0; - box-sizing: border-box; -} - -abbr[title], acronym[title] { - border-bottom: 1px dotted; - font-weight: inherit; - cursor: help; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -ol, ul { - list-style: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - height: 100%; -} - -a:focus { - outline: thin dotted; -} - -a:hover, a:active { - outline: 0; -} - -sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - -ms-interpolation-mode: bicubic; -} - -button, -input, -select, -option, -textarea { - font-size: 100%; - margin: 0; - box-sizing: border-box; - vertical-align: baseline; - line-height: 2em; -} - -button::-moz-focus-inner, input::-moz-focus-inner { - border: 0; - padding: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; - word-break: break-all; -} - -button[disabled], -input[type="button"][disabled], -input[type="reset"][disabled], -input[type="submit"][disabled] { - opacity: var(--disabled-opacity); -} - -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; -} - -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -.control-group { - display: inline-flex; - gap: .2em; -} - -.control-group > input + :not(input):not(select), -.control-group > select + :not(input):not(select) { - margin-left: calc(-.2em + -2px); - border-radius: 0 3px 3px 0; - padding: 0 6px; -} - -/* - * Scaffolding - * Basic and global styles for generating a grid system, structural layout, and page templates - * ------------------------------------------------------------------------------------------- */ -body { - background-color: var(--background-color-high); - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 18px; - color: var(--text-color-high); - padding: 5px; - min-height: 100%; - display: flex; - flex-direction: column; -} - -.container { - width: 100%; - max-width: 940px; - margin-left: auto; - margin-right: auto; - zoom: 1; -} - -a { - color: var(--primary-color-high); - text-decoration: none; - line-height: inherit; - font-weight: inherit; -} - -a:hover { - color: var(--primary-color-low); - text-decoration: underline; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.nowrap { - white-space: nowrap; -} - -/* Typography.less - * Headings, body text, lists, code, and more for a versatile and durable typography system - * ---------------------------------------------------------------------------------------- */ -p, -.cbi-map-descr, -.cbi-section-descr, -.table .tr.cbi-section-table-descr .th { - font-size: 13px; - font-weight: normal; - line-height: 18px; - margin-bottom: 9px; -} - -p small { - font-size: 11px; - color: var(--text-color-low); -} - -h1, -h2, -h3, legend, -h4, -h5, -h6 { - font-weight: bold; - color: var(--text-color-high); -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - color: var(--text-color-low); -} - -h1 { - margin-bottom: 18px; - font-size: 30px; - line-height: 36px; -} - -h1 small { - font-size: 18px; -} - -h2 { - font-size: 24px; - line-height: 36px; -} - -h2 small { - font-size: 14px; -} - -h3, legend, -h4, -h5, -h6 { - line-height: 36px; -} - -h3, legend { - font-size: 18px; -} - -h3 small { - font-size: 14px; -} - -h4 { - font-size: 16px; -} - -h4 small { - font-size: 12px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 13px; - color: var(--text-color-low); - text-transform: uppercase; -} - -ul, ol { - margin: 0 0 18px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li { - line-height: 18px; - color: var(--text-color-medium); -} - -ul.unstyled { - list-style: none; - margin-left: 0; -} - -dl { - margin-bottom: 18px; -} - -dl dt, dl dd { - line-height: 18px; -} - -dl dt { - font-weight: bold; -} - -dl dd { - margin-left: 9px; -} - -hr { - margin: 20px 0 19px; - border: 0; - border-bottom: 1px solid var(--border-color-low); -} - -strong { - font-style: inherit; - font-weight: bold; -} - -em { - font-style: italic; - font-weight: inherit; - line-height: inherit; -} - -small { font-size: 0.9em } - -address { - display: block; - line-height: 18px; - margin-bottom: 18px; -} - -code, pre { - padding: 0 3px 2px; - font-family: Monaco, Andale Mono, Courier New, monospace; - font-size: 12px; - border-radius: 3px; -} - -code { - background-color: var(--border-color-low); - color: var(--text-color-high); - padding: 1px 3px; -} - -pre { - --border-color-h: var(--background-color-h); - --border-color-s: var(--background-color-s); - --border-color-delta-l: 100%; - --border-color-l: calc(var(--background-color-l) + var(--background-color-delta-l-sign) * var(--border-color-delta-l)); - --border-color-a: 0.15; - --border-color: hsla(var(--border-color-hsl), var(--border-color-a)); - - background-color: var(--background-color-low); - display: block; - padding: 8.5px; - margin: 0 0 18px; - line-height: 18px; - font-size: 12px; - border: 1px solid var(--border-color); - border-radius: 3px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* Forms.less - * Base styles for various input types, form layouts, and states - * ------------------------------------------------------------- */ -fieldset { - margin-bottom: 9px; - padding-top: 9px; -} - -fieldset legend { - display: block; - font-size: 19.5px; - line-height: 1; - color: var(--text-color-high); - padding-top: 20px; -} - -label, -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: normal; -} - -.cbi-value { - display: flex; - flex-wrap: wrap; - margin-bottom: 18px; -} - -.cbi-value-field { - margin-left: 20px; - flex: 1; -} - -.cbi-value label.cbi-value-title { - padding-top: 6px; - font-size: 13px; - line-height: 18px; - flex: 0 0 180px; - text-align: right; - color: var(--text-color-high); -} - -.cbi-value > .cbi-section, -.cbi-value > .cbi-tblsection { - width: 100%; -} - -label > input[type="checkbox"], -label > input[type="radio"] { - vertical-align: text-top; - margin: 0; -} - -label[for] { - cursor: pointer; -} - -input, -textarea, -select, -.cbi-select, -.cbi-dropdown:not(.btn):not(.cbi-button) { - display: inline-block; - width: 210px; - padding: 4px; - background: var(--background-color-high); - color: var(--text-color-high); - font-size: 13px; - line-height: 18px; - border: 1px solid var(--border-color-high); - border-radius: 3px; -} - -input, -select, -.cbi-select, -.cbi-dropdown:not(.btn):not(.cbi-button) { - height: 30px; -} - -.cbi-dropdown:not(.btn):not(.cbi-button), -.cbi-dynlist { - min-width: 210px; - max-width: 400px; - width: auto; -} - -.cbi-dynlist { - height: auto; - min-height: 30px; - display: inline-flex; - flex-direction: column; -} - -.cbi-dynlist > .item { - margin-bottom: 4px; - box-shadow: 0 0 2px var(--border-color-high); - background: var(--background-color-high); - padding: 6px 2em 6px 4px; - border: 1px solid var(--border-color-high); - border-radius: 3px; - color: var(--text-color-high); - position: relative; - pointer-events: none; - overflow: hidden; - word-break: break-all; -} - -.cbi-dynlist > .item::after { - content: "×"; - position: absolute; - display: inline-flex; - align-items: center; - top: -1px; - right: -1px; - bottom: -1px; - padding: 0 6px; - border: 1px solid var(--border-color-high); - border-radius: 0 3px 3px 0; - font-weight: bold; - color: #c44; - pointer-events: auto; -} - -.cbi-dynlist > .add-item { - display: flex; -} - -.cbi-dynlist > .add-item > input, -.cbi-dynlist > .add-item > button { - flex: 1 1 auto; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.cbi-value-field > .cbi-checkbox, -.cbi-value-field > div > .cbi-radio { - height: 30px; - display: inline-flex; - align-items: center; -} - -.cbi-radio { - cursor: pointer; - gap: .125em; -} - -.cbi-select { - padding: 0; - position: relative; - background: linear-gradient(var(--background-color-high), var(--border-color-low)); -} - -.cbi-select select, -.cbi-select select:focus { - -webkit-appearance: none; - appearance: none; - outline: none; - border: none; - background: transparent; - height: 100%; - width: 100%; - padding: 0 .3em; - cursor: pointer; - margin-right: .6em; -} - -.cbi-select::before { - position: absolute; - top: 0; - right: 0; - bottom: 0; - content: "▾"; - padding: 0 .3em; - background: linear-gradient(var(--background-color-high), var(--border-color-low)); - pointer-events: none; - border-radius: 3px; - display: flex; - flex-direction: column; - justify-content: center; -} - -.cbi-select select option { - background: var(--background-color-low); - color: var(--text-color-high); -} - -.cbi-select select option:hover { - background: var(--primary-color-low); - color: var(--on-primary-color); -} - -.cbi-select select option:checked { - background: var(--primary-color-medium); - color: var(--on-primary-color); -} - -input[type=file] { - padding: initial; - border: initial; - line-height: initial; - box-shadow: none; - width: auto !important; -} - -input[type=button], input[type=reset], input[type=submit] { - width: auto; - height: auto; -} - -select[multiple] { - height: inherit; - background-color: #fff; -} - -input[type="checkbox"], -input[type="radio"] { - --bd-color: var(--border-color-high); - --fg-color: var(--text-color-high); - - appearance: none; - -webkit-appearance: none; - width: 14px; - height: 14px; - color: var(--fg-color); - position: relative; - display: inline-block; - cursor: pointer; - background: none; - border: none; -} - -input[type="checkbox"]::before, -input[type="checkbox"]::after, -input[type="radio"]::before, -input[type="radio"]::after { - position: absolute; - content: ""; -} - -input[type="checkbox"]::before, -input[type="radio"]::before { - top: 0; - left: 0; - width: 14px; - height: 14px; - background: linear-gradient(var(--background-color-high), var(--background-color-low)); - border: 1px solid var(--bd-color); - border-radius: 2px; -} - -input[type="radio"], -input[type="radio"]::before { - border-radius: 50%; -} - -input[type="checkbox"]::after, -input[type="radio"]::after { - top: 2px; - left: 2px; - width: 10px; - height: 10px; -} - -input[type="checkbox"]:checked::after, -input[type="radio"]:checked::after { - --checkmark-icon: url("data:image/svg+xml,"); - -webkit-mask: var(--checkmark-icon) center/cover no-repeat; - mask: var(--checkmark-icon) center/cover no-repeat; - background: var(--fg-color); -} - -input[type="radio"]:checked:after { - --checkmark-icon: url("data:image/svg+xml,"); -} - -input[type="checkbox"].cbi-input-invalid, -input[type="radio"].cbi-input-invalid { - --bd-color: var(--error-color-medium); - --fg-color: var(--error-color-high); -} - -.td > input[type=text], -.td > input[type=password], -.td > select, -.td > .cbi-dropdown:not(.btn):not(.cbi-button), -.cbi-dynlist > .add-item > .cbi-dropdown { - width: 100%; -} - -::placeholder { - color: var(--text-color-medium); -} - -.item::after, -.btn, -.cbi-button, -.cbi-select, -.cbi-dropdown, -.cbi-dynlist > .item, -input[type="checkbox"]::before, -input[type="radio"]::before, -input, button, textarea, select { - transition: border linear 0.2s, box-shadow linear 0.2s; - box-shadow: inset 0 1px 3px hsla(var(--border-color-low-hsl), .01); -} - -.item:hover::after, -.btn:hover, .btn:focus, -.cbi-button:hover, .cbi-button:focus, -.cbi-select.focus, -.cbi-dropdown:focus, .cbi-dropdown[open], -.cbi-dynlist > .item:focus, -input[type="checkbox"]:focus::before, -input[type="radio"]:focus::before, -input:focus, button:hover, textarea:focus, select:focus { - --focus-color-rgb: 82, 168, 236; - - outline: 0; - border-color: rgba(var(--focus-color-rgb), 0.8) !important; - box-shadow: inset 0 1px 3px hsla(var(--border-color-low-hsl), .01), 0 0 8px rgba(var(--focus-color-rgb), 0.6); - text-decoration: none; -} - -.cbi-input-invalid:focus, -.cbi-select.cbi-input-invalid, -input[type="checkbox"].cbi-input-invalid:focus::before, -input[type="radio"].cbi-input-invalid:focus::before { - --focus-color-rgb: var(--error-color-high-rgb); -} - -input[disabled], -button[disabled], -select[disabled], -textarea[disabled], -.cbi-select[disabled]::before, -.cbi-dropdown[disabled]:not(.btn):not(.cbi-button), -input[type="checkbox"][disabled]::before, -input[type="checkbox"][disabled]::after, -input[type="radio"][disabled]::before, -input[type="radio"][disabled]::after { - opacity: var(--disabled-opacity); - pointer-events: none; - cursor: default; -} - -input[readonly], -select[readonly], -textarea[readonly] { - border-color: hsla(var(--border-color-high-hsl), var(--disabled-opacity)); - pointer-events: auto; - cursor: auto; -} - -.cbi-optionals, -.cbi-section-create { - padding: 0 0 10px 10px; -} - -.cbi-section-create { - margin: -3px; - display: inline-flex; - align-items: center; -} - -.cbi-section-create > * { - margin: 3px; - flex: 1 1 auto; -} - -.cbi-section-create > * > input { - width: 100%; -} - -.actions, -.cbi-page-actions { - background: var(--background-color-low); - margin-bottom: 18px; - padding: 17px 20px 18px 17px; - border-top: 1px solid var(--border-color-medium); - border-radius: 0 0 3px 3px; - text-align: right; -} - -.actions .secondary-action, -.cbi-page-actions .secondary-action{ - float: right; -} - -.actions .secondary-action a, -.cbi-page-actions .secondary-action a { - line-height: 30px; -} - -.actions .secondary-action a:hover, -.cbi-page-actions .secondary-action a:hover { - text-decoration: underline; -} - -.cbi-page-actions > form { - display: inline; - margin: 0; -} - -/* - * Tables.less - * Tables for, you guessed it, tabular data - * ---------------------------------------- */ -.tr { display: table-row; } -.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; } -.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; } - -.table { - display: table; - width: 100%; - margin-bottom: 18px; - padding: 0; - font-size: 13px; - border-collapse: collapse; - position: relative; -} - -.table .th, .table .td { - display: table-cell; - vertical-align: middle; /* Fixme */ - padding: 10px 10px 9px; - line-height: 18px; - text-align: left; -} - -.table .tr:first-child .th { - padding-top: 9px; - font-weight: bold; - vertical-align: top; -} - -.table .td, .table .th { - border-top: 1px solid var(--border-color-medium); -} - -.tr.placeholder { - height: calc(3em + 20px); -} - -.tr.placeholder > .td { - position: absolute; - left: 0; - right: 0; - bottom: 0; - text-align: center; - line-height: 3em; -} - -.tr.drag-over-above, -.tr.drag-over-below { - border: 2px solid #0069d6; - border-width: 2px 0 0 0; -} - -.tr.drag-over-below { - border-width: 0 0 2px 0; -} - -/* Patterns.less - * Repeatable UI elements outside the base styles provided from the scaffolding - * ---------------------------------------------------------------------------- */ -header { - position: sticky; - top: 0; - z-index: 800; - overflow: visible; - color: #BFBFBF; - margin: -5px -5px 15px -5px; - display: flex; -} - -header a { - color: #bfbfbf; - text-shadow: 0 -1px 0 hsla(var(--border-color-low-hsl), .25); -} - -header .brand:hover, header ul .active > a { - background-color: #333; - background-color: rgba(255, 255, 255, 0.05); - color: #fff; - text-decoration: none; -} - -header .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -15px; - color: #fff; - font-size: 20px; - font-weight: 200; - line-height: 1; -} - -header .pull-right { - margin-left: auto; - margin-right: 5px; - align-self: center; -} - -header p { - margin: 0; - line-height: 40px; -} - -header { - background: linear-gradient(#333333, #222222); - box-shadow: 0 1px 3px hsla(var(--border-color-low-hsl), .25), inset 0 -1px 0 hsla(var(--border-color-low-hsl), .01); - padding: 0; - /* the redundant properties below work around a csstidy bug */ - padding-left: calc((100% - 940px) / 2); - padding-right: calc((100% - 940px) / 2); -} - -.nav { - display: block; - float: left; - margin: 0 10px 0 0; - position: relative; - left: 0; -} - -.nav > li { - display: block; - float: left; -} - -.nav a { - display: block; - float: none; - padding: 10px 10px 11px; - line-height: 19px; - text-decoration: none; -} - -.nav a:hover { - color: #fff; - text-decoration: none; -} - -.nav .active > a { - background-color: #222; - background-color: rgba(0, 0, 0, 0.5); -} - -.nav a.menu:hover { - background: #444; - background: rgba(255, 255, 255, 0.05); -} - -.nav .dropdown-menu { - background-color: #333; -} - -.nav .dropdown-menu a.menu { - color: #fff; -} - -.nav .dropdown-menu li a { - color: #999; - text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); -} - -.nav .dropdown-menu li a:hover { - background-color: #191919; - background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #292929, #191919); - color: #fff; -} - -.nav .dropdown-menu .active a { - color: #fff; -} - -.nav .dropdown-menu li a { - padding: 4px 15px; -} - -li.menu, .dropdown { - position: relative; -} - -a.menu:after { - width: 0; - height: 0; - display: inline-block; - content: "↓"; - text-indent: -99999px; - vertical-align: top; - margin-top: 8px; - margin-left: 4px; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #fff; - opacity: 0.5; -} - -.dropdown-menu { - background-color: #fff; - float: left; - position: absolute; - top: 40px; - left: -9999px; - z-index: 900; - min-width: 160px; - max-width: 220px; - margin-left: 0; - margin-right: 0; - padding: 6px 0; - zoom: 1; - border-color: #999; - border-color: rgba(0, 0, 0, 0.2); - border-style: solid; - border-width: 0 1px 1px; - border-radius: 0 0 6px 6px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} - -.dropdown-menu li { - float: none; - display: block; - background-color: transparent; -} - -.dropdown-menu a { - display: block; - padding: 4px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #808080; - text-shadow: 0 1px 0 #fff; -} - -.dropdown-menu a:hover { - background-color: #ddd; - background-repeat: repeat-x; - background-image: linear-gradient(to bottom, #eee, #ddd); - color: #404040; - text-decoration: none; - box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); -} - -.dropdown:hover ul.dropdown-menu { - left: 0; -} - -.dropdown-menu .dropdown-menu { - position: absolute; - left: 159px; -} - -.dropdown-menu li { - position: relative; -} - -.tabs, .cbi-tabmenu { - --tab-bar-background-color: var(--background-color-high); - --tab-inactive-background-color-h: var(--border-color-low-h); - --tab-inactive-background-color-s: var(--border-color-low-s); - --tab-inactive-background-color-l: var(--border-color-low-l); - --tab-inactive-background-color: var(--border-color-low); - --tab-inactive-border-color: var(--border-color-medium); - --tab-inactive-text-color-delta-l: calc(85 / 255 * 100%); - --tab-inactive-text-color-l: calc(var(--tab-inactive-background-color-l) + var(--background-color-delta-l-sign) * var(--tab-inactive-text-color-delta-l)); - --tab-inactive-text-color: hsl(var(--tab-inactive-background-color-hsl)); - --tab-inactive-hover-background-color: var(--background-color-high); - --tab-active-background-color: var(--background-color-high); - --tab-active-text-color: #0069d6; - --tab-active-border-color: var(--border-color-medium); - - margin: 0 -5px 18px; - padding: 0 2px; - list-style: none; - display: flex; - flex-wrap: wrap; - background: linear-gradient(var(--tab-bar-background-color) 28px, var(--tab-inactive-border-color) 28px); - background-size: 1px 29px; - background-position: left bottom; -} - -.tabs > li, .cbi-tabmenu > li { - flex: 0 1 auto; - display: flex; - align-items: center; - height: 25px; - max-width: 48%; - margin: 4px 2px 0 2px; - background: var(--tab-active-background-color); - border: 1px solid var(--tab-active-border-color); - border-bottom: none; - border-radius: 4px 4px 0 0; - color: var(--primary-color-high); -} - -.tabs > li > a, .cbi-tabmenu > li > a { - padding: 4px 6px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: inherit; - text-decoration: none; - border-radius: 4px 4px 0 0; - line-height: 25px; - outline: none; -} - -.tabs > li > a:focus-visible, .cbi-tabmenu > li > a:focus-visible { - text-decoration: underline; -} - -.tabs > li:not(.active):hover, .cbi-tabmenu > .cbi-tab-disabled:hover { - background: linear-gradient(var(--tab-inactive-hover-background-color) 90%, var(--tab-inactive-border-color) 100%); -} - -.tabs > li:not(.active), .cbi-tabmenu > .cbi-tab-disabled { - color: var(--tab-inactive-text-color); - background: linear-gradient(var(--tab-inactive-background-color) 90%, var(--tab-inactive-border-color) 100%); -} - -.cbi-tab-disabled[data-errors]::after { - content: attr(data-errors); - background: #c43c35; - color: #fff; - height: 16px; - min-width: 16px; - border-radius: 8px; - text-align: center; - margin: 0 5px 0 0; - padding: 3px 2px 1px 2px; - display: inline-flex; - flex-direction: column; - justify-content: center; - font-size: 12px; -} - -.cbi-tabmenu.map { - margin: 0; -} - -.cbi-tabmenu.map > li { - font-size: 16.5px; - font-weight: bold; -} - -.cbi-tab-descr { - margin: -9px 0 18px 0; -} - -.tabs .menu-dropdown, .tabs .dropdown-menu { - top: 35px; - border-width: 1px; - border-radius: 0 6px 6px 6px; -} - -.tabs a.menu:after, .tabs .dropdown-toggle:after { - border-top-color: #999; - margin-top: 15px; - margin-left: 5px; -} - -.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle { - border-color: #999; -} - -.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after { - border-top-color: #555; -} - -.tab-content > .tab-pane, -.tab-content > div { - display: none; -} - -.tab-content > .active { - display: block; -} - -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background: linear-gradient(to bottom, var(--background-color-high), var(--background-color-low)); - border: 1px solid var(--border-color-medium); - border-radius: 3px; - display: flex; - flex: 0; -} - -.breadcrumb li { - list-style: none; -} - -.breadcrumb li:not(:last-child)::after { - content: "|"; - padding: 0 5px; -} - -.breadcrumb .active a { - color: var(--text-color-medium); -} - -footer { - padding-top: 17px; - margin-top: auto; - border-top: 1px solid var(--border-color-low); - display: flex; - flex-wrap: wrap; - align-items: baseline; - justify-content: space-between; - font-size: 12px; - color: var(--text-color-medium); - /* the redundant properties below work around a csstidy bug */ - padding-left: calc((100% - 940px) / 2); - padding-right: calc((100% - 940px) / 2); -} - -footer a { - color: var(--primary-color-low); -} - -footer span { - margin-bottom: 1em; -} - -footer ul.breadcrumb { - margin-left: auto; -} - -#modal_overlay { - position: fixed; - top: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.7); - z-index: 900; - overflow: auto; - transition: opacity .125s ease-in; - opacity: 0; - visibility: hidden; -} - -.modal { - width: 90%; - margin: 5em auto; - min-height: 32px; - max-width: 600px; - border-radius: 3px; - background: var(--background-color-high); - border: 1px solid var(--border-color-low); - box-shadow: 0 0 3px var(--background-color-low); - padding: 1em 1em .5em 1em; - min-width: 270px; -} - -.modal > * { - line-height: normal; - margin-bottom: .5em; - max-width: 100%; -} - -.modal > pre, -.modal > textarea { - white-space: pre-wrap; - overflow: auto; - width: 100%; -} - -body.modal-overlay-active { - overflow: hidden; - height: 100vh; -} - -body.modal-overlay-active #modal_overlay { - left: 0; - right: 0; - opacity: 1; - visibility: visible; -} - -.btn .close, .alert-message .close { - font-family: Arial, sans-serif; - line-height: 18px; -} - -.btn.danger, -.alert-message.danger, -.btn.error, -.alert-message.error, -.cbi-tooltip.error { - background: linear-gradient(var(--error-color-low), var(--error-color-medium)); - color: var(--on-error-color); - border-color: var(--error-color-high) var(--error-color-high) var(--error-color-low); -} - -.btn.success, .alert-message.success, .cbi-tooltip.success { - background: linear-gradient(var(--success-color-low), var(--success-color-medium)); - color: var(--on-error-color); - border-color: var(--success-color-high) var(--success-color-high) var(--success-color-low); -} - -.btn.info, .alert-message.info, .cbi-tooltip.info { - background: linear-gradient(var(--primary-color-low), var(--primary-color-medium)); - color: var(--on-primary-color); - border-color: var(--primary-color-high) var(--primary-color-high) var(--primary-color-low); -} - -.alert-message.notice, .cbi-tooltip.notice { - background: linear-gradient(var(--background-color-low), var(--background-color-medium)); - border-color: var(--background-color-high) var(--background-color-high) var(--background-color-low); - color: var(--text-color-high); -} - -.alert-message.warning { - background: linear-gradient(var(--warn-color-low), var(--warn-color-medium)); - border-color: var(--warn-color-high) var(--warn-color-high) var(--warn-color-low); - color: var(--on-warn-color); -} - -.modal.alert-message { - color: var(--text-color-high); -} - -.item::after, -.btn, -.cbi-button { - --default-btn-background: linear-gradient(var(--background-color-high), var(--background-color-high) 25%, var(--background-color-low)); - --on-color: var(--text-color-high); - - cursor: pointer; - display: inline-block; - background: var(--default-btn-background); - padding: 0 14px; - color: var(--on-color); - font-size: 13px; - line-height: 2em; - border: 1px solid var(--border-color-high); - border-radius: 4px; - white-space: pre; -} - -.cbi-input-invalid, -.cbi-input-invalid.cbi-dropdown:not(.btn):not(.cbi-button), -.cbi-input-invalid.cbi-dropdown:not([open]) > ul > li, -.cbi-value-error input { - color: var(--error-color-high); - border-color: var(--error-color-medium); -} - -.cbi-button-positive, -.cbi-button-fieldadd, -.cbi-button-add, -.cbi-button-save { - --on-color: var(--success-color-high); - border-color: var(--on-color); -} - -.cbi-button-neutral, -.cbi-button-download, -.cbi-button-find, -.cbi-button-link, -.cbi-button-up, -.cbi-button-down { - color: var(--text-color-high); -} - -.btn.primary, -.cbi-button-action, -.cbi-button-apply, -.cbi-button-reload, -.cbi-button-edit { - --on-color: var(--primary-color-high); - border-color: var(--on-color); -} - -.cbi-button-negative, -.cbi-section-remove .cbi-button, -.cbi-button-reset, -.cbi-button-remove { - --on-color: var(--error-color-high); - border-color: var(--on-color); -} - -.cbi-page-actions::after { - display: table; - content: ""; - clear: both; -} - -.cbi-page-actions > * { - vertical-align: middle; -} - -.cbi-page-actions > :not([method="post"]):not(.cbi-button-apply):not(.cbi-button-negative):not(.cbi-button-save):not(.cbi-button-reset) { - float: left; - margin-right: .4em; -} - -.btn.primary, -.cbi-button-action.important, -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit { - --on-color: var(--on-primary-color); - background: linear-gradient(var(--primary-color-medium), var(--primary-color-low)); - border-color: var(--primary-color-high); -} - -.cbi-button-positive.important, -.cbi-page-actions .cbi-button-save { - --on-color: var(--on-success-color); - background: linear-gradient(var(--success-color-medium), var(--success-color-low)); - border-color: var(--success-color-high); -} - -.cbi-button-negative.important { - --on-color: var(--on-error-color); - background: linear-gradient(var(--error-color-medium), var(--error-color-low)); - border-color: var(--error-color-high); -} - -.cbi-page-actions .cbi-button-apply + .cbi-button-save, -.cbi-page-actions .cbi-button-negative + .cbi-button-save { - --on-color: var(--success-color-high); - border-color: var(--on-color); - background: var(--default-btn-background); -} - -.cbi-dropdown { - display: inline-flex !important; - cursor: pointer; - height: auto; - position: relative; - padding: 0 !important; -} - -.cbi-dropdown:not(.btn):not(.cbi-button) { - background: linear-gradient(var(--background-color-high) 0%, var(--border-color-low) 100%); - border: 1px solid var(--border-color-high); - border-radius: 3px; - color: var(--text-color-high); -} - -.cbi-dropdown > ul { - margin: 0 !important; - padding: 0; - list-style: none; - overflow-x: hidden; - overflow-y: hidden; - display: flex; - width: 100%; -} - -.cbi-dropdown.btn > ul:not(.dropdown), -.cbi-dropdown.cbi-button > ul:not(.dropdown) { - margin: 0 0 0 13px !important; -} - -.cbi-dropdown.btn.spinning > ul:not(.dropdown), -.cbi-dropdown.cbi-button.spinning > ul:not(.dropdown) { - margin: 0 !important; -} - -.cbi-dropdown > ul.preview { - display: none; -} - -.cbi-dropdown > .open, -.cbi-dropdown > .more { - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - line-height: 2em; - padding: 0 .3em; -} - -.cbi-dropdown.btn > .open, -.cbi-dropdown.cbi-button > .open { - padding: 0 .5em; - margin-left: .5em; - border-left: 1px solid; -} - -.cbi-dropdown > .more, -.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li[placeholder] { - color: var(--text-color-medium); - display: none; -} - -.cbi-dropdown > ul > li { - display: none; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 1; - flex-grow: 1; - align-items: center; - align-self: center; - color: inherit; -} - -.cbi-dropdown > ul.dropdown > li, -.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li { - min-height: 20px; - padding: .25em; - color: var(--text-color-high); -} - -.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } -.cbi-dropdown > ul > li .hide-close { display: none; } - -.cbi-dropdown > ul > li[display]:not([display="0"]) { - border-left: 1px solid var(--border-color-high); -} - -.cbi-dropdown[empty] > ul { - max-width: 1px; -} - -.cbi-dropdown > ul > li > form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown > ul > li img { - vertical-align: middle; - margin-right: .25em; -} - -.cbi-dropdown > ul > li > form > input[type="checkbox"] { - margin: 0 .25em 0 0; -} - -.cbi-dropdown > ul > li input[type="text"] { - height: 20px; -} - -.cbi-dropdown[open] { - position: relative; -} - -.cbi-dropdown[open] > ul.dropdown { - display: block; - background: var(--background-color-low); - border: 1px solid #918e8c; - box-shadow: 0 0 4px #918e8c; - position: absolute; - z-index: 1100; - max-width: none; - min-width: 100%; - width: auto; - transition: max-height .125s ease-in; - overflow-y: auto; -} - -.cbi-dropdown > ul > li[display], -.cbi-dropdown[open] > ul.preview, -.cbi-dropdown[open] > ul.dropdown > li, -.cbi-dropdown[multiple] > ul > li > label, -.cbi-dropdown[multiple][open] > ul.dropdown > li, -.cbi-dropdown[multiple][more] > .more, -.cbi-dropdown[multiple][empty] > .more { - flex-grow: 1; - display: flex !important; -} - -.cbi-dropdown[empty] > ul > li, -.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder] { - display: block !important; -} - -.cbi-dropdown[multiple][open] > ul.dropdown > li > form { - display: flex !important; -} - -.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } -.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } - -.cbi-dropdown[open] > ul.dropdown > li { - border-bottom: 1px solid var(--border-color-high); -} - -.cbi-dropdown[open] > ul.dropdown > li[selected] { - background: var(--primary-color-medium); - color: var(--on-primary-color); -} - -.cbi-dropdown[open] > ul.dropdown > li.focus { - background: var(--primary-color-low); - color: var(--on-primary-color); -} - -.cbi-dropdown[open] > ul.dropdown > li[selected].focus { - background: linear-gradient(90deg, var(--primary-color-medium) 50%, var(--primary-color-low)); -} - -.cbi-dropdown[open] > ul.dropdown > li:last-child { - margin-bottom: 0; - border-bottom: none; -} - -.cbi-dropdown[open] > ul.dropdown > li[unselectable] { - opacity: 0.7; -} - -.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { - width: 100%; -} - -.cbi-title-ref { - color: #37c; -} - -.cbi-title-ref::after { - content: "➙"; -} - -.cbi-tooltip-container { - cursor: help; -} - -.cbi-tooltip { - position: absolute; - z-index: 1000; - left: -10000px; - box-shadow: 0 0 2px var(--border-color-high); - border-radius: 3px; - background: var(--background-color-high); - white-space: pre; - padding: 2px 5px; - opacity: 0; - transition: opacity .25s ease-in; -} - -.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { - left: auto; - opacity: 1; - transition: opacity .25s ease-in; -} - -.cbi-progressbar { - border: 1px solid var(--border-color-high); - border-radius: 3px; - position: relative; - min-width: 170px; - height: 8px; - margin: 1.4em 0 4px 0; - background: var(--background-color-medium); -} - -.cbi-progressbar > div { - background: var(--primary-color-medium); - height: 100%; - transition: width .25s ease-in; - width: 0%; - border-radius: 2px; -} - -.cbi-progressbar::before { - position: absolute; - top: -1.4em; - left: 0; - content: attr(title); - white-space: pre; - overflow: hidden; - text-overflow: ellipsis; -} - -.zonebadge .cbi-tooltip { - padding: 1px; - background: inherit; - margin: -1.6em 0 0 -5px; - border-radius: 3px; - pointer-events: none; - box-shadow: 0 0 3px #444; -} - -.zonebadge .cbi-tooltip > * { - margin: 1px; - z-index: 2; - position: relative; -} - -.zone-forwards { - display: flex; - flex-wrap: wrap; -} - -.zone-forwards > * { - flex: 1 1 40%; - padding: 1px; -} - -.zone-forwards > span { - flex-basis: 10%; - text-align: center; -} - -.zone-forwards .zone-src, -.zone-forwards .zone-dest { - display: flex; - flex-direction: column; -} - -.btn.active, .btn:active { - box-shadow: inset 0 2px 4px hsla(var(--border-color-low-hsl), .25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - opacity: var(--disabled-opacity); - box-shadow: none; -} - -.btn.large { - font-size: 15px; - line-height: normal; - padding: 9px 14px 9px; - border-radius: 6px; -} - -.btn.small { - padding: 7px 9px 7px; - font-size: 11px; -} - -button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -.close { - float: right; - color: #000; - font-size: 20px; - font-weight: bold; - line-height: 13.5px; - text-shadow: 0 1px 0 #fff; - opacity: 0.25; -} - -.close:hover { - color: #000; - text-decoration: none; - opacity: 0.4; -} - -.alert-message { - position: relative; - padding: .5em .5em .25em .5em; - margin-bottom: .5em; - color: var(--on-warn-color); - background: linear-gradient(#fceec1, #eedc94); - border: 1px solid var(--border-color-low); - border-color: var(--border-color-high) var(--border-color-high) var(--border-color-low); - border-radius: 4px; - box-shadow: 1px 1px 1px var(--border-color-low); - white-space: unset; -} - -.alert-message .close { - margin-top: 1px; -} - -.alert-message h4, -.alert-message h5, -.alert-message pre, -.alert-message ul, -.alert-message li, -.alert-message p { - color: inherit; - border: none; - line-height: inherit; - background: transparent; - padding: 0; - margin: .25em 0; -} - -.alert-message button { - margin: .25em 0; -} - -.label, -header [data-indicator] { - padding: 3px 3px 2px; - font-size: 9.75px; - font-weight: bold; - color: var(--text-color-high); - text-transform: uppercase; - white-space: nowrap; - background-color: var(--background-color-low); - border-radius: 3px; - text-shadow: none; - margin: .125em 0 .125em .4em; -} - -header [data-indicator][data-clickable] { - cursor: pointer; -} - -a.label:link, -a.label:visited { - color: #fff; -} - -a.label:hover { - text-decoration: none; -} - -.label.important { - background-color: var(--primary-color-high); - color: var(--on-primary-color); -} - -.label.warning { - background-color: var(--warn-color-high); - color: var(--on-warn-color); -} - -.label.success { - background-color: var(--success-color-high); - color: var(--on-success-color); -} - -.label.notice, -header [data-indicator][data-style="active"] { - color: var(--on-primary-color); - background-color: var(--primary-color-high); -} - -/* LuCI specific items */ -.hidden { display: none } - -form.inline { display: inline; margin-bottom: 0; } - -#modemenu li:last-child span.divider { display: none } - -#syslog { - width: 100%; - color: var(--text-color-highest); - margin-bottom: 18px; -} - -.cbi-section-table .tr:hover .td, -.cbi-section-table .tr:hover .th, -.cbi-section-table .tr:hover::before { - background-color: var(--background-color-low); -} - -.cbi-section-table .tr.cbi-section-table-descr .th { - font-weight: normal; -} - -.cbi-section-table-titles.named::before, -.cbi-section-table-descr.named::before, -.cbi-section-table-row[data-title]::before { - content: attr(data-title) " "; - display: table-cell; - padding: 10px 10px 9px; - line-height: 18px; - font-weight: bold; - vertical-align: middle; -} - -.cbi-section-table-titles.named::before, -.cbi-section-table-descr.named::before, -.cbi-section-table-row[data-title]::before { - border-top: 1px solid var(--border-color-medium); -} - -.left { text-align: left !important; } -.right { text-align: right !important; } -.center { text-align: center !important; } -.top { vertical-align: top !important; } -.middle { vertical-align: middle !important; } -.bottom { vertical-align: bottom !important; } - -table table td, -.cbi-value-field table td { - border: none; -} - -.table.cbi-section-table input[type="password"], -.table.cbi-section-table input[type="text"], -.table.cbi-section-table textarea, -.table.cbi-section-table select, -.table.cbi-section-table .cbi-select { - width: 100%; - min-width: auto; -} - -.table.cbi-section-table .td.cbi-section-table-cell { - white-space: nowrap; - text-align: right; -} - -.table.cbi-section-table .td.cbi-section-table-cell select, -.table.cbi-section-table .td.cbi-section-table-cell .cbi-select { - width: inherit; -} - -.td.cbi-section-actions { - text-align: right; - vertical-align: middle; - width: 15%; -} - -.td.cbi-section-actions > * { - display: flex; -} - -.td.cbi-section-actions > :not(.cbi-dropdown) > *, -.td.cbi-section-actions > * > form > * { - flex: 1 1 4em; - margin: 0 1px; -} - -.td.cbi-section-actions > * > form { - display: inline-flex; - margin: 0; -} - -.table.valign-middle .td { - vertical-align: middle; -} - -.cbi-rowstyle-2, -.tr.table-titles, -.tr.cbi-section-table-titles { - background: var(--background-color-medium); -} - -th[data-sortable-row] { cursor: pointer; } -th[data-sort-direction="asc"]::after { content: "\a0\25b2"; } -th[data-sort-direction="desc"]::after { content: "\a0\25bc"; } - -.cbi-value-description { - margin: .25em 0 0 1.25em; - position: relative; -} - -.cbi-value-description:not(:empty)::before { - --help-icon: url("data:image/svg+xml,"); - - position: absolute; - left: -1.25em; - content: "\a0"; - display: inline-block; - width: 1em; - height: 1em; - margin-right: .25em; - background: var(--primary-color-high); - mask-image: var(--help-icon); - mask-size: cover; - -webkit-mask-image: var(--help-icon); - -webkit-mask-size: cover; -} - -.cbi-section-error { - border: 1px solid #f00; - border-radius: 3px; - background-color: #fce6e6; - padding: 5px; - margin-bottom: 18px; -} - -.cbi-section-error ul { margin: 0 0 0 20px; } - -.cbi-section-error ul li { - color: #f00; - font-weight: bold; -} - -.ifacebox { - border: 1px solid var(--border-color-high); - margin: 0 10px; - text-align: center; - white-space: nowrap; - background: linear-gradient(var(--background-color-high), var(--background-color-medium)); - border-radius: 4px; - box-shadow: inset 0 1px 0 hsla(var(--text-color-low-hsl), 0.05); - display: inline-flex; - flex-direction: column; - line-height: 1.2em; - min-width: 100px; -} - -.ifacebox .ifacebox-head { - border-bottom: 1px solid var(--border-color-high); - border-radius: 3px 3px 0 0; - padding: 2px; - background: #eee; - color: var(--text-color-high); -} - -.ifacebox .ifacebox-head[style] { - text-shadow: 0 1px 1px hsla(var(--background-color-high-hsl), 0.75); -} - -.ifacebox .ifacebox-head.active { - background: var(--primary-color-high); - color: var(--on-primary-color); -} - -[data-darkmode="true"] .zonebadge[style], -[data-darkmode="true"] .ifacebox-head[style] { - background: linear-gradient(rgba(var(--zone-color-rgb), .4), rgba(var(--zone-color-rgb), .3)) !important; -} - -.ifacebox .ifacebox-body { - padding: .25em; -} - -.ifacebadge { - display: inline-block; - flex-direction: row; - white-space: nowrap; - border: 1px solid var(--border-color-high); - padding: 2px; - background: linear-gradient(var(--background-color-high), var(--background-color-high) 25%, var(--background-color-medium)); - color: var(--text-color-high); - text-shadow: 0 1px 1px hsla(var(--background-color-high-hsl), 0.75); - border-radius: 4px; - box-shadow: inset 0 1px 0 hsla(var(--background-color-high-hsl), 0.05); - cursor: default; - line-height: 1.2em; -} - -.ifacebadge img { - width: 16px; - height: 16px; - vertical-align: middle; -} - -.ifacebadge-active { - border-color: #000; - font-weight: bold; -} - -.network-status-table { - display: flex; - flex-wrap: wrap; -} - -.network-status-table .ifacebox { - margin: .5em; - flex-grow: 1; -} - -.network-status-table .ifacebox-body { - display: flex; - flex-direction: column; - height: 100%; - text-align: left; -} - -.network-status-table .ifacebox-body > * { - margin: .25em; -} - -.network-status-table .ifacebox-body > span { - flex: 10 10 auto; - height: 100%; -} - -.network-status-table .ifacebox-body > div { - margin: -.125em; - display: flex; - flex-wrap: wrap; -} - -#dsl_status_table .ifacebox-body span > strong { - display: inline-block; - min-width: 35%; -} - -.ifacebadge.large, -.network-status-table .ifacebox-body .ifacebadge { - display: flex; - flex: 1; - padding: .25em; - min-width: 220px; - margin: .125em; -} - -.ifacebadge.large { - display: inline-flex; -} - -.network-status-table .ifacebox-body .ifacebadge > span { - overflow: hidden; - text-overflow: ellipsis; -} - -.ifacebadge > *, -.ifacebadge.large > * { - margin: 0 .125em; -} - -.zonebadge { - padding: 2px; - border-radius: 4px; - display: inline-block; - white-space: nowrap; - color: var(--text-color-high); - text-shadow: 0 1px 1px hsla(var(--background-color-high-hsl), 0.75); -} - -.zonebadge > em, -.zonebadge > strong { - margin: 0 2px; - display: inline-block; -} - -.zonebadge input { - width: 6em; -} - -.zonebadge > .ifacebadge { - margin-left: 2px; -} - -.zonebadge-empty { - border: 1px dashed #aaa; - color: #aaa; - font-style: italic; - font-size: smaller; -} - -div.cbi-value var, -.td.cbi-value-field var { - font-style: italic; - color: #0069d6; -} - -div.cbi-value var[data-tooltip], -.td.cbi-value-field var[data-tooltip], -div.cbi-value var.cbi-tooltip-container, -.td.cbi-value-field var.cbi-tooltip-container { - cursor: help; - border-bottom: 1px dotted #0069d6; -} - -div.cbi-value var.cbi-tooltip-container, -.td.cbi-value-field var.cbi-tooltip-container .cbi-tooltip { - font-style: normal; - white-space: normal; - color: var(--text-color-high); -} - -#modal_overlay > .modal.uci-dialog, -#modal_overlay > .modal.cbi-modal { - max-width: 900px; -} - -#modal_overlay > .modal.login > button.important { - font-size: 120% !important; - margin-top: .5em; - width: 100%; -} - -.uci-change-list { - line-height: 170%; - white-space: pre; -} - -.uci-dialog div > del, -.uci-dialog div > ins, -.uci-dialog div > var { - margin-bottom: 2px; - border: 1px solid var(--border-color-high); - line-height: 15px; - overflow: hidden; - text-overflow: ellipsis; - padding: 2px; - position: relative; - background-color: var(--background-color-low); -} - -.uci-dialog div > ins { - background-color: rgba(var(--success-color-high-rgb), .3); - border-color: rgba(var(--success-color-high-rgb), .6); -} - -.uci-dialog div > del { - background-color: rgba(var(--error-color-high-rgb), .3); - border-color: rgba(var(--error-color-high-rgb), .6); -} - -.uci-dialog var > ins { - background-color: rgba(var(--success-color-high-rgb), .3); -} - -.uci-dialog var > del { - background-color: rgba(var(--error-color-high-rgb), .3); -} - -.uci-change-list > var > * { - overflow: hidden; - text-overflow: ellipsis; -} - -.uci-dialog del, -.uci-dialog ins, -.uci-dialog var { - text-decoration: none; - font-family: monospace; - font-style: normal; - color: var(--text-color-high); - display: block; -} - -.uci-change-legend { - display: flex; - flex-wrap: wrap; -} - -.uci-change-legend-label { - flex-basis: 150px; - margin: 2px; - display: flex; - align-items: center; -} - -.uci-change-legend-label > ins, -.uci-change-legend-label > del, -.uci-change-legend-label > var { - margin-right: 4px; - width: 16px; - height: 16px; - display: flex; -} - -.uci-change-legend-label > * > * { - flex-basis: 100%; - padding: 1px; -} - -#applyreboot-section { - line-height: 300%; -} - -@keyframes flash { - 0% { opacity: 1; } - 50% { opacity: .5; } - 100% { opacity: 1; } -} - -.flash { - animation: flash .35s; -} - -#view > div.spinning:first-child { - display: table; - margin: 15vh auto; -} - -.spinning { - position: relative; - padding-left: 32px !important; -} - -.spinning::before { - --spinner-icon: url("data:image/svg+xml,"); - - position: absolute; - top: calc(50% - 10px); - left: 6px; - width: 20px; - height: 20px; - content: " "; - background: var(--on-color, #000); - mask: var(--spinner-icon) center/cover no-repeat; - -webkit-mask: var(--spinner-icon) center/cover no-repeat; -} - -[data-darkmode="true"] .spinning::before { - background: var(--on-color, #fff); -} - -[data-tab-title] { - height: 0; - opacity: 0; - overflow: hidden; -} - -[data-tab-active="true"] { - opacity: 1; - height: auto; - overflow: visible; - transition: opacity .25s ease-in; -} - -.cbi-filebrowser { - min-width: 210px; - max-width: 100%; - border: 1px solid #ccc; - border-radius: 3px; - display: flex; - flex-direction: column; - opacity: 0; - height: 0; - overflow: hidden; -} - -.cbi-filebrowser.open { - opacity: 1; - height: auto; - overflow: visible; - transition: opacity .25s ease-in; -} - -.cbi-filebrowser > * { - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - padding: 0 0 .25em 0; - margin: .25em .25em 0px .25em; - white-space: nowrap; - border-bottom: 1px solid #ccc; -} - -.cbi-filebrowser .cbi-button-positive { - margin-right: .25em; -} - -.cbi-filebrowser > div { - border-bottom: none; -} - -.cbi-filebrowser > ul > li { - display: flex; - flex-direction: row; -} - -.cbi-filebrowser > ul > li:hover { - background: #f5f5f5; -} - -.cbi-filebrowser > ul > li > div:first-child { - flex: 10; - overflow: hidden; - text-overflow: ellipsis; -} - -.cbi-filebrowser > ul > li > div:last-child { - flex: 3; - text-align: right; -} - -.cbi-filebrowser > ul > li > div:last-child > button { - padding: .125em .25em; - margin: 1px 0 1px .25em; -} - -.cbi-filebrowser .upload { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 0 -.125em .25em -.125em; - padding: 0 0 .125em 0px; - border-bottom: 1px solid #ccc; -} - -.cbi-filebrowser .upload > * { - margin: .125em; - flex: 1; -} - -.cbi-filebrowser .upload > .btn { - flex-basis: 60px; -} - -.cbi-filebrowser .upload > div { - flex: 10; - min-width: 150px; -} - -.cbi-filebrowser .upload > div > input { - width: 100%; -} - -@keyframes fade-in { - 0% { opacity: 0; } - 100% { opacity: 1; } -} - -@keyframes fade-out { - 0% { opacity: 1; } - 100% { opacity: 0; } -} - -.fade-in { - animation: fade-in .4s ease; -} - -.fade-out { - animation: fade-out .4s ease; -} - -.assoclist .ifacebadge { - display: flex; - flex-direction: column; - align-items: center; - white-space: normal; - text-align: center; -} - -.assoclist .ifacebadge > img { - margin: .2em; -} - -.assoclist .td:nth-of-type(3), -.assoclist .td:nth-of-type(5) { - width: 25%; -} - -.assoclist .td:nth-of-type(6) button { - word-break: normal; -} - -[data-darkmode="true"] [data-page="admin-statistics-graphs"] [data-plugin] img { - filter: invert(100%) hue-rotate(150deg); -} - -[data-page="admin-system-admin-sshkeys"] .cbi-dynlist { - max-width: none; -} diff --git a/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png b/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.png deleted file mode 100644 index 90adf2f94f5551c42f373ce68e583734674bb5c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0sx-8_0H705DDyb8#cVN;Glw$k z+G8+nC!myy0N~(pI3i;?Zs3-Ijs3#_k*ZP*Fo^L8D`Amc+daHCV!K|1$c!#+z-N98 zVt;aV3mgGNM-%Lym^xoLozqKr6<o-c0x6&HixcW#uZ^&-w@%LEO;QQ=jt%5?4B<;!g%k`k8#@@}+@&tT<*oQ%)F@6Q zDlTL{Bn4?<= li, .cbi-tabmenu > li { - height: 30px; - } - - .tabs > li > a, .cbi-tabmenu > li > a { - padding: 0 8px; - line-height: 30px; - } - - .table { - display: flex; - flex-direction: column; - width: 100%; - } - - .tr { - display: flex; - flex-direction: row; - flex-wrap: wrap; - align-items: flex-end; - border-top: 1px solid var(--border-color-medium); - padding: 5px 0; - margin: 0 -3px; - } - - .table .th, - .table .td, - .table .tr::before { - flex: 1 1 50%; - align-self: flex-start; - overflow: hidden; - text-overflow: ellipsis; - word-wrap: break-word; - display: inline-block; - border-top: none; - padding: 3px; - box-sizing: border-box; - } - - .table .td.cbi-dropdown-open { - overflow: visible; - } - - .col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; } - .col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; } - .col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; } - .col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; } - .col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; } - .col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; } - .col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; } - .col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; } - .col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; } - .col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; } - - .td select { - word-wrap: normal; - } - - .td[data-widget="button"], - .td[data-widget="fvalue"] { - flex: 1 1 17%; - text-align: left; - } - - .td.cbi-value-field { - align-self: flex-start; - flex-basis: 100%; - margin-bottom: .3em; - } - - .td.cbi-value-field .cbi-button { - width: 100%; - } - - .table.cbi-section-table { - border: none; - background: none; - margin: 0; - } - - .tr.table-titles, - .cbi-section-table-titles, - .cbi-section-table-descr { - display: none; - } - - .cbi-section-table-row { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 0 0 .5em 0; - } - - .cbi-section-table + .cbi-section-create { - padding-top: 0; - } - - .tr[data-title]::before { - display: block; - flex: 1 1 100%; - background: var(--background-color-low) !important; - font-size: 16px; - border-bottom: 1px solid var(--border-color-medium); - } - - .td[data-title]::before { - content: attr(data-title); - font-weight: bold; - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: pre-line; - } - - .td[data-description]::after { - display: block; - } - - .td[data-title] ~ .td.cbi-section-actions { - align-self: flex-start; - } - - .td.cbi-section-actions { - overflow: initial; - max-width: 100%; - padding: 3px 2px; - flex-basis: 100%; - } - - .hide-sm, - .hide-xs { - display: none !important; - } - - .td.cbi-value-field[data-widget="CBI.DummyValue"], - .td.cbi-value-field[data-widget="CBI.Button"], - .td.cbi-value-field[data-widget="CBI.FlagValue"], - .td.cbi-value-field[data-widget="dvalue"], - .td.cbi-value-field[data-widget="button"], - .td.cbi-value-field[data-widget="fvalue"] { - flex-basis: 50%; - text-align: left; - } - - .cbi-section-table .tr:hover .td, - .cbi-section-table .tr:hover .th, - .cbi-section-table .tr:hover::before { - background-color: transparent; - } - - .cbi-tab-descr { - margin: 0 0 .5em 0; - } - - .cbi-value { - padding-bottom: .5em; - border-bottom: 1px solid var(--border-color-high); - margin-bottom: .5em; - display: block; - } - - .cbi-value.hidden { - display: none; - } - - .cbi-value .cbi-value:last-child { - border-bottom: none; - padding-bottom: inherit; - margin-bottom: inherit; - } - - .cbi-value label.cbi-value-title { - font-weight: bold; - } - - .cbi-value-field, .cbi-select, .cbi-dynlist, .cbi-dropdown:not(.btn):not(.cbi-button) { - width: 100%; - margin: 0; - } - - .cbi-dynlist > .item { - min-height: 30px; - display: flex; - align-items: center; - } - - input, textarea, select, - .cbi-dropdown > ul > li { - font-size: 16px !important; - height: auto; - } - - .cbi-dropdown > ul > li input[type="text"] { - line-height: 28px; - } - - select, input[type="text"], input[type="password"], - .cbi-dropdown > ul > li input[type="text"], - .cbi-value-field .control-group { - width: 100%; - height: 30px; - } - - input.cbi-input-password { - width: calc(100% - 25px); - } - - input[type="text"] + .cbi-button, - input[type="password"] + .cbi-button, - select + .cbi-button { - overflow: hidden; - text-overflow: ellipsis; - } - - .cbi-value-field input[type="checkbox"], - .cbi-value-field input[type="radio"] { - margin: 0; - } - - button, .btn, .cbi-button { - font-size: 14px !important; - padding: 0 8px; - } - - .actions, - .cbi-page-actions { - border-top: none; - margin-top: -.5em; - padding: 8px; - } - - [data-page="admin-status-overview"] .td[width="33%"] { - flex-basis: 33%; - } - - header .pull-right .label { - white-space: normal; - display: inline-block; - text-align: center; - line-height: 12px; - margin: 1px 0; - } - - header > .fill { - padding: 1px; - } - - header > .fill > .container { - display: flex; - flex-direction: row; - } - - header .nav { - flex: 3 3 80%; - margin: 2px 5px 2px 0; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - } - - header .nav a { - padding: 2px 6px; - } - - header .pull-right { - flex: 0 1 20%; - display: flex; - flex-direction: column; - padding: 0; - justify-content: space-around; - margin: .2em 5px .2em auto; - } - - .menu-dropdown, .dropdown-menu { - top: 23px; - } - - .cbi-optionals, - .cbi-section-create { - padding: 0 0 14px 0; - } - - #cbi-network-switch_vlan .th, - #cbi-network-switch_vlan .td { - flex-basis: 12%; - } - - #cbi-network-switch_vlan .td.cbi-section-actions > * { - width: auto; - display: block; - } - - #wifi_assoclist_table .td, - [data-page="admin-status-processes"] .td { - flex-basis: 50% !important; - } - - [data-page="admin-status-processes"] .td[data-widget="button"] { - flex-basis: 33% !important; - } - - [data-page="admin-status-processes"] .td[data-name="PID"], - [data-page="admin-status-processes"] .td[data-name="USER"] { - flex-basis: 25% !important; - } - - [data-page="admin-system-fstab"] .td[data-widget="button"]::before, - [data-page="admin-system-startup"] .td[data-widget="button"]::before, - [data-page="admin-status-processes"] .td[data-widget="button"]::before { - display: none; - } - - [data-name="bridge-vlan"] > div { - overflow: visible !important; - } - - [data-name="bridge-vlan"] .td[data-title] { - flex-basis: 33%; - } - - [data-name="bridge-vlan"] .td[data-title]::before { - content: attr(data-title); - } - - [data-page="admin-network-network"] .td[data-name="_ifacebox"] { - flex-basis: 40%; - } - - [data-page="admin-network-network"] .td[data-name="_ifacestat"] { - flex-basis: 60%; - } -} - -@media screen and (max-device-width: 375px) { - .cbi-page-actions { - display: flex; - justify-content: space-between; - margin: 0 -1px; - padding: 0; - } - - .cbi-page-actions button { - overflow: hidden; - text-overflow: ellipsis; - } - - .cbi-page-actions .cbi-button { - flex: 1; - margin: 1px !important; - line-height: 2em; - } - - .cbi-page-actions .cbi-button-negative, - .cbi-page-actions .cbi-button-primary, - .cbi-page-actions .cbi-button-apply { - flex: 3; - } - - .cbi-section-actions .cbi-button { - overflow: hidden; - text-overflow: ellipsis; - margin: 1px !important; - } - - body[data-page="admin-network-wireless"] .td[data-name="_badge"] { - max-width: 50px; - align-self: center; - } - - body[data-page="admin-network-wireless"] .td[data-name="_badge"] .ifacebadge { - display: flex; - align-items: center; - flex-direction: column; - } - - body[data-page="admin-network-wireless"] .td[data-name="_stat"] { - flex-basis: 60%; - } - - body[data-page="admin-network-network"] .td.cbi-section-actions::before, - body[data-page="admin-network-wireless"] .td.cbi-section-actions::before { - content: none !important; - } - - [data-page="admin-network-network"] .td[data-name="_ifacebox"], - [data-page="admin-network-network"] .td[data-name="_ifacestat"] { - flex-basis: 100%; - } - - .td .ifacebox { - width: 100%; - margin: 0 !important; - flex-direction: row; - } - - .td .ifacebox .ifacebox-head { - min-width: 25%; - justify-content: space-around; - border-radius: 4px 0 0 4px; - } - - .td .ifacebox .ifacebox-head, - .td .ifacebox .ifacebox-body { - display: flex; - border-bottom: none; - align-items: center; - } - - .td .ifacebox .ifacebox-head > *, - .ifacebox .ifacebox-body > * { - margin: .125em; - } -} diff --git a/luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js b/luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js deleted file mode 100644 index 32922f384..000000000 --- a/luci-theme-bootstrap/htdocs/luci-static/resources/menu-bootstrap.js +++ /dev/null @@ -1,101 +0,0 @@ -'use strict'; -'require baseclass'; -'require ui'; - -return baseclass.extend({ - __init__: function() { - ui.menu.load().then(L.bind(this.render, this)); - }, - - render: function(tree) { - var node = tree, - url = ''; - - this.renderModeMenu(tree); - - if (L.env.dispatchpath.length >= 3) { - for (var i = 0; i < 3 && node; i++) { - node = node.children[L.env.dispatchpath[i]]; - url = url + (url ? '/' : '') + L.env.dispatchpath[i]; - } - - if (node) - this.renderTabMenu(node, url); - } - }, - - renderTabMenu: function(tree, url, level) { - var container = document.querySelector('#tabmenu'), - ul = E('ul', { 'class': 'tabs' }), - children = ui.menu.getChildren(tree), - activeNode = null; - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[3 + (level || 0)] == children[i].name), - activeClass = isActive ? ' active' : '', - className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); - - ul.appendChild(E('li', { 'class': className }, [ - E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] )])); - - if (isActive) - activeNode = children[i]; - } - - if (ul.children.length == 0) - return E([]); - - container.appendChild(ul); - container.style.display = ''; - - if (activeNode) - this.renderTabMenu(activeNode, url + '/' + activeNode.name, (level || 0) + 1); - - return ul; - }, - - renderMainMenu: function(tree, url, level) { - var ul = level ? E('ul', { 'class': 'dropdown-menu' }) : document.querySelector('#topmenu'), - children = ui.menu.getChildren(tree); - - if (children.length == 0 || level > 1) - return E([]); - - for (var i = 0; i < children.length; i++) { - var submenu = this.renderMainMenu(children[i], url + '/' + children[i].name, (level || 0) + 1), - subclass = (!level && submenu.firstElementChild) ? 'dropdown' : null, - linkclass = (!level && submenu.firstElementChild) ? 'menu' : null, - linkurl = submenu.firstElementChild ? '#' : L.url(url, children[i].name); - - var li = E('li', { 'class': subclass }, [ - E('a', { 'class': linkclass, 'href': linkurl }, [ _(children[i].title) ]), - submenu - ]); - - ul.appendChild(li); - } - - ul.style.display = ''; - - return ul; - }, - - renderModeMenu: function(tree) { - var ul = document.querySelector('#modemenu'), - children = ui.menu.getChildren(tree); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); - - ul.appendChild(E('li', { 'class': isActive ? 'active' : null }, [ - E('a', { 'href': L.url(children[i].name) }, [ _(children[i].title) ]) - ])); - - if (isActive) - this.renderMainMenu(children[i], children[i].name); - } - - if (ul.children.length > 1) - ul.style.display = ''; - } -}); diff --git a/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js b/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js deleted file mode 100644 index fd936c9b1..000000000 --- a/luci-theme-bootstrap/htdocs/luci-static/resources/view/bootstrap/sysauth.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; -'require ui'; -'require view'; - -return view.extend({ - render: function() { - var form = document.querySelector('form'), - btn = document.querySelector('button'); - - var dlg = ui.showModal( - _('Authorization Required'), - [].slice.call(document.querySelectorAll('section > *')), - 'login' - ); - - form.addEventListener('keypress', function(ev) { - if (ev.key == 'Enter') - btn.click(); - }); - - btn.addEventListener('click', function() { - dlg.querySelectorAll('*').forEach(function(node) { node.style.display = 'none' }); - dlg.appendChild(E('div', { 'class': 'spinning' }, _('Logging in…'))); - - form.submit() - }); - - document.querySelector('input[type="password"]').focus(); - - return ''; - }, - - addFooter: function() {} -}); diff --git a/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap b/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap deleted file mode 100755 index f83d84702..000000000 --- a/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -changed=0 - -set_opt() { - local key=$1 - local val=$2 - - if ! uci -q get "luci.$key" 2>/dev/null; then - uci set "luci.$key=$val" - changed=1 - fi -} - -set_opt themes.Bootstrap /luci-static/bootstrap - -if [ "$PKG_UPGRADE" != 1 ] && [ $changed = 1 ]; then - set_opt main.mediaurlbase /luci-static/bootstrap -fi - -set_opt themes.BootstrapDark /luci-static/bootstrap-dark -set_opt themes.BootstrapLight /luci-static/bootstrap-light - -if [ $changed = 1 ]; then - uci commit luci -fi - -exit 0 diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap-dark b/luci-theme-bootstrap/ucode/template/themes/bootstrap-dark deleted file mode 120000 index ac7bcbbf3..000000000 --- a/luci-theme-bootstrap/ucode/template/themes/bootstrap-dark +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap-light b/luci-theme-bootstrap/ucode/template/themes/bootstrap-light deleted file mode 120000 index ac7bcbbf3..000000000 --- a/luci-theme-bootstrap/ucode/template/themes/bootstrap-light +++ /dev/null @@ -1 +0,0 @@ -bootstrap \ No newline at end of file diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut b/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut deleted file mode 100644 index 603172405..000000000 --- a/luci-theme-bootstrap/ucode/template/themes/bootstrap/footer.ut +++ /dev/null @@ -1,20 +0,0 @@ - {% if (!blank_page): %} -
- - - {% endif %} - - diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut b/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut deleted file mode 100644 index b7bc770b4..000000000 --- a/luci-theme-bootstrap/ucode/template/themes/bootstrap/header.ut +++ /dev/null @@ -1,83 +0,0 @@ -{# - Copyright 2008 Steven Barth - Copyright 2012 David Menting - Copyright 2008-2022 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --#} - -{% - import { getuid, getspnam } from 'luci.core'; - - const boardinfo = ubus.call('system', 'board'); - const darkpref = (theme == 'bootstrap-dark' ? 'true' : (theme == 'bootstrap-light' ? 'false' : null)); - - http.prepare_content('text/html; charset=UTF-8'); --%} - - - - - - {{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI - {% if (!darkpref): %} - - {% endif %} - - - - - {% if (node?.css): %} - - {% endif %} - {% if (css): %} - - {% endif %} - - - - - - {% if (!blank_page): %} -
- {{ striptags(boardinfo.hostname ?? '?') }} - -
-
- -
- {% if (getuid() == 0 && getspnam('root')?.pwdp === ''): %} -
-

{{ _('No password set!') }}

-

{{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

- {% if (dispatcher.lookup("admin/system/admin")): %} - - {% endif %} -
- {% endif %} - - {% if (boardinfo.rootfs_type == "initramfs"): %} -
-

{{ _('System running in recovery (initramfs) mode.') }}

-

{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

- {% if (dispatcher.lookup("admin/system/flash")): %} - - {% endif %} -
- {% endif %} - - - - - {% endif %} diff --git a/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut b/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut deleted file mode 100644 index a172d95d7..000000000 --- a/luci-theme-bootstrap/ucode/template/themes/bootstrap/sysauth.ut +++ /dev/null @@ -1,48 +0,0 @@ -{# - Copyright 2022 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --#} - -{% include('header', { blank_page: true }) %} - - - -
-
{{ _('Loading view…') }}
- -
- -{% include('footer', { blank_page: true }) %} diff --git a/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css deleted file mode 100644 index 186ce88e1..000000000 --- a/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css +++ /dev/null @@ -1,2092 +0,0 @@ -@charset "utf-8"; - -.lang_he { - direction: RTL; - unicode-bidi: embed; -} - -@media all { - -html { - min-height: 100%; - height: auto; - position:relative; -} - -body { - color: #ffffff; - background-color: #4a6b7c; - background-position: bottom center; - background-repeat: repeat-x; - font-family: Arial, Verdana, sans-serif; - font-size: 13px; - padding-bottom: 1.5em; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -.table { display: table; width: 100%; position: relative; border-collapse: collapse; } -.tr { display: table-row; } -.thead { display: table-header-group; } -.tbody { display: table-row-group; } -.tfoot { display: table-footer-group; } -.td, .th { display: table-cell; vertical-align: middle; } -.th { font-weight: bold; } - -.table[width="33%"], .th[width="33%"], .td[width="33%"] { width: 33%; } -.table[width="100%"], .th[width="100%"], .td[width="100%"] { width: 100%; } - -.col-1 { flex: 1 1 30px !important; -webkit-flex: 1 1 30px !important; } -.col-2 { flex: 2 2 60px !important; -webkit-flex: 2 2 60px !important; } -.col-3 { flex: 3 3 90px !important; -webkit-flex: 3 3 90px !important; } -.col-4 { flex: 4 4 120px !important; -webkit-flex: 4 4 120px !important; } -.col-5 { flex: 5 5 150px !important; -webkit-flex: 5 5 150px !important; } -.col-6 { flex: 6 6 180px !important; -webkit-flex: 6 6 180px !important; } -.col-7 { flex: 7 7 210px !important; -webkit-flex: 7 7 210px !important; } -.col-8 { flex: 8 8 240px !important; -webkit-flex: 8 8 240px !important; } -.col-9 { flex: 9 9 270px !important; -webkit-flex: 9 9 270px !important; } -.col-10 { flex: 10 10 300px !important; -webkit-flex: 10 10 300px !important; } - -.tr.placeholder { - height: 3.5em; -} - -.tr.placeholder > .td { - position: absolute; - left: 0; - right: 0; - bottom: 0; - text-align: center; - line-height: 3em; -} - -.nowrap { - white-space: nowrap; -} - -a img { - border: none; - text-decoration: none; -} - -#maincontainer { - display: flex; -} - -#maincontent { - flex-basis: 100%; -} - -#mainmenu { - max-width: 200px; - background: #f5f5f5; - border: 1px solid #444; - border-width: 0 0 1px 1px; - font-size: 15px; - padding-bottom: 1em; -} - -#mainmenu ul { - display: block; - margin: 0; - padding: 0; -} - -#mainmenu ul li { - display: block; - white-space: nowrap; -} - -#mainmenu ul li > a { - display: block; - color: #444; - padding: .4em .5em; - text-decoration: none; -} - -#mainmenu ul li.selected > a { - background: #fff; - color: #37c; - border: 1px dotted #444; - border-width: 1px 0; -} - -#mainmenu ul li.selected:first-child > a { - border-top: none; -} - -#mainmenu ul li li > a { - font-size: 85%; - padding-left: 1.5em; -} - -#mainmenu ul li > ul { - flex-basis: 100%; - max-height: 0; - visibility: hidden; - transition: max-height .15s; -} - -#mainmenu ul:not(.active) li.selected > ul, -#mainmenu ul li.active > ul { - max-height: 1000px; - visibility: visible; - transition: max-height .25s; -} - -#mainmenu ul li.mainmenu-item-logout { - margin-top: 15%; -} - -#tabmenu { - padding: 0; - margin: -.5em -.5em .5em -.5em; - background: #bbb; -} - -#tabmenu ul { - border-color: #444; - padding-top: .5em; - flex-wrap: wrap; - background: repeating-linear-gradient(#f5f5f5, #bbb 2.4em, #f5f5f5 2.4em, #bbb); - line-height: 1em; -} - -#tabmenu ul li { - border-color: #444; -} - -#tabmenu ul li.cbi-tab { - background: #f5f5f5; -} - -abbr, -acronym { - font-style: normal; - font-variant: normal; -} - -abbr[title], -acronym[title] { - border-bottom: 1px dotted; - cursor: help; -} - -a:link abbr[title], -a:visited abbr[title], -a:link acronym[title], -a:visited acronym[title] { - cursor: pointer; -} - -code { - font-family: monospace; - white-space: pre; -} - -hr { - margin: .5em 0; - padding: 0; - border: 1px solid #444; - border-width: 0 0 1px 0; -} - -#maincontent ul { - margin-left: 2em; -} - -#modal_overlay { - position: fixed; - top: 0; - bottom: 0; - left: -10000px; - right: 10000px; - background: rgba(0, 0, 0, 0.7); - z-index: 900; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - transition: opacity .125s ease-in; - opacity: 0; - visibility: hidden; -} - -.modal { - width: 90%; - margin: 5em auto !important; - display: flex; - flex-wrap: wrap; - min-height: 32px; - max-width: 600px; - align-items: center; - border-radius: 3px; - background: #f5f5f5; - border: 1px solid #000; - padding: .5em .5em .25em .5em !important; - min-width: 270px; - color: #444; -} - -.modal > * { - flex-basis: 100%; - line-height: normal; - margin-bottom: .5em; -} - -.modal > pre, -.modal > textarea { - white-space: pre-wrap; - overflow: auto; -} - -body.modal-overlay-active { - overflow: hidden; -} - -body.modal-overlay-active #modal_overlay { - left: 0; - right: 0; - opacity: 1; - visibility: visible; -} - -.warning { - color: red; - background-color: white; - font-weight: bold; -} - -.clear { - clear: both; -} - -.skiplink, -.navigation, -.hidden { - position: absolute; - left: -1000px; - top: -1000px; - width: 0px; - height: 0px; - overflow: hidden; - display: inline; -} - -.error { - color: #ff0000; - background-color: white; -} - -.alert-message { - font-weight: normal; - padding: .5em; - border-radius: 3px; - border: 1px solid #a22; - margin: 0 0 .5em 0; -} - -.label { - padding: 1px 2px; - font-size: 10px; - color: #fff; - text-transform: uppercase; - white-space: nowrap; - background-color: #aaa; - border-radius: 3px; -} - -.alert-message, .cbi-tooltip.error, .label.error { - border-color: #a22; - background: #fee; - color: #a22; -} - -.alert-message.notice, .cbi-tooltip.notice, .label.notice { - border-color: #15a; - background: #e6f6ff; - color: #15a; -} - -.alert-message.warning, .cbi-tooltip.warning, .label.warning { - border-color: #ed5; - background: #fe9; - color: #650; -} - -.alert-message.success, .cbi-tooltip.success, .label.success { - border-color: #161; - background: #efe; - color: #161; -} - -div.hostinfo { - float: left; - margin: 0; - padding: 0; - width: auto; - padding: 0.5em; -} - -.lang_he div.hostinfo { - float: right; -} - -#menubar { - position: relative; - width: 100%; - background: #000000; - color: #ffffff; - display: flex; - flex-wrap: wrap; -} - -#menubar .hostinfo, -#indicators, -#modemenu { - flex: 1 1 450px; - display: flex; - align-items: center; -} - -#indicators { - justify-content: flex-end; - flex-wrap: wrap; - margin-right: 1em; -} - -#indicators > *, -#indicators > #xhr_poll_status > * { - flex: 0 0 auto; - display: inline-flex; -} - -#modemenu { - flex: 1 1 auto; - padding: 0; - margin: 0; -} - -#modemenu > * { - padding: .5em; -} - -#menubar .warning { - color: red; - background-color: #557788; -} - -#indicators > #xhr_poll_status, -#indicators > [data-clickable="true"] { - cursor: pointer; -} - -#indicators > :not([id="xhr_poll_status"]), -#indicators > #xhr_poll_status > * { - text-transform: uppercase; - background: #90c0e0 !important; - color: #000 !important; - font-size: 11px; - padding: .125em .5em; - margin: .125em; - border-radius: .6em; -} - -#indicators > [data-style="inactive"], -#indicators > * > #xhr_poll_status_off { - border: 1px solid #90c0e0; - background: #000 !important; - color: #90c0e0 !important; - padding: calc(.125em-1px) calc(.5em-1px); -} - -html #menubar a:link, -html #menubar a:visited { - background: #000000; - color: #ffffff; - text-decoration: none; -} - -html #menubar a:link:hover, -html #menubar a:visited:hover, -html #menubar a:link:active, -html #menubar a:visited:active, -#menubar a:link:focus, -#menubar a:visited:focus { - background: #000000; - color: #ffff00; - font-weight: bold; -} - -html #menubar a:link.active, -html #menubar a:visited.active, -html #menubar a:link.preactive, -html #menubar a:visited.preactive { - background: #000000; - color: #ffff00; - font-weight: bold; -} - -html #menubar a:link.warning, -html #menubar a:visited.warning { - background: #000000; - color: red; - font-weight: bold; -} - -#modemenu { - width: auto; - background: #000000; - color: #ffffff; - list-style: none; - margin-right: 1px; - margin-left: 2em; - float: right; -} - -#modemenu li { - float: right; - list-style: none; -} - -#savemenu { - float: right; -} - -.lang_he #savemenu { - float: left; -} - -.lang_de #submenu_admin_uci { - width: 12em; -} - -.lang_ru #submenu_admin_uci { - width: 11.5em; -} - -textarea#syslog { - width: 98%; - min-height: 500px; - border: 3px solid #cccccc; - padding: 5px; - font-family: monospace; - overflow-y: hidden; -} - -#maincontainer { - clear: both; - width: 96%; - margin: 0 auto; - height:100%; -} - -#maincontent { - padding: 0.5em; - background: #f5f5f5; - color: #000000; - border-width: 0 1px 1px 1px; - border-style: solid; - border-color: #444444; -} - -#applyreboot-section { - margin: 2rem; - line-height: 300%; -} - -.lang_he #maincontent { - direction: rtl; -} - -h2, h3, h4, h5, legend { - font-size: 150%; - font-family: Trebuchet MS, Verdana, sans-serif; - font-weight: bold; - margin: .25em 0 .5em 0; - border-bottom: 1px solid; - padding-bottom: 4px; - display: block; - width: 100%; -} - -h3, legend { - font-size: 125%; -} - -h4 { - font-size: 112%; -} - -h5 { - font-size: 105%; -} - -fieldset { border: none; } -fieldset > legend { float: left; } -fieldset > legend + * { clear: both; } - -p { - margin-bottom: .5em; -} - -.cbi-section { - margin: 0 0 .5em 0; -} - -.cbi-section > h3, -.cbi-section > legend { - margin-top: .5em; -} - -.cbi-section-descr { - margin-bottom: 0.5em; - font-size: 95%; -} - -.cbi-section-descr:empty { - display: none; -} - -.cbi-title-ref { - color: #37c; -} - -.cbi-title-ref::after { - content: "➙"; -} - -ul.cbi-apply { - font-size: 90%; -} - -input:-webkit-input-placeholder { - color: #AAAAAA; -} - -input:-moz-placeholder { - color: #AAAAAA; -} - -input:-ms-input-placeholder { - color: #AAAAAA; -} - -input[type=submit], -input[type=reset], -input[type=image], -input[type=button] { - cursor: pointer; -} - -select, -input, -textarea { - background: #eeeeee; - color: #000000; - border-width: 1px; - border-color: #000000; -} - -input[type=image] { - border: none; -} - -input:focus, -input:not(.btn):not(.cbi-button):hover, -select:focus, -select:hover { - background-color: #ffffff; - color: #000000; -} - -input[type=text], -input[type=password] { - padding: .25em; -} - -select, -input[type=text], -input[type=password], -.cbi-dropdown:not(.btn):not(.cbi-button) { - width: 20em; - height: 22px; - font-family: inherit; - font-size: inherit; -} - -select[multiple] { - height: auto; -} - -input[type=radio], -input[type=checkbox], -[data-dynlist] > input + img, -input.cbi-input-password + img { - vertical-align: middle; -} - -label > input[type="checkbox"], -label > input[type="radio"] { - vertical-align: bottom; - margin: 0; -} - -.td select, -.td .cbi-dropdown, -.td input[type=text], -.cbi-dynlist > .add-item > .cbi-dropdown { - width: 100%; -} - -.td input.cbi-input-password { - width: calc(100% - 20px); -} - -img.cbi-image-button { - cursor: pointer; - margin: 0 2px; - vertical-align: middle; -} - -.btn, .cbi-button, .item::after { - padding: 0 .5em; - border-radius: 3px; - border: 1px solid #aaa; - text-decoration: none; - color: #000; - display: inline-block; - font-size: inherit; - -webkit-appearance: none; - background: #fff; - text-align: center; - font-weight: bold; - line-height: 12px; - min-height: 22px; - line-height: 20px; - box-sizing: border-box; - cursor: pointer; -} - -.btn:hover, .cbi-button:hover, .item:hover::after { - box-shadow: 0 0 3px #37c; -} - -.btn[disabled], -.btn[disabled]:hover, -.cbi-button[disabled], -.cbi-button[disabled]:hover { - opacity: .6; - cursor: default; - pointer-events: none; -} - -.cbi-button-positive, -.cbi-button-fieldadd, -.cbi-button-add, -.cbi-button-save { - border-color: #595; - color: #595; -} - -.cbi-button-neutral, -.cbi-button-reset, -.cbi-button-download, -.cbi-button-find, -.cbi-button-link, -.cbi-button-up, -.cbi-button-down { - border-color: #444; - color: #444; -} - -.cbi-button-action, -.cbi-button-apply, -.cbi-button-reload, -.cbi-button-edit { - border-color: #37c; - color: #37c; -} - -.cbi-button-negative, -.cbi-section-remove .cbi-button, -.cbi-button-remove { - border-color: #a22; - color: #a22; -} - -.cbi-button-action.important, -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit { - color: #fff; - background: #37c; -} - -.cbi-button-positive.important, -.cbi-page-actions .cbi-button-save { - color: #fff; - background: #595; -} - -.cbi-button-negative.important { - color: #fff; - background: #a22; -} - -.cbi-page-actions .cbi-button-apply + .cbi-button-save, -.cbi-page-actions .cbi-button-negative + .cbi-button-save { - background: #fff; - color: #595; -} - -.cbi-input-invalid:not([open]) { - color: #FF0000 !important; - border-color: #FF0000; -} - -table td, table th { - color: #000000; -} - -.table .td, .table .th { - color: #000000; - padding: .25em; -} - -.table.smalltext { - background: #f5f5f5; - color: #000000; - border-top: 1px solid #666666; - border-right: 1px solid #666666; - border-bottom: 1px solid #666666; - font-size: 90%; - width: 80%; - margin-left: auto; - margin-right: auto; - border-collapse: collapse; -} - -.table.smalltext .tr:hover .td { - background-color: #bbddee; - color: #000000; -} - -.table.smalltext .tr .th { - padding: 0 0.25em; - border-left: 1px solid #666666; - text-align: left; -} - -.table.smalltext .tr .td { - padding: 0 0.25em; - border-top: 1px solid #666666; - border-left: 1px solid #666666; -} - -.cbi-rowstyle-1 { - background-color: #eeeeff; - color: #000000; -} - -.cbi-rowstyle-2 { - color: #000000; -} - -.cbi-value { - clear: left; - vertical-align: middle; - padding: 0.25em 0.6em; - border-bottom: 1px dotted #bbbbbb; -} - -.cbi-value:hover { - background: #f8f8f8; - color: #000000; -} - -.cbi-value-title { - float: left; - width: 40%; - line-height: 1.8em; -} - -.cbi-value-field { - width: 58%; - margin-left: 40%; - padding: 0.25em 0; -} - -.td.cbi-value-field { - width: auto; - margin-left: 0; - align-self: center; - vertical-align: middle; -} - -.cbi-value-description { - background-image: url(/luci-static/resources/cbi/help.gif); - background-position: .25em .25em; - background-repeat: no-repeat; - margin: .25em 0 0 0; - padding: .25em .25em .25em 1.75em; -} - -.cbi-section-create { - padding: 0 0 .25em 0; - margin: -3px; - display: inline-flex; - align-items: center; -} - -.cbi-section-create > * { - margin: 3px; - flex: 1 1 auto; -} - -.cbi-section-create > * > input { - width: 100%; -} - -.cbi-section-remove > .cbi-button { - margin-bottom: -1px; - border-radius: 3px 3px 0 0; -} - -.cbi-section-node + .cbi-section-create { - padding-top: 0; -} - -div.cbi-map-descr { - margin-bottom: 1em; -} - -div.cbi-optionals { - padding: 0.25em; - border-bottom: 1px dotted #bbbbbb; -} - -.cbi-section-node { - clear: both; - padding-bottom: 0; - position: relative; - border: 1px dotted #555; - background: #fff; - margin-bottom: .5em; -} - -.cbi-section-node-tabbed { - border-top: none; - margin-top: -.5em; -} - -.cbi-section-node .cbi-value:last-child, -.cbi-section-node .cbi-optionals:last-child { - border-bottom: none; -} - -.table.cbi-section-table { - width: 100%; - font-size: 95%; - border: 1px dotted #444; - background: #fff; - margin: 0 0 .5em 0; -} - -.cbi-section-node > .table.cbi-section-table { - border: none; - margin: 0; -} - -.tr.cbi-section-table-descr .th { - font-weight: normal; - font-size: 90%; - vertical-align: top; -} - -.td.cbi-section-table-optionals { - text-align: left !important; - padding-top: 1em; -} - -.th.cbi-section-actions, -.td.cbi-section-actions { - align-self: center; - vertical-align: middle; -} - -.th.cbi-section-actions > *, -.td.cbi-section-actions > * { - display: flex; - justify-content: flex-end; - flex-direction: row; - flex: 1 1 150px; - margin: auto -1px auto auto; -} - -.td.cbi-section-actions > * > *, -.td.cbi-section-actions > * > form > * { - flex: 1 1 4em; - margin: 0 1px; -} - -.td.cbi-section-actions > * > form { - display: flex; - margin: 0; -} - -.cbi-page-actions { - display: flex; - justify-content: flex-end; - margin: -3px; -} - -.cbi-page-actions > form { - display: flex; -} - -.cbi-page-actions > * { - flex: 0 1 auto; - margin: 3px; -} - -.cbi-page-actions > form > * { - flex: 1; - margin: 0 3px 0 0; -} - -.cbi-page-actions > .cbi-button-save, -.cbi-page-actions > .cbi-button-apply, -.cbi-page-actions > form[method="post"] { - margin-left: auto; -} - -*::-ms-backdrop, -.cbi-page-actions > .cbi-button-save, -.cbi-page-actions > .cbi-button-apply, -.cbi-page-actions > form[method="post"] { - margin-left: 50%; -} - -.cbi-page-actions > .cbi-button-apply + .cbi-button-save, -.cbi-page-actions > .cbi-button-negative + .cbi-button-save, -.cbi-page-actions > .cbi-button-save + form[method="post"], -.cbi-page-actions > form[method="post"] + form[method="post"] { - margin-left: 3px; -} - -.th[data-widget="button"], .td[data-widget="button"], -.th[data-widget="fvalue"], .td[data-widget="fvalue"] { - flex: 1 1 2em; - text-align: center; -} - -#cbi-network-switch_vlan .th, -#cbi-network-switch_vlan .td { - flex-basis: 12%; -} - -.td[data-title]::before { - content: attr(data-title) ":\20"; - font-weight: bold; - text-align: left; - display: none; - padding: 1px 0; - white-space: nowrap; -} - -.td[data-description]::after { - content: attr(data-description); - font-size: 90%; - text-align: left; - display: none; - background: url(/luci-static/resources/cbi/help.gif) left top no-repeat; - padding: .125em 0 .125em 18px; - margin: .125em 0; -} - -.tr.placeholder .td[data-title]::before, -.tr.placeholder .td[data-description]::after { - display: none; -} - -.tr[data-title]::before, -.tr.cbi-section-table-titles.named::before { - content: attr(data-title) "\20"; - font-weight: bold; - text-align: left; - display: table-cell; - align-self: center; - flex: 1 1 5%; - padding: .25em; - white-space: normal; - word-wrap: break-word; - vertical-align: middle; -} - -.cbi-value-helpicon img { - vertical-align: bottom; -} - -.td.cbi-value-error { - border-color: red; -} - -.cbi-value-error input, -.cbi-value-error select { - color: red; - background-color: #ffcccc; -} - -.cbi-section-error { - color: red; - background-color: white; - font-size: 95%; - border: 1px dotted red; - margin: 3px; - padding: 3px; -} - -.cbi-value-field var { - color: #2222FF; -} - -ul.cbi-tabmenu { - list-style-type: none; - display: flex; - margin: 0 0 .5em 0 !important; - padding: 0 0 0 5px; - border-bottom: 1px solid #bbb; -} - -#tabmenu > ul.cbi-tabmenu { - margin: 0 !important; -} - -ul.cbi-tabmenu li { - display: inline-flex; - margin: 0 5px -1px 0; - flex: 0 1 auto; - border: 1px solid #bbb; - border-bottom: none; - border-radius: 3px 3px 0 0; - background: linear-gradient(#ddd 90%, #aaa 100%); - color: #888; - overflow: hidden; - text-overflow: ellipsis; - word-wrap: break-word; -} - -ul.cbi-tabmenu li a, -ul.cbi-tabmenu li a:hover { - text-decoration: none; - color: inherit; - padding: 5px; - flex: 1 1 auto; - width: 100%; - height: 100%; - outline: none; -} - -ul.cbi-tabmenu li.cbi-tab { - color: #000; - background: #f5f5f5; -} - -ul.cbi-tabmenu li.cbi-tab-disabled[data-errors]::after { - content: attr(data-errors); - background: #c43c35; - color: #fff; - min-width: 12px; - line-height: 14px; - border-radius: 8px; - text-align: center; - margin: 4px 5px 4px 0; - padding: 1px 2px; - word-wrap: normal; - flex: 1 0 auto; -} - -.cbi-section ul.cbi-tabmenu li.cbi-tab { - background: #fff; -} - -.cbi-tab-descr { - background-image: url(/luci-static/resources/cbi/help.gif); - background-position: .25em 50%; - background-repeat: no-repeat; - border-bottom: 1px solid #ccc; - margin: 0 .25em .25em .25em; - padding: .5em .5em .5em 2em; -} - -[data-tab-title] { - height: 0; - opacity: 0; - overflow: hidden; -} - -[data-tab-active="true"] { - opacity: 1; - height: auto; - overflow: visible; - transition: opacity .25s ease-in; -} - - -.cbi-dropdown { - border: 1px inset #000; - display: inline-flex; - cursor: pointer; - background: #eee; - position: relative; - padding: 0; - color: #000; - max-width: 100%; -} - -.cbi-dropdown:not(.btn):not(.cbi-button) { - min-width: 20em; -} - -.cbi-dropdown:not(.btn):not(.cbi-button):hover { - background: #fff; -} - -.cbi-dropdown:focus, -.cbi-dynlist > .item:focus { - outline: 2px solid #4b6e9b; -} - -.cbi-dropdown > ul { - margin: 0 !important; - padding: 0; - list-style: none; - overflow-x: hidden; - overflow-y: auto; - display: flex; - width: 100%; -} - -.cbi-dropdown > ul.preview { - display: none; -} - -.cbi-dropdown > .open { - border: 2px outset #eee; - flex-basis: 15px; -} - -.cbi-dropdown > .open, -.cbi-dropdown > .more { - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - padding: 0 .25em; -} - -.cbi-dropdown > .more, -.cbi-dropdown > ul > li[placeholder] { - color: #777; - font-weight: bold; - text-shadow: 1px 1px 0px #fff; - display: none; - min-height: 22px; -} - -.cbi-dropdown > ul > li { - display: none; - padding: .25em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 1; - flex-grow: 1; - align-items: center; - align-self: center; - min-height: 22px; -} - -.cbi-dropdown > ul > li .hide-open { display: initial; } -.cbi-dropdown > ul > li .hide-close { display: none; } - -.cbi-dropdown > ul > li[display]:not([display="0"]) { - border-left: 1px solid #ccc; -} - -.cbi-dropdown[empty] > ul { - max-width: 1px; -} - -.cbi-dropdown > ul > li > form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown > ul > li img { - vertical-align: middle; - margin-right: .25em; -} - -.cbi-dropdown > ul > li > form > input[type="checkbox"] { - margin: 0; -} - -.cbi-dropdown[open] { - position: relative; -} - -.cbi-dropdown[open] > ul.dropdown { - display: block; - background: #f6f6f5; - border: 1px solid #918e8c; - box-shadow: 0 0 4px #918e8c; - position: absolute; - z-index: 1100; - max-width: none; - min-width: 100%; - width: auto; - transition: max-height .125s ease-in; -} - -.cbi-dropdown > ul > li[display], -.cbi-dropdown[open] > ul.preview, -.cbi-dropdown[open] > ul.dropdown > li, -.cbi-dropdown[multiple] > ul > li > label, -.cbi-dropdown[multiple][open] > ul.dropdown > li, -.cbi-dropdown[multiple][more] > .more, -.cbi-dropdown[multiple][empty] > .more { - flex-grow: 1; - display: flex; - align-items: center; -} - -.cbi-dropdown[empty] > ul > li, -.cbi-dropdown[multiple][open] > ul.dropdown > li > form { - display: block; -} - -.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } -.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: initial; } - -.cbi-dropdown[open] > ul.dropdown > li { - border-bottom: 1px solid #ccc; -} - -.cbi-dropdown[open] > ul.dropdown > li[selected] { - background: #b0d0f0; -} - -.cbi-dropdown[open] > ul.dropdown > li.focus { - background: linear-gradient(90deg, #a3c2e8 0%, #84aad9 100%); -} - -.cbi-dropdown[open] > ul.dropdown > li { - color: #444; -} - -.cbi-dropdown[open] > ul.dropdown > li:last-child { - margin-bottom: 0; - border-bottom: none; -} - -.cbi-dropdown[open] > ul.dropdown > li[unselectable] { - opacity: 0.7; -} - -.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { - width: 100%; -} - -.cbi-dropdown[disabled] { - pointer-events: none; - opacity: .6; -} - -.cbi-dynlist { - height: auto; - min-height: 30px; - min-width: 210px; - max-width: 100%; - width: auto; - display: inline-flex; - flex-direction: column; -} - -.cbi-dynlist > .item { - margin-bottom: 4px; - background: #eee; - padding: 2px 2em 2px 4px; - border: 1px outset #000; - border-radius: 3px; - position: relative; - pointer-events: none; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.cbi-dynlist > .item::after { - content: "×"; - position: absolute; - display: inline-flex; - align-items: center; - top: -1px; - right: -1px; - bottom: -1px; - padding: 0 6px; - border: 1px outset #000; - background: #fff; - border-radius: 0 3px 3px 0; - font-weight: bold; - color: #c44; - pointer-events: auto; - height: auto; -} - -.cbi-dynlist > .add-item { - display: flex; -} - -.cbi-dynlist > .add-item > input { - flex: 1 1 auto; -} - -input[type="text"] + .cbi-button, -input[type="password"] + .cbi-button, -select + .cbi-button { - border-radius: 0 3px 3px 0; - border: 1px outset #000; - margin: 0 0 0 -2px; - padding: 0 6px; - vertical-align: top; - display: inline-block; - height: 22px; - font-size: 12px; - line-height: 20px; -} - -.cbi-tooltip-container { - cursor: help; -} - -.cbi-tooltip { - position: absolute; - z-index: 1000; - left: -1000px; - border-radius: 3px; - background: #fff; - padding: 2px 5px; - white-space: pre; - opacity: 0; - transition: opacity .25s ease-out; - pointer-events: none; - box-shadow: 0 0 2px #444; - color: #444; -} - -.cbi-tooltip-container:hover .cbi-tooltip { - left: auto; - opacity: 1; - transition: opacity .25s ease-in; - white-space: normal; -} - -.cbi-progressbar { - background: #ddd; - border: 1px solid #bbb; - border-radius: 3px; - position: relative; - min-width: 170px; - height: 20px; - margin: 4px 0; - line-height: 20px; -} - -.cbi-progressbar > div { - background: #90c0e0; - height: 100%; - transition: width .25s ease-in; - width: 0%; -} - -.cbi-progressbar::after { - position: absolute; - bottom: 0; - top: 0; - right: 0; - left: 0; - text-align: center; - text-shadow: 0 0 2px #fff; - content: attr(title); - white-space: pre; - overflow: hidden; - text-overflow: ellipsis; -} - - -.zonebadge .cbi-tooltip { - padding: 1px; - background: inherit; - margin: -1.6em 0 0 -5px; -} - - -.zone-forwards { - display: flex; - flex-wrap: wrap; -} - -.zone-forwards > * { - flex: 1 1 45%; - padding: 1px; -} - -.zone-forwards > span { - flex-basis: 10%; - text-align: center; -} - -.zone-forwards .zone-src, -.zone-forwards .zone-dest { - display: flex; - flex-direction: column; -} - - -.left, .left::before, .left::after { text-align: left !important; } -.right, .right::before, .right::after { text-align: right !important; } -.center, .center::before, .center::after { text-align: center !important; } - -.top, .top::before, .top::after { vertical-align: top !important; } -.middle, .middle::before, .middle::after { vertical-align: middle !important; } -.bottom, .bottom::before, .bottom::after { vertical-align: bottom !important; } - -.td.top { align-self: flex-start; vertical-align: top; } -.td.middle { align-self: center; vertical-align: middle; } -.td.bottom { align-self: flex-end; vertical-align: bottom; } - -.luci { - position: absolute; - bottom: 0; - left: 1em; - height: 1.5em; - font-size: 80%; - margin-bottom: 0; -} - -.luci a:link, -.luci a:visited { - background-color: transparent; - color: #666666; - text-decoration: none; - font-size: 70%; -} - -.inline { - display: inline; -} - -.error500 { - white-space: normal; - border: 1px dotted #ff0000; - background-color: #ffffff; - color: #000000; - padding: 0.5em; -} - - -.ifacebadge, .ifacebox { - display: inline-flex; - align-content: center; - border: 1px solid #ccc; - border-radius: 3px; - padding: 2px; - background: #fff; -} - -.ifacebox-head { - background: #eee; -} - -.ifacebox-head.active { - background: #90c0e0; -} - -.ifacebadge, .zonebadge { - align-items: center; -} - -.ifacebadge > * { - align-self: center; -} - -.ifacebadge > img, -.ifacebadge > em { - margin-right: 5px; - display: inline-block; - height: 16px; -} - -.ifacebadge-active { - border-color: #000000; - font-weight: bold; -} - -.ifacebox { - flex-direction: column; - margin: 0; - padding: 0; - min-width: 100px; - text-align: center; -} - -.ifacebox > * { - padding: 2px; -} - -.td > .ifacebadge, -.td > .zonebadge { - margin: 0; - vertical-align: top; -} - -.network-status-table { - display: flex; - flex-wrap: wrap; - margin: -.25em -.25em .25em -.25em; -} - -.network-status-table .ifacebox { - margin: .25em; - font-size: 90%; - flex-grow: 1; -} - -.network-status-table .ifacebox-body { - display: flex; - flex-direction: column; - flex: 1 0 auto; - padding: .5em; -} - -.network-status-table .ifacebox-body > span { - flex: 10 10 auto; -} - -.network-status-table .ifacebox-body > div { - display: flex; - flex-wrap: wrap; -} - -.ifacebadge.large, -.network-status-table .ifacebox-body .ifacebadge { - flex: 1; - -webkit-flex: 1 1 auto; - padding: .5em; - min-width: 220px; - white-space: nowrap; -} - -.network-status-table .ifacebox-body .ifacebadge { - margin: .5em 0 0 0; -} - -#dsl_status_table .ifacebox-body span > strong { - display: inline-block; - min-width: 35%; -} - - -.zonebadge { - padding: 2px; - display: inline-block; - white-space: nowrap; - border-radius: 3px; -} - -.zonebadge > em, -.zonebadge > strong { - margin: 3px; -} - -.zonebadge input { - width: 6em; - height: 1.5em; -} - -.zonebadge .ifacebadge, -.cbi-dropdown .ifacebadge { - margin: 1px; -} - -.zonebadge .ifacebadge img, -.zonebadge .ifacebadge em, -.cbi-dropdown .ifacebadge img, -.cbi-dropdown .ifacebadge em { - margin: 0 1px; -} - -.zonebadge-empty { - border: 1px dashed #AAAAAA; - color: #AAAAAA; - font-style: italic; - font-size: smaller; -} - - -.uci-change-list { - font-family: monospace; - white-space: pre; -} - -.uci-change-list del, -.uci-change-list ins, -.uci-change-list var, -.uci-change-legend-label del, -.uci-change-legend-label ins, -.uci-change-legend-label var { - text-decoration: none; - font-style: normal; - border: 1px solid #ccc; - background: #eee; - padding: 2px; - display: block; - line-height: 15px; - margin-bottom: 1px; -} - -.uci-change-list ins, -.uci-change-legend-label ins { - border-color: #0f0; - background: #cfc; -} - -.uci-change-list del, -.uci-change-legend-label del { - border-color: #f00; - background: #fcc; -} - -.uci-change-list var, -.uci-change-legend-label var { - border-color: #ccc; - background: #eee; -} - -.uci-change-list var ins, -.uci-change-list var del { - display: inline-block; - border: none; - width: 100%; - padding: 0; -} - -.uci-change-legend { - padding: 5px; -} - -.uci-change-legend-label { - width: 150px; - float: left; - font-size: 80%; -} - -.uci-change-legend-label>ins, -.uci-change-legend-label>del, -.uci-change-legend-label>var { - float: left; - margin-right: 4px; - width: 12px; - height: 12px; - display: block; - position: relative; -} - -.uci-change-legend-label var ins, -.uci-change-legend-label var del { - border: none; - position: absolute; - top: 1px; - left: 1px; - right: 1px; - bottom: 1px; -} - - -@keyframes flash { - 0% { opacity: 1; } - 50% { opacity: .5; } - 100% { opacity: 1; } -} - -.flash { - animation: flash .35s; -} - -.spinning { - position: relative; - padding-left: 32px !important; -} - -.spinning::before { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 32px; - content: " "; - background: url(../resources/icons/loading.gif) no-repeat center; - background-size: 16px; -} - -} - -@media screen and (max-width: 992px) { - body { - -webkit-text-size-adjust: 100%; - } - - #maincontainer { - flex-direction: column; - width: 100%; - } - - #maincontent { - width: 96%; - margin: auto; - flex-basis: auto; - } - - #mainmenu { - border: none; - border-radius: 0; - max-width: none; - background: #000; - box-shadow: 0 0 2px #444; - padding: 0; - border-top: 1px solid #444; - position: relative; - } - - #mainmenu ul > li.selected > a { - background: #444; - color: #fff; - border-top: none; - } - - #mainmenu ul > li.selected:not(.active) > ul { - max-height: 0; - visibility: hidden; - } - - #mainmenu ul > li > a { - flex: 1 1 auto; - color: #fff; - border: 1px solid #444; - border-width: 0 0 1px 1px; - } - - #mainmenu ul.l1 { - display: flex; - flex-direction: row; - flex-wrap: wrap; - position: relative; - margin-left: -1px; - width: 100%; - } - - #mainmenu ul.l1 > li { - display: inline-flex; - flex: 1 1 auto; - position: relative; - height: 2em; - } - - #mainmenu ul.l1 ul.l2 { - position: absolute; - top: 2em; - right: 0; - z-index: 1000; - background: #000; - box-shadow: 0 0 2px #444; - min-width: 120px; - display: block; - } - - #mainmenu ul.l1 ul.l2.align-left { - right: auto; - left: 0; - } - - #mainmenu ul.l2 > li { - display: block; - } - - #mainmenu ul.l2 > li > a { - padding: .5em; - } - - #mainmenu ul li.mainmenu-item-logout { - margin-top: 0; - margin-left: auto; - } - - #mainmenu ul li.mainmenu-item-logout::before { - content: "\0a"; - flex: 10; - border: 1px solid #444; - border-width: 0 0 1px 1px; - } - - .table { - display: flex; - flex-direction: column; - width: 100%; - } - - .tr { - display: flex; - flex-direction: row; - flex-wrap: wrap; - align-items: flex-end; - } - - .th, .td { - flex: 2 2 25%; - align-self: flex-start; - overflow: hidden; - text-overflow: ellipsis; - word-wrap: break-word; - display: inline-block; - } - - .td.cbi-dropdown-open { - overflow: visible; - } - - .td select { - word-wrap: normal; - } - - .td[data-widget="button"], - .td[data-widget="fvalue"] { - flex: 1 1 12.5%; - text-align: left; - } - - .td.cbi-value-field { - align-self: flex-start; - } - - .td.cbi-value-field .cbi-button { - width: 100%; - } - - .table.cbi-section-table { - border: none; - background: none; - margin: 0; - } - - .tr.table-titles, - .cbi-section-table-titles, - .cbi-section-table-descr { - display: none; - } - - .cbi-section-table-row { - display: flex; - flex-direction: row; - flex-wrap: wrap; - border: 1px dotted #444; - margin: 0 0 .5em 0; - background: #fff; - } - - .cbi-section-table-row:hover { - border: 1px solid #4a6b7c; - } - - .cbi-section-table + .cbi-section-create { - padding-top: 0; - } - - .tr[data-title]::before { - display: block; - flex: 1 1 100%; - background: #eef; - } - - .td[data-title]::before, - .td[data-description]::after { - display: block; - } - - .td[data-title] ~ .td.cbi-section-actions { - align-self: flex-start; - } - - .td[data-title] ~ .td.cbi-section-actions::before { - display: block; - content: "\a0"; - } - - .hide-sm, - .hide-xs { - display: none; - } - - #dsl_status_table .ifacebox-body > span > strong { - min-width: 50%; - } -} - -@media screen and (max-width: 480px) { - body { - font-size: 16px; - } - - input, textarea, select, .cbi-button, .cbi-dropdown { - font-size: 16px !important; - line-height: 30px; - } - - select, input[type="text"], input[type="password"] { - width: 100%; - height: 30px; - border-radius: 3px; - } - - input[type="text"] + .cbi-button, - input[type="password"] + .cbi-button, - select + .cbi-button { - height: 30px; - line-height: 30px; - margin-left: -5px; - min-width: 30px; - } - - input.cbi-input-password, - [data-dynlist] > .add-item > input { - width: calc(100% - 25px); - } - - .label { - font-size: 14px; - } - - .cbi-dynlist, - .cbi-dropdown { - min-width: 100%; - height: auto; - display: flex; - } - - .cbi-dropdown > .more, - .cbi-dropdown > ul > li, - .cbi-dropdown > ul > li[placeholder] { - min-height: 30px; - } - - .btn, .cbi-button { - font-size: 16px !important; - line-height: 30px; - height: 30px; - overflow: hidden; - text-overflow: ellipsis; - } - - #maincontent { - padding: .25em; - } - - #tabmenu { - margin: -.25em -.25em 1em -.25em; - } - - .th, .td { - flex: 2 2 50%; - } - - .td.cbi-value-field { - flex-basis: 100%; - } - - .td.cbi-value-field[data-widget="dvalue"] { - flex-basis: 50%; - } - - .td.cbi-value-field[data-widget="button"], - .td.cbi-value-field[data-widget="fvalue"] { - flex-basis: 25%; - text-align: left; - } - - .cbi-value-title { - float: none; - font-weight: bold; - } - - .cbi-value-field { - width: 100%; - margin: 0; - } - - .cbi-value-description { - margin-top: 5px; - display: block; - } - - .cbi-section-create { - margin-bottom: 1em; - } - - .cbi-page-actions { - flex-wrap: wrap; - margin: -2px; - } - - .cbi-page-actions > .cbi-button-link { - flex-basis: 100%; - margin-right: 2px; - } - - .cbi-page-actions > * { - flex: 1 1 auto; - margin: 2px; - } - - ul.cbi-tabmenu { - padding: 0 3px; - } - - .hide-xs { - display: none; - } - - #cbi-network .td[id] > strong { - display: block; - } - - #cbi-network-switch_vlan .td.cbi-section-actions { - flex-basis: 100%; - } - - #dsl_status_table .ifacebox-body > span > strong { - display: block; - width: 100%; - margin-top: .5em; - } - - #cbi-firewall-rule .td[data-widget="fvalue"], - #cbi-firewall-redirect .td[data-widget="fvalue"] { - display: none; - } -} diff --git a/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png b/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png deleted file mode 100644 index 5c9d03018882de9bb92f2d708bcd93b671beaa03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O0VEi%{+3=0q{Ka4978H@CI2|}MV$T5;V=9L d*(U#Y&|%1xk+@qLpJ4-1>gnp|vd$@?2>=7W7QX-h diff --git a/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js b/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js deleted file mode 100644 index ca97838d3..000000000 --- a/luci-theme-openwrt/htdocs/luci-static/resources/menu-openwrt.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; -'require baseclass'; -'require ui'; - -return baseclass.extend({ - __init__: function() { - ui.menu.load().then(L.bind(this.render, this)); - }, - - render: function(tree) { - var node = tree, - url = ''; - - this.renderModeMenu(tree); - - if (L.env.dispatchpath.length >= 3) { - for (var i = 0; i < 3 && node; i++) { - node = node.children[L.env.dispatchpath[i]]; - url = url + (url ? '/' : '') + L.env.dispatchpath[i]; - } - - if (node) - this.renderTabMenu(node, url); - } - }, - - handleMenuExpand: function(ev) { - var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling; - - document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) { - if (li !== a.parentNode) - li.classList.remove('active'); - }); - - if (!ul2) - return; - - if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth) - ul2.classList.add('align-left'); - - ul1.classList.add('active'); - a.parentNode.classList.add('active'); - a.blur(); - - ev.preventDefault(); - ev.stopPropagation(); - }, - - renderMainMenu: function(tree, url, level) { - var l = (level || 0) + 1, - ul = E('ul', { 'class': 'mainmenu l%d'.format(l) }), - children = ui.menu.getChildren(tree); - - if (children.length == 0 || l > 2) - return E([]); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[l] == children[i].name), - activeClass = 'mainmenu-item-%s%s'.format(children[i].name, isActive ? ' selected' : ''); - - ul.appendChild(E('li', { 'class': activeClass }, [ - E('a', { - 'href': L.url(url, children[i].name), - 'click': (l == 1) ? this.handleMenuExpand : null, - }, [ _(children[i].title) ]), - this.renderMainMenu(children[i], url + '/' + children[i].name, l) - ])); - } - - if (l == 1) { - var container = document.querySelector('#mainmenu'); - - container.appendChild(ul); - container.style.display = ''; - } - - return ul; - }, - - renderModeMenu: function(tree) { - var ul = document.querySelector('#modemenu'), - children = ui.menu.getChildren(tree); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); - - ul.appendChild(E('li', {}, [ - E('a', { - 'href': L.url(children[i].name), - 'class': isActive ? 'active' : null - }, [ _(children[i].title) ]) - ])); - - if (isActive) - this.renderMainMenu(children[i], children[i].name); - } - - if (ul.children.length > 1) - ul.style.display = ''; - }, - - renderTabMenu: function(tree, url, level) { - var container = document.querySelector('#tabmenu'), - l = (level || 0) + 1, - ul = E('ul', { 'class': 'cbi-tabmenu' }), - children = ui.menu.getChildren(tree), - activeNode = null; - - if (children.length == 0) - return E([]); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[l + 2] == children[i].name), - activeClass = isActive ? ' cbi-tab' : '', - className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); - - ul.appendChild(E('li', { 'class': className }, [ - E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] ) - ])); - - if (isActive) - activeNode = children[i]; - } - - container.appendChild(ul); - container.style.display = ''; - - if (activeNode) - container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l)); - - return ul; - } -}); diff --git a/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm b/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm deleted file mode 100644 index 356b6dac1..000000000 --- a/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm +++ /dev/null @@ -1,19 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -
-
-
- -

- <% local ver = require "luci.version" -%> - Powered by <%= ver.luciname %> (<%= ver.luciversion %>) -

- - - - - diff --git a/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm deleted file mode 100644 index 1d95bae88..000000000 --- a/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm +++ /dev/null @@ -1,95 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2010 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - local ver = require "luci.version" - - local sysinfo = util.ubus("system", "info") or { } - local loadinfo = sysinfo.load or { 0, 0, 0 } - local boardinfo = util.ubus("system", "board") or { } - - local node = disp.context.dispatched - - http.prepare_content("application/xhtml+xml") --%> - - - - - - - - - -<% if node and node.css then %> -<% end -%> -<% if css then %> -<% end -%> - - - -<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI - -"> - - - - - -
- - -
- - - - - <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> -
-

<%:No password set!%>

-

<%:There is no password set on this router. Please configure a root password to protect the web interface.%>

- <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
- <%- end -%> - - <%- if boardinfo.rootfs_type == "initramfs" then -%> -
-

<%:System running in recovery (initramfs) mode.%>

-

<%:No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade%>

- <% if disp.lookup("admin/system/flash") then %> - - <% end %> -
- <%- end -%> diff --git a/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt b/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt deleted file mode 100755 index 7ee8c193d..000000000 --- a/luci-theme-openwrt/root/etc/uci-defaults/30_luci-theme-openwrt +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -if [ "$PKG_UPGRADE" != 1 ]; then - uci get luci.themes.OpenWrt >/dev/null 2>&1 || \ - uci batch <<-EOF - set luci.themes.OpenWrt=/luci-static/openwrt.org - set luci.main.mediaurlbase=/luci-static/openwrt.org - commit luci - EOF -fi - -exit 0 From 0b87211f9ad7d07b4f6e86ab8d5698292809cf11 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 07:46:40 +0800 Subject: [PATCH 19/73] afixfix --- luci-app-cpufreq/Makefile | 16 - .../luasrc/controller/cpufreq.lua | 11 - luci-app-cpufreq/luasrc/model/cbi/cpufreq.lua | 68 - luci-app-cpufreq/po/zh-cn/cpufreq.po | 32 - luci-app-cpufreq/root/etc/config/cpufreq | 3 - luci-app-cpufreq/root/etc/init.d/cpufreq | 27 - .../root/etc/uci-defaults/10-cpufreq | 104 - .../share/rpcd/acl.d/luci-app-cpufreq.json | 11 - luci-base/po/oc/base.po | 7620 ----------------- luci-base/po/templates/base.pot | 7611 ---------------- luci-theme-bootstrap/Makefile | 26 - luci-theme-openwrt-2020/Makefile | 22 - .../GalanoGrotesqueW00-Regular.woff2 | Bin 29004 -> 0 bytes .../luci-static/openwrt2020/cascade.css | 1943 ----- .../htdocs/luci-static/openwrt2020/logo.png | Bin 3896 -> 0 bytes .../htdocs/luci-static/openwrt2020/logo.svg | 7 - .../luci-static/openwrt2020/spinner.svg | 12 - .../luci-static/resources/menu-openwrt2020.js | 147 - .../uci-defaults/30_luci-theme-openwrt-2020 | 12 - .../template/themes/openwrt2020/footer.ut | 16 - .../template/themes/openwrt2020/header.ut | 72 - luci-theme-openwrt/Makefile | 22 - 22 files changed, 17782 deletions(-) delete mode 100755 luci-app-cpufreq/Makefile delete mode 100755 luci-app-cpufreq/luasrc/controller/cpufreq.lua delete mode 100755 luci-app-cpufreq/luasrc/model/cbi/cpufreq.lua delete mode 100755 luci-app-cpufreq/po/zh-cn/cpufreq.po delete mode 100755 luci-app-cpufreq/root/etc/config/cpufreq delete mode 100755 luci-app-cpufreq/root/etc/init.d/cpufreq delete mode 100755 luci-app-cpufreq/root/etc/uci-defaults/10-cpufreq delete mode 100755 luci-app-cpufreq/root/usr/share/rpcd/acl.d/luci-app-cpufreq.json delete mode 100755 luci-base/po/oc/base.po delete mode 100755 luci-base/po/templates/base.pot delete mode 100644 luci-theme-bootstrap/Makefile delete mode 100644 luci-theme-openwrt-2020/Makefile delete mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 delete mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css delete mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.png delete mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.svg delete mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg delete mode 100644 luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js delete mode 100755 luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 delete mode 100644 luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut delete mode 100644 luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut delete mode 100644 luci-theme-openwrt/Makefile diff --git a/luci-app-cpufreq/Makefile b/luci-app-cpufreq/Makefile deleted file mode 100755 index b85e91d22..000000000 --- a/luci-app-cpufreq/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-only -# -# Copyright (C) 2021 ImmortalWrt.org - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI for CPU Freq Setting -LUCI_DEPENDS:=@(arm||aarch64) - -PKG_NAME:=luci-app-cpufreq -PKG_VERSION:=1 -PKG_RELEASE:=$(COMMITCOUNT) - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-cpufreq/luasrc/controller/cpufreq.lua b/luci-app-cpufreq/luasrc/controller/cpufreq.lua deleted file mode 100755 index 2bf7a5686..000000000 --- a/luci-app-cpufreq/luasrc/controller/cpufreq.lua +++ /dev/null @@ -1,11 +0,0 @@ -module("luci.controller.cpufreq", package.seeall) - -function index() - if not nixio.fs.access("/etc/config/cpufreq") then - return - end - - local page = entry({"admin", "system", "cpufreq"}, cbi("cpufreq"), _("CPU Freq"), 90) - page.dependent = false - page.acl_depends = { "luci-app-cpufreq" } -end diff --git a/luci-app-cpufreq/luasrc/model/cbi/cpufreq.lua b/luci-app-cpufreq/luasrc/model/cbi/cpufreq.lua deleted file mode 100755 index febb7ad90..000000000 --- a/luci-app-cpufreq/luasrc/model/cbi/cpufreq.lua +++ /dev/null @@ -1,68 +0,0 @@ -local fs = require "nixio.fs" - -function string.split(input, delimiter) - input = tostring(input) - delimiter = tostring(delimiter) - if (delimiter=='') then return false end - local pos,arr = 0, {} - for st,sp in function() return string.find(input, delimiter, pos, true) end do - table.insert(arr, string.sub(input, pos, st - 1)) - pos = sp + 1 - end - table.insert(arr, string.sub(input, pos)) - return arr -end - -mp = Map("cpufreq", translate("CPU Freq Settings")) -mp.description = translate("Set CPU Scaling Governor to Max Performance or Balance Mode") - -s = mp:section(NamedSection, "cpufreq", "settings") -s.anonymouse = true - -local policy_nums = luci.sys.exec("echo -n $(find /sys/devices/system/cpu/cpufreq/policy* -maxdepth 0 | grep -Eo '[0-9]+')") -for _, policy_num in ipairs(string.split(policy_nums, " ")) do - if not fs.access("/sys/devices/system/cpu/cpufreq/policy" .. policy_num .. "/scaling_available_frequencies") then return end - - cpu_freqs = fs.readfile("/sys/devices/system/cpu/cpufreq/policy" .. policy_num .. "/scaling_available_frequencies") - cpu_freqs = string.sub(cpu_freqs, 1, -3) - - cpu_governors = fs.readfile("/sys/devices/system/cpu/cpufreq/policy" .. policy_num .. "/scaling_available_governors") - cpu_governors = string.sub(cpu_governors, 1, -3) - - - freq_array = string.split(cpu_freqs, " ") - governor_array = string.split(cpu_governors, " ") - - s:tab(policy_num, translate("Policy " .. policy_num)) - - governor = s:taboption(policy_num, ListValue, "governor" .. policy_num, translate("CPU Scaling Governor")) - for _, e in ipairs(governor_array) do - if e ~= "" then governor:value(e, translate(e, string.upper(e))) end - end - - minfreq = s:taboption(policy_num, ListValue, "minfreq" .. policy_num, translate("Min Idle CPU Freq")) - for _, e in ipairs(freq_array) do - if e ~= "" then minfreq:value(e) end - end - - maxfreq = s:taboption(policy_num, ListValue, "maxfreq" .. policy_num, translate("Max Turbo Boost CPU Freq")) - for _, e in ipairs(freq_array) do - if e ~= "" then maxfreq:value(e) end - end - - sdfactor = s:taboption(policy_num, Value, "sdfactor" .. policy_num, translate("CPU Switching Sampling rate")) - sdfactor.datatype="range(1,100000)" - sdfactor.description = translate("The sampling rate determines how frequently the governor checks to tune the CPU (ms)") - sdfactor.placeholder = 10 - sdfactor.default = 10 - sdfactor:depends("governor" .. policy_num, "ondemand") - - upthreshold = s:taboption(policy_num, Value, "upthreshold" .. policy_num, translate("CPU Switching Threshold")) - upthreshold.datatype="range(1,99)" - upthreshold.description = translate("Kernel make a decision on whether it should increase the frequency (%)") - upthreshold.placeholder = 50 - upthreshold.default = 50 - upthreshold:depends("governor" .. policy_num, "ondemand") -end - -return mp diff --git a/luci-app-cpufreq/po/zh-cn/cpufreq.po b/luci-app-cpufreq/po/zh-cn/cpufreq.po deleted file mode 100755 index bd818d774..000000000 --- a/luci-app-cpufreq/po/zh-cn/cpufreq.po +++ /dev/null @@ -1,32 +0,0 @@ -msgid "CPU Freq" -msgstr "CPU 性能优化调节" - -msgid "CPU Freq Settings" -msgstr "CPU 性能优化调节设置" - -msgid "Set CPU Scaling Governor to Max Performance or Balance Mode" -msgstr "设置路由器的 CPU 性能模式(高性能/均衡省电)" - -msgid "CPU Scaling Governor" -msgstr "CPU 工作模式" - -msgid "CPU Freq from 48000 to 716000 (Khz)" -msgstr "CPU 频率范围为 48000 到 716000 (Khz)" - -msgid "Min Idle CPU Freq" -msgstr "待机 CPU 最小频率" - -msgid "Max Turbo Boost CPU Freq" -msgstr "最大 Turbo Boost CPU 频率" - -msgid "CPU Switching Sampling rate" -msgstr "CPU 切换周期" - -msgid "The sampling rate determines how frequently the governor checks to tune the CPU (ms)" -msgstr "CPU 检查切换的周期 (ms)。注意:过于频繁的切换频率会引起网络延迟抖动" - -msgid "CPU Switching Threshold" -msgstr "CPU 切换频率触发阈值" - -msgid "Kernel make a decision on whether it should increase the frequency (%)" -msgstr "当 CPU 占用率超过 (%) 的情况下触发内核切换频率" diff --git a/luci-app-cpufreq/root/etc/config/cpufreq b/luci-app-cpufreq/root/etc/config/cpufreq deleted file mode 100755 index 5c2c070e9..000000000 --- a/luci-app-cpufreq/root/etc/config/cpufreq +++ /dev/null @@ -1,3 +0,0 @@ - -config settings 'cpufreq' - diff --git a/luci-app-cpufreq/root/etc/init.d/cpufreq b/luci-app-cpufreq/root/etc/init.d/cpufreq deleted file mode 100755 index 4dda93bc7..000000000 --- a/luci-app-cpufreq/root/etc/init.d/cpufreq +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh /etc/rc.common -START=15 - -NAME="cpufreq" - -config_get_cpufreq() -{ - config_get "$NAME" "$1" -} - -start() -{ - config_load "$NAME" - - for i in $(find /sys/devices/system/cpu/cpufreq/policy* -maxdepth 0 | grep -Eo '[0-9]+') - do - [ -z "$(config_get_cpufreq "governor$i")" ] && return - - config_get_cpufreq "governor$i" > "/sys/devices/system/cpu/cpufreq/policy$i/scaling_governor" - config_get_cpufreq "minfreq$i" > "/sys/devices/system/cpu/cpufreq/policy$i/scaling_min_freq" - config_get_cpufreq "maxfreq$i" > "/sys/devices/system/cpu/cpufreq/policy$i/scaling_max_freq" - if [ "$(config_get_cpufreq "governor$i")" = "ondemand" ]; then - config_get_cpufreq "sdfactor$i" > "/sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor" - config_get_cpufreq "upthreshold$i" > "/sys/devices/system/cpu/cpufreq/ondemand/up_threshold" - fi - done -} diff --git a/luci-app-cpufreq/root/etc/uci-defaults/10-cpufreq b/luci-app-cpufreq/root/etc/uci-defaults/10-cpufreq deleted file mode 100755 index 4ad31dd5f..000000000 --- a/luci-app-cpufreq/root/etc/uci-defaults/10-cpufreq +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/sh - -uci_write_config() { - uci -q set cpufreq.cpufreq.governor$1="$2" - uci -q set cpufreq.cpufreq.minfreq$1="$3" - uci -q set cpufreq.cpufreq.maxfreq$1="$4" - [ -n "$5" ] && uci -q set cpufreq.cpufreq.sdfactor$1="$5" - [ -n "$6" ] && uci -q set cpufreq.cpufreq.upthreshold$1="$6" - uci -q commit cpufreq -} - -CPU_FREQS="$(cat '/sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies')" -CPU_POLICYS="$(find '/sys/devices/system/cpu/cpufreq/policy'* -maxdepth 0 | grep -Eo '[0-9]+')" -source "/etc/openwrt_release" -case "$DISTRIB_TARGET" in - "bcm27xx/bcm2710") - uci_write_config 0 ondemand 600000 1200000 10 50 - ;; - "bcm27xx/bcm2711") - uci_write_config 0 ondemand 600000 1500000 10 50 - ;; - "ipq40xx/generic") - uci_write_config 0 ondemand 200000 716000 10 50 - ;; - "ipq60xx/generic") - if echo "$CPU_FREQS" | grep -q "1800000"; then - # IPQ6010/18/28 - CPU_MAX_FREQ="1800000" - else - # IPQ6000 - CPU_MAX_FREQ="1200000" - fi - uci_write_config 0 ondemand 864000 $CPU_MAX_FREQ 10 50 - ;; - "ipq806x/generic") - if echo "$CPU_FREQS" | grep -q "1725000"; then - # IPQ8065 - CPU_MAX_FREQ="1725000" - elif echo "$CPU_FREQS" | grep -q "1400000"; then - # IPQ8064 - CPU_MAX_FREQ="1400000" - else - # IPQ8062 - CPU_MAX_FREQ="1000000" - fi - uci_write_config 0 ondemand 600000 $CPU_MAX_FREQ 10 50 - # IPQ8064/5 - echo "$CPU_POLICYS" | grep -q "1" && uci_write_config 1 ondemand 600000 1200000 10 50 - ;; - "ipq807x/generic") - if echo "$CPU_FREQS" | grep -q "2208000"; then - # IPQ8072/4/6/8A - CPU_MAX_FREQ="2208000" - else - # IPQ8071A - CPU_MAX_FREQ="1382400" - fi - uci_write_config 0 ondemand 1017600 $CPU_MAX_FREQ 10 50 - ;; - "mediatek/mt7622") - uci_write_config 0 ondemand 600000 1350000 10 50 - ;; - "meson/meson8b") - uci_write_config 0 schedutil 816000 1536000 - ;; - "rockchip/armv8") - if echo "$CPU_POLICYS" | grep -q "4"; then - # RK3399 - uci_write_config 0 schedutil 600000 1608000 - uci_write_config 4 schedutil 600000 2016000 - else - if echo "$CPU_FREQS" | grep -q "1992000"; then - # RK3568 - CPU_MAX_FREQ="1992000" - elif echo "$CPU_FREQS" | grep -q "1800000"; then - # RK3566 - CPU_MAX_FREQ="1800000" - else - # RK3328 - CPU_MAX_FREQ="1512000" - fi - uci_write_config 0 schedutil 816000 $CPU_MAX_FREQ - fi - ;; - "sunxi/cortexa53") - if echo "$CPU_FREQS" | grep -q "1800000"; then - # H6 - uci_write_config 0 schedutil 816000 1800000 - else - # H5 - uci_write_config 0 ondemand 648000 1200000 10 50 - fi - ;; -esac - -uci -q batch <<-EOF >/dev/null - delete ucitrack.@cpufreq[-1] - add ucitrack cpufreq - set ucitrack.@cpufreq[-1].init=cpufreq - commit ucitrack -EOF - -rm -f /tmp/luci-indexcache -exit 0 diff --git a/luci-app-cpufreq/root/usr/share/rpcd/acl.d/luci-app-cpufreq.json b/luci-app-cpufreq/root/usr/share/rpcd/acl.d/luci-app-cpufreq.json deleted file mode 100755 index fae58ae40..000000000 --- a/luci-app-cpufreq/root/usr/share/rpcd/acl.d/luci-app-cpufreq.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "luci-app-cpufreq": { - "description": "Grant UCI access for luci-app-cpufreq", - "read": { - "uci": [ "cpufreq" ] - }, - "write": { - "uci": [ "cpufreq" ] - } - } -} diff --git a/luci-base/po/oc/base.po b/luci-base/po/oc/base.po deleted file mode 100755 index 28f4b510f..000000000 --- a/luci-base/po/oc/base.po +++ /dev/null @@ -1,7620 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2020-10-19 09:37+0000\n" -"Last-Translator: Quentin PAGÈS \n" -"Language-Team: Occitan \n" -"Language: oc\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0.4\n" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 -msgid "%.1f dB" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:114 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:261 -msgid "%d Bit" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3689 -msgid "%d invalid field(s)" -msgstr "%d camp(s) invalid(s)" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 -msgid "%s is untagged in multiple VLANs!" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:294 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:403 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:270 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:307 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:325 -msgid "(%d minute window, %d second interval)" -msgstr "(fenèstra de %d minuta,interval de %d segonda)" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:118 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:124 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:258 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:282 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:88 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:91 -msgid "(empty)" -msgstr "(void)" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:351 -#: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 -msgid "(no interfaces attached)" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 -msgid "-- Additional Field --" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3372 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3704 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:767 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1005 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1974 -#: modules/luci-compat/luasrc/view/cbi/header.htm:8 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:88 -msgid "-- Please choose --" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1006 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1975 -#: modules/luci-compat/luasrc/view/cbi/header.htm:9 -msgid "-- custom --" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:270 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:379 -msgid "-- match by label --" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:256 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:362 -msgid "-- match by uuid --" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:23 -msgid "-- please select --" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 -msgctxt "sstp log level value" -msgid "0" -msgstr "0" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:939 -msgid "0 = not using RSSI threshold, 1 = do not change driver default" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 -msgctxt "sstp log level value" -msgid "1" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:231 -msgid "1 Minute Load:" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:251 -msgid "15 Minute Load:" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:56 -msgctxt "sstp log level value" -msgid "2" -msgstr "2" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:57 -msgctxt "sstp log level value" -msgid "3" -msgstr "3" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:58 -msgctxt "sstp log level value" -msgid "4" -msgstr "4" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1442 -msgid "4-character hexadecimal ID" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 -msgid "464XLAT (CLAT)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:241 -msgid "5 Minute Load:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1471 -msgid "6-octet identifier as a hex string - no colons" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 -msgid "802.11r Fast Transition" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 -msgid "802.11w Association SA Query maximum timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1626 -msgid "802.11w Association SA Query retry timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 -msgid "802.11w Management Frame Protection" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 -msgid "802.11w maximum timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1626 -msgid "802.11w retry timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 -msgid "DNS query port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 -msgid "DNS server port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 -msgid "" -"DNS servers will be queried in the " -"order of the resolvfile" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:945 -msgid "ESSID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:475 -msgid "IPv4-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:42 -msgid "IPv4-Gateway" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:603 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:36 -msgid "IPv4-Netmask" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:31 -msgid "" -"IPv6-Address or Network " -"(CIDR)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:42 -msgid "IPv6-Gateway" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 -msgid "IPv6-Suffix (hex)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:58 -msgid "LED Configuration" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:69 -msgid "LED Name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 -msgid "MAC-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:498 -msgid "DUID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:335 -msgid "" -"Max. DHCP leases" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 -msgid "" -"Max. EDNS0 packet size" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:353 -msgid "Max. concurrent queries" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 -msgid "" -"
Note: you need to manually restart the cron service if the crontab file " -"was empty before editing." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2720 -msgid "A directory with the same name already exists." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2670 -msgid "A new login is required since the authentication session expired." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:909 -msgid "A43C + J43 + A43" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:910 -msgid "A43C + J43 + A43 + V43" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:922 -msgid "ADSL" -msgstr "ADSL" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 -msgid "ANSI T1.413" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:94 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:93 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:86 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:67 -msgid "APN" -msgstr "APN" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 -msgid "ARP" -msgstr "ARP" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:365 -msgid "ARP IP Targets" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:357 -msgid "ARP Interval" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:381 -msgid "ARP Validation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:373 -msgid "ARP mode to consider a slave as being up" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:77 -msgid "ARP monitoring is not supported for the selected policy!" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 -msgid "ARP retry threshold" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 -msgid "ATM (Asynchronous Transfer Mode)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:938 -msgid "ATM Bridges" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 -msgid "ATM Virtual Channel Identifier (VCI)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:971 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 -msgid "ATM Virtual Path Identifier (VPI)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:938 -msgid "" -"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " -"Linux network interfaces which can be used in conjunction with DHCP or PPP " -"to dial into the provider network." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 -msgid "ATM device number" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "ATU-C System Vendor ID" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:265 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:543 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:547 -msgid "Absent Interface" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 -msgid "Access Concentrator" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:927 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1032 -msgid "Access Point" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:360 -msgid "Actions" -msgstr "Accions" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:200 -msgid "Active IPv4-Routes" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 -msgid "Active IPv6-Routes" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 -msgid "Active Connections" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:33 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:92 -msgid "Active DHCP Leases" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:52 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:94 -msgid "Active DHCPv6 Leases" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:203 -msgid "Active-Backup policy (active-backup, 1)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3666 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 -msgid "Ad-Hoc" -msgstr "Ad-Hoc" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 -msgid "Adaptive load balancing (balance-alb, 6)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 -msgid "Adaptive transmit load balancing (balance-tlb, 5)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2167 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2170 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2184 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2185 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3170 -#: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:827 -msgid "Add" -msgstr "Ajustar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:942 -msgid "Add ATM Bridge" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 -msgid "Add IPv4 address…" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:207 -msgid "Add IPv6 address…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 -msgid "Add LED action" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:219 -msgid "Add VLAN" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 -msgid "Add instance" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:152 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:247 -msgid "Add key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:248 -msgid "Add local domain suffix to names served from hosts files" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:311 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:757 -msgid "Add new interface..." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:125 -msgid "Add peer" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:200 -msgid "Additional Hosts files" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -msgid "Additional servers file" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:34 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:35 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:36 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:37 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:38 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:39 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:40 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:41 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:43 -msgid "Address" -msgstr "Adreça" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 -msgid "Address to access local relay bridge" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 -msgid "Addresses" -msgstr "Adreças" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:3 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:15 -msgid "Administration" -msgstr "Administracion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:164 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:324 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:553 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:968 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:25 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:866 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 -msgid "Advanced Settings" -msgstr "Paramètres avançats" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:258 -msgid "Aggregation Selection Logic" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 -msgid "Aggregator: All slaves down or has no slaves (stable, 0)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 -msgid "" -"Aggregator: Chosen by the largest number of ports + slave added/removed or " -"state changes (count, 2)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:262 -msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:171 -msgid "Alert" -msgstr "Alèrta" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2871 -#: modules/luci-compat/luasrc/model/network.lua:1417 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:61 -msgid "Alias Interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:145 -msgid "Alias of \"%s\"" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 -msgid "All Servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:209 -msgid "" -"Allocate IP addresses sequentially, starting from the lowest available " -"address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:208 -msgid "Allocate IP sequentially" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 -msgid "Allow SSH password authentication" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1112 -msgid "Allow AP mode to disconnect STAs based on low ACK condition" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1016 -msgid "Allow all except listed" -msgstr "" - -#: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 -msgid "Allow full UCI access for legacy applications" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:892 -msgid "Allow legacy 802.11b rates" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 -msgid "Allow listed only" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 -msgid "Allow localhost" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:157 -msgid "Allow rebooting the device" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 -msgid "Allow remote hosts to connect to local SSH forwarded ports" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow root logins with password" -msgstr "" - -#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 -msgid "Allow system feature probing" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 -msgid "" -"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:148 -msgid "Allowed IPs" -msgstr "IP autorizadas" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:654 -msgid "Always announce default router" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:5 -msgid "Always off (kernel: none)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 -msgid "Always on (kernel: default-on)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 -msgid "" -"Always use 40MHz channels even if the secondary channel overlaps. Using this " -"option does not comply with IEEE 802.11n-2009!" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:603 -msgid "An error occurred while saving the form:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 -msgid "Annex" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:891 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:899 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:900 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:901 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:902 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:892 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:895 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:896 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:893 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:903 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:894 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:904 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 -msgid "Annex M G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:654 -msgid "Announce as default router even if no public prefix is available." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:659 -msgid "Announced DNS domains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:658 -msgid "Announced DNS servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1596 -msgid "Anonymous Identity" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 -msgid "Anonymous Mount" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 -msgid "Anonymous Swap" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:195 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:60 -msgid "Any zone" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 -msgid "Apply backup?" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4276 -msgid "Apply request failed with status %h" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2181 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4142 -msgid "Apply unchecked" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4215 -msgid "Applying configuration changes… %ds" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 -msgid "Architecture" -msgstr "Arquitectura" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:184 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 -msgid "" -"Assign a part of given length of every public IPv6-prefix to this interface" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:189 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:31 -msgid "" -"Assign prefix parts using this hexadecimal subprefix ID for this interface." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2078 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:245 -msgid "Associated Stations" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:46 -msgid "Associations" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 -msgid "Attempt to enable configured mount points for attached devices" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:104 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 -msgid "Auth Group" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1535 -msgid "Authentication" -msgstr "Autentificacion" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:96 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:70 -msgid "Authentication Type" -msgstr "Tipe d’autentificacion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:172 -msgid "Authoritative" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:17 -msgid "Authorization Required" -msgstr "" - -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:196 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:197 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:241 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:244 -msgid "Auto Refresh" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:50 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:81 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:55 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:68 -msgid "Automatic" -msgstr "Automatic" - -#: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 -msgid "Automatic Homenet (HNCP)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 -msgid "Automatically check filesystem for errors before mounting" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 -msgid "Automatically mount filesystems on hotplug" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 -msgid "Automatically mount swap on hotplug" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 -msgid "Automount Filesystem" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 -msgid "Automount Swap" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 -msgid "Available" -msgstr "Disponible" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:268 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:278 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:329 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:339 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:349 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:234 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:244 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:254 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:263 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:273 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:291 -msgid "Average:" -msgstr "Mejana :" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:911 -msgid "B43 + B43C" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:912 -msgid "B43 + B43C + V43" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:48 -msgid "BR / DMR / AFTR" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:44 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-compat/luasrc/view/cbi/footer.htm:14 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 -msgid "Back to Overview" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:363 -msgid "Backup" -msgstr "Salvagarda" - -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:114 -msgid "Backup / Flash Firmware" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:323 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 -msgid "Backup file list" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:451 -msgid "Band" -msgstr "Grop" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:910 -msgid "Beacon Interval" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:324 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 -msgid "" -"Below is the determined list of files to backup. It consists of changed " -"configuration files marked by opkg, essential base files and the user " -"defined backup patterns." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:395 -msgid "" -"Bind dynamically to interfaces rather than wildcard address (recommended as " -"linux default)" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:52 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 -msgid "Bind interface" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:52 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 -msgid "Bind the tunnel to this interface (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:63 -msgid "Bitrate" -msgstr "Debit" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 -msgid "Bogus NX Domain Override" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:199 -msgid "Bonding Policy" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2877 -#: modules/luci-compat/luasrc/model/network.lua:1421 -msgid "Bridge" -msgstr "Pont" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:730 -msgid "Bridge interfaces" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:978 -msgid "Bridge unit number" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:412 -msgid "Bring up on boot" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 -msgid "Broadcast policy (broadcast, 3)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2810 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3799 -msgid "Browse…" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:37 -msgid "Buffered" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:138 -msgid "CA certificate; if empty it will be saved after the first connection." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 -msgid "CLAT configuration failed" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 -msgid "CPU usage (%)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:41 -msgid "Cached" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 -msgid "Call failed" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2903 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3808 -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:187 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1952 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:272 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:184 -msgid "Cancel" -msgstr "Anullar" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 -msgid "Category" -msgstr "Categoria" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 -msgid "Certificate constraint (Domain)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1516 -msgid "Certificate constraint (SAN)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 -msgid "Certificate constraint (Subject)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1522 -msgid "Certificate constraint (Wildcard)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1571 -msgid "" -"Certificate constraint substring - e.g. /CN=wifi.mycompany.com
See " -"`logread -f` during handshake for actual values" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 -msgid "" -"Certificate constraint(s) against DNS SAN values (if available)
or " -"Subject CN (exact match)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1522 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -msgid "" -"Certificate constraint(s) against DNS SAN values (if available)
or " -"Subject CN (suffix match)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1516 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 -msgid "" -"Certificate constraint(s) via Subject Alternate Name values
(supported " -"attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:200 -msgid "Chain" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4028 -msgid "Changes" -msgstr "Diferéncias" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4311 -msgid "Changes have been reverted." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 -msgid "Changes the administrator password for accessing the device" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:460 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1663 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:62 -msgid "Channel" -msgstr "Canal" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 -msgid "Check filesystems before mount" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 -msgid "Check this option to delete the existing networks from this radio." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 -msgid "Checking archive…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 -msgid "Checking image…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:399 -msgid "Choose mtdblock" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1942 -msgid "" -"Choose the firewall zone you want to assign to this interface. Select " -"unspecified to remove the interface from the associated zone or " -"fill out the custom field to define a new zone and attach the " -"interface to it." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 -msgid "" -"Choose the network(s) you want to attach to this wireless interface or fill " -"out the custom field to define a new network." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1148 -msgid "Cipher" -msgstr "Cipher" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 -msgid "Cisco UDP encapsulation" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:363 -msgid "" -"Click \"Generate archive\" to download a tar archive of the current " -"configuration files." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 -msgid "" -"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " -"FEATURE IS FOR PROFESSIONALS! )" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3665 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:928 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1033 -msgid "Client" -msgstr "Client" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:52 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:47 -msgid "Client ID to send when requesting DHCP" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:148 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:154 -msgid "Close" -msgstr "Tampar" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:157 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:141 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:106 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:115 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:138 -msgid "" -"Close inactive connection after the given amount of seconds, use 0 to " -"persist connection" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:42 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2076 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:389 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:317 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:320 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:204 -msgid "Collecting data..." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 -msgid "Command" -msgstr "Comanda" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 -msgid "Command OK" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 -msgid "Command failed" -msgstr "La comanda a fracassat" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 -msgid "Comment" -msgstr "Comentari" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1634 -msgid "" -"Complicates key reinstallation attacks on the client side by disabling " -"retransmission of EAPOL-Key frames that are used to install keys. This " -"workaround might cause interoperability issues and reduced robustness of key " -"negotiation especially in environments with heavy traffic load." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:96 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:98 -msgid "Compute outgoing checksum (optional)." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4028 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:426 -msgid "Configuration" -msgstr "Configuracion" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4190 -msgid "Configuration changes applied." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4128 -msgid "Configuration changes have been rolled back!" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 -msgid "Configuration failed" -msgstr "Fracàs de la configuracion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:175 -msgid "Confirm disconnect" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 -msgid "Confirmation" -msgstr "Confirmacion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 -msgid "Connected" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:9 -#: modules/luci-compat/luasrc/model/network.lua:27 -msgid "Connection attempt failed" -msgstr "Ensag de connexion pas capitat" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 -msgid "Connection attempt failed." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 -msgid "Connection lost" -msgstr "Connexion perduda" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:117 -msgid "Connections" -msgstr "Connexions" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 -msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:376 -msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:340 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 -msgid "Contents have been saved." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:742 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:264 -msgid "Continue" -msgstr "Contunhar" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4164 -msgid "" -"Could not regain access to the device after applying the configuration " -"changes. You might need to reconnect if you modified network related " -"settings such as the IP address or wireless security credentials." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 -msgid "Country" -msgstr "País" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 -msgid "Country Code" -msgstr "Còde de país" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1942 -msgid "Create / Assign firewall-zone" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 -msgid "Create interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:730 -msgid "Creates a bridge over specified interface(s)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:170 -msgid "Critical" -msgstr "Critic" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:174 -msgid "Cron Log Level" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:533 -msgid "Current power" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:568 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:570 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:51 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:53 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 -msgid "Custom Interface" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:36 -msgid "Custom delegated IPv6-prefix" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:382 -msgid "" -"Custom files (certificates, scripts) may remain on the system. To prevent " -"this, perform a factory-reset first." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 -msgid "Custom flash interval (kernel: timer)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 -msgid "" -"Customizes the behaviour of the device LEDs if possible." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 -msgid "DAE-Client" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1358 -msgid "DAE-Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1363 -msgid "DAE-Secret" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:327 -msgid "DHCP Server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:155 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:50 -msgid "DHCP and DNS" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1982 -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:16 -#: modules/luci-compat/luasrc/model/network.lua:969 -msgid "DHCP client" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:619 -msgid "DHCP-Options" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 -msgid "DHCPv6 client" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -msgid "DHCPv6-Mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:631 -msgid "DHCPv6-Service" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:47 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:48 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:49 -msgid "DNS" -msgstr "DNS" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 -msgid "DNS forwardings" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:37 -msgid "DNS-Label / FQDN" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:228 -msgid "DNSSEC" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:232 -msgid "DNSSEC check unsigned" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 -msgid "DPD Idle Timeout" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 -msgid "DS-Lite AFTR address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:887 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45 -msgid "DSL" -msgstr "DSL" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 -msgid "DSL Status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 -msgid "DSL line mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 -msgid "DTIM Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:58 -msgid "DUID" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Data Rate" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:165 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:176 -msgid "Debug" -msgstr "Desbugatge" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1358 -msgid "Default %d" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:107 -msgid "Default Route" -msgstr "Rota per defaut" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:108 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:150 -msgid "Default gateway" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -msgid "Default is stateless + stateful" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:11 -msgid "Default state" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:619 -msgid "" -"Define additional DHCP options, for example " -"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " -"servers to clients." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2237 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2662 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2666 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3154 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2872 -#: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 -msgid "Delete" -msgstr "Suprimir" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:180 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:186 -msgid "Delete key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2769 -msgid "Delete request failed: %s" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:847 -msgid "Delete this network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 -msgid "Delivery Traffic Indication Message Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:340 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:134 -msgid "Description" -msgstr "Descripcion" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2868 -msgid "Deselect" -msgstr "Deseleccionar" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:220 -msgid "Design" -msgstr "Concepcion" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 -msgid "Destination" -msgstr "Destinacion" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 -msgid "Destination port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 -msgid "Destination zone" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:191 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:12 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:247 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:280 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:356 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:392 -msgid "Device" -msgstr "Periferic" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:861 -msgid "Device Configuration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 -msgid "Device is not active" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:224 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:599 -msgid "Device is restarting…" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 -msgid "Device not managed by ModemManager." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4163 -msgid "Device unreachable!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 -msgid "Device unreachable! Still waiting for device..." -msgstr "" - -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:88 -msgid "Diagnostics" -msgstr "Diagnostics" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 -msgid "Dial number" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2665 -msgid "Directory" -msgstr "Direccion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:839 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 -msgid "Disable" -msgstr "Desactivar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:579 -msgid "" -"Disable DHCP for " -"this interface." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:373 -msgid "Disable DNS lookups" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 -msgid "Disable Encryption" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1098 -msgid "Disable Inactivity Polling" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:837 -msgid "Disable this network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1608 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:107 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:99 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:95 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:56 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:69 -msgid "Disabled" -msgstr "Desactivat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1112 -msgid "Disassociate On Low Acknowledgement" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:294 -msgid "Discard upstream RFC1918 responses" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:197 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:665 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:231 -msgid "Disconnect" -msgstr "Se desconnectar" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 -msgid "Disconnection attempt failed" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 -msgid "Disconnection attempt failed." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:606 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2861 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3309 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4045 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4134 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:330 -msgid "Dismiss" -msgstr "Far desaparéisser" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 -msgid "Distance Optimization" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 -msgid "Distance to farthest network member in meters." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:155 -msgid "" -"Dnsmasq is a combined DHCP-Server and DNS-" -"Forwarder for NAT " -"firewalls" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -msgid "Do not cache negative replies, e.g. for not existing domains" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:79 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:81 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:86 -msgid "Do not create host route to peer (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:219 -msgid "Do not forward requests that cannot be answered by public name servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:214 -msgid "Do not forward reverse lookups for local networks" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:25 -msgid "Do not send a hostname" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 -msgid "Do you really want to delete \"%s\" ?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:181 -msgid "Do you really want to delete the following SSH key?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 -msgid "Do you really want to erase all settings?" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2753 -msgid "Do you really want to recursively delete the directory \"%s\" ?" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:168 -msgid "Domain required" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 -msgid "Domain whitelist" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:81 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 -msgid "Don't Fragment" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:169 -msgid "" -"Don't forward DNS-Requests without " -"DNS-Name" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 -msgid "Down" -msgstr "Bas" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:402 -msgid "Down Delay" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:366 -msgid "Download backup" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:404 -msgid "Download mtdblock" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 -msgid "Downstream SNR offset" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2620 -msgid "Drag to reorder" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:341 -msgid "Drop Duplicate Frames" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 -msgid "Dropbear Instance" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 -msgid "" -"Dropbear offers SSH network shell access " -"and an integrated SCP server" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 -msgid "Dual-Stack Lite (RFC6333)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:595 -msgid "Dynamic DHCP" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 -msgid "Dynamic tunnel" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:595 -msgid "" -"Dynamically allocate DHCP addresses for clients. If disabled, only clients " -"having static leases will be served." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 -msgid "EA-bits length" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1491 -msgid "EAP-Method" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2643 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3017 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:844 -msgid "Edit" -msgstr "Editar" - -#: modules/luci-compat/luasrc/view/cbi/error.htm:13 -msgid "" -"Edit the raw configuration data above to fix any error and hit \"Save\" to " -"reload the page." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:842 -msgid "Edit this network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 -msgid "Edit wireless network" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:172 -msgid "Emergency" -msgstr "Urgéncia" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:839 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 -msgid "Enable" -msgstr "Activar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -msgid "" -"Enable IGMP " -"snooping" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:460 -msgid "Enable STP" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:367 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:373 -msgid "Enable DNS lookups" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:292 -msgid "Enable Dynamic Shuffling Of Flows" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 -msgid "Enable HE.net dynamic endpoint update" -msgstr "" - -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:89 -msgid "Enable IPv6 negotiation" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:93 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 -msgid "Enable IPv6 negotiation on the PPP link" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:192 -msgid "Enable Jumbo Frame passthrough" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:240 -msgid "Enable NTP client" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 -msgid "Enable Single DES" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:368 -msgid "Enable TFTP server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 -msgid "Enable VLAN functionality" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 -msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1634 -msgid "Enable key reinstallation (KRACK) countermeasures" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:187 -msgid "Enable learning and aging" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:198 -msgid "Enable mirroring of incoming packets" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:199 -msgid "Enable mirroring of outgoing packets" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 -msgid "" -"Enable packet steering across all CPUs. May help or hinder network speed." -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:80 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:75 -msgid "Enable rx checksum" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:81 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 -msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:837 -msgid "Enable this network" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:84 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:79 -msgid "Enable tx checksum" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:352 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 -msgid "Enabled" -msgstr "Activat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -msgid "Enables IGMP snooping on this bridge" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 -msgid "" -"Enables fast roaming among access points that belong to the same Mobility " -"Domain" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:460 -msgid "Enables the Spanning Tree Protocol on this bridge" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 -msgid "Encapsulation limit" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 -msgid "Encapsulation mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1117 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1666 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:45 -msgid "Encryption" -msgstr "Chiframent" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:161 -msgid "Endpoint Host" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:165 -msgid "Endpoint Port" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 -msgid "Enter custom value" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 -msgid "Enter custom values" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 -msgid "Erasing..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:103 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:104 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:105 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:106 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:169 -msgid "Error" -msgstr "Error" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Errored seconds (ES)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2889 -#: modules/luci-compat/luasrc/model/network.lua:1433 -msgid "Ethernet Adapter" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2880 -#: modules/luci-compat/luasrc/model/network.lua:1423 -msgid "Ethernet Switch" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 -msgid "Every 30 seconds (slow, 0)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:271 -msgid "Every second (fast, 1)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:406 -msgid "Exclude interfaces" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:247 -msgid "Expand hosts" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:198 -msgid "Expecting a hexadecimal assignment hint" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:64 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:73 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:107 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:121 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:125 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:129 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:132 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:136 -msgid "Expecting: %s" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:48 -msgid "Expecting: non-empty value" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 -msgid "Expires" -msgstr "Expira" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:591 -msgid "" -"Expiry time of leased addresses, minimum is 2 minutes (2m)." -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 -msgid "External" -msgstr "Extèrne" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -msgid "External R0 Key Holder List" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1486 -msgid "External R1 Key Holder List" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:146 -msgid "External system log server" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:151 -msgid "External system log server port" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:156 -msgid "External system log server protocol" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 -msgid "Extra SSH command options" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:83 -msgid "Extra pppd options" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:81 -msgid "Extra sstpc options" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1456 -msgid "FT over DS" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1457 -msgid "FT over the Air" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1454 -msgid "FT protocol" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 -msgid "Failed to change the system password." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 -msgid "Failed to confirm apply within %ds, waiting for rollback…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 -msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2673 -msgid "File" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2620 -msgid "File not accessible" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2811 -msgid "Filename" -msgstr "Nom de fichièr" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:381 -msgid "Filename of the boot image advertised to clients" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:314 -msgid "Filesystem" -msgstr "Sistèma de fichièrs" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:213 -msgid "Filter private" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:218 -msgid "Filter useless" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 -msgid "Filtering for all slaves, no validation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 -msgid "Filtering for all slaves, validation only for active slave" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 -msgid "Filtering for all slaves, validation only for backup slaves" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 -msgid "Finalizing failed" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 -msgid "" -"Find all currently attached filesystems and swap and replace configuration " -"with defaults based on what was detected" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:820 -msgid "Find and join network" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:9 -msgid "Finish" -msgstr "Acabar" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 -msgid "Firewall" -msgstr "Parafuòc" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:102 -msgid "Firewall Mark" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:326 -msgid "Firewall Settings" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:297 -msgid "Firewall Status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 -msgid "Firmware File" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 -msgid "Firmware Version" -msgstr "Version del microcòdi" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:327 -msgid "Fixed source port for outbound DNS queries" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:283 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:421 -msgid "Flash image..." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:279 -msgid "Flash image?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:411 -msgid "Flash new firmware image" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:356 -msgid "Flash operations" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:288 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:290 -msgid "Flashing…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:598 -msgid "Force" -msgstr "Fòrça" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 -msgid "Force 40MHz mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1158 -msgid "Force CCMP (AES)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:598 -msgid "Force DHCP on this network even if another server is detected." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -msgid "Force TKIP" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1160 -msgid "Force TKIP and CCMP (AES)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:864 -msgid "Force link" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:255 -msgid "Force upgrade" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 -msgid "Force use of NAT-T" -msgstr "" - -#: modules/luci-base/luasrc/view/csrftoken.htm:8 -msgid "Form token mismatch" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:164 -msgid "Forward DHCP traffic" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 -msgid "Forward broadcast traffic" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 -msgid "Forward mesh peer traffic" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 -msgid "Forwarding mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 -msgid "Fragmentation Threshold" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:115 -msgid "" -"Further information about WireGuard interfaces and peers at wireguard.com." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:62 -msgid "GHz" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 -msgid "GPRS only" -msgstr "solament GPRS" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 -msgid "GRE tunnel over IPv4" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 -msgid "GRE tunnel over IPv6" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 -msgid "GRETAP tunnel over IPv4" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 -msgid "GRETAP tunnel over IPv6" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 -msgid "Gateway" -msgstr "Palanca" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 -msgid "Gateway Ports" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:11 -#: modules/luci-compat/luasrc/model/network.lua:29 -msgid "Gateway address is invalid" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:124 -msgid "Gateway metric" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:24 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:108 -msgid "General Settings" -msgstr "Paramètres generals" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:552 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:921 -msgid "General Setup" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 -msgid "Generate Config" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:66 -msgid "Generate Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1460 -msgid "Generate PMK locally" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 -msgid "Generate archive" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 -msgid "Given password confirmation did not match, password not changed!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 -msgid "Global Settings" -msgstr "Configuracion generala" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:875 -msgid "Global network options" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:57 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:215 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:58 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:284 -msgid "Go to password configuration..." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2562 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3336 -#: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 -msgid "Go to relevant configuration page" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:33 -msgid "Grant access to DHCP configuration" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:102 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:111 -msgid "Grant access to DSL status display" -msgstr "" - -#: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 -msgid "Grant access to LuCI OpenConnect procedures" -msgstr "" - -#: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 -msgid "Grant access to LuCI Wireguard procedures" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:19 -msgid "Grant access to SSH configuration" -msgstr "" - -#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 -msgid "Grant access to basic LuCI procedures" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:64 -msgid "Grant access to crontab configuration" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:60 -msgid "Grant access to firewall status" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:116 -msgid "Grant access to flash operations" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:86 -msgid "Grant access to main status display" -msgstr "" - -#: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 -msgid "Grant access to mmcli" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:84 -msgid "Grant access to mount configuration" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 -msgid "Grant access to network configuration" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:46 -msgid "Grant access to network diagnostic tools" -msgstr "" - -#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 -msgid "Grant access to network status information" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 -msgid "Grant access to process status" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 -msgid "Grant access to realtime statistics" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:42 -msgid "Grant access to startup configuration" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 -msgid "Grant access to system configuration" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 -msgid "Grant access to system logs" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:120 -msgid "Grant access to wireless status display" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 -msgid "Group Password" -msgstr "Senhal del grop" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 -msgid "Guest" -msgstr "Convidat" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 -msgid "HE.net password" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 -msgid "HE.net username" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 -msgid "Hang Up" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 -msgid "Heartbeat interval (kernel: heartbeat)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:100 -msgid "" -"Here you can configure the basic aspects of your device like its hostname or " -"the timezone." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1066 -msgid "Hide ESSID" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:264 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:303 -msgid "Hide empty chains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:55 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2070 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 -msgid "Host" -msgstr "Òste" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:22 -msgid "Host entries" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 -msgid "Host expiry timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:31 -msgid "Host-IP or Network" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:102 -msgid "Host-Uniq tag content" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:36 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:27 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:29 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:121 -msgid "Hostname" -msgstr "Nom d'òste" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 -msgid "Hostname to send when requesting DHCP" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:20 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:63 -msgid "Hostnames" -msgstr "Noms d'òstes" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 -msgid "Hybrid" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 -msgid "ID used to uniquely identify the VXLAN" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 -msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 -msgid "IKE DH Group" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:83 -msgid "IP Addresses" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:80 -msgid "IP Protocol" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:114 -msgid "IP Type" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:31 -msgid "IP address" -msgstr "Adreça IP" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:10 -#: modules/luci-compat/luasrc/model/network.lua:28 -msgid "IP address is invalid" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:13 -#: modules/luci-compat/luasrc/model/network.lua:31 -msgid "IP address is missing" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:316 -msgid "IPv4 Firewall" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 -msgid "IPv4 Upstream" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:162 -msgid "IPv4 address" -msgstr "Adreça IPv4" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 -msgid "IPv4 assignment length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 -msgid "IPv4 broadcast" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 -msgid "IPv4 gateway" -msgstr "Palanca IPv4" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:179 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:168 -msgid "IPv4 netmask" -msgstr "Masqueta ret IPv4" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:291 -msgid "IPv4 network in address/netmask notation" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:116 -msgid "IPv4 only" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 -msgid "IPv4 prefix" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 -msgid "IPv4 prefix length" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 -msgid "IPv4+IPv6" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:37 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:30 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:154 -msgid "IPv4-Address" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:164 -msgid "IPv4-Gateway" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 -msgid "IPv4-in-IPv4 (RFC2003)" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -msgid "IPv4/IPv6 (both - defaults to IPv4)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:103 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:94 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:95 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:96 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:319 -msgid "IPv6 Firewall" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:203 -msgid "IPv6 Neighbours" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -msgid "IPv6 Settings" -msgstr "Paramètres IPv6" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 -msgid "IPv6 ULA-Prefix" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 -msgid "IPv6 Upstream" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:205 -msgid "IPv6 address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:189 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:31 -msgid "IPv6 assignment hint" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:184 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 -msgid "IPv6 assignment length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:210 -msgid "IPv6 gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:296 -msgid "IPv6 network in address/netmask notation" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:117 -msgid "IPv6 only" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 -msgid "IPv6 prefix" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 -msgid "IPv6 prefix length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:214 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 -msgid "IPv6 routed prefix" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:218 -msgid "IPv6 suffix" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 -msgid "IPv6 support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:57 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:172 -msgid "IPv6-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -msgid "IPv6-PD" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 -msgid "IPv6-in-IPv4 (RFC4213)" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:17 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:9 -msgid "IPv6-over-IPv4 (6rd)" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:15 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:9 -msgid "IPv6-over-IPv4 (6to4)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1593 -msgid "Identity" -msgstr "Identitat" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 -msgid "If checked, 1DES is enabled" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 -msgid "If checked, adds \"+ipv6\" to the pppd options" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 -msgid "If checked, encryption is disabled" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:254 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:360 -msgid "" -"If specified, mount the device by its UUID instead of a fixed device node" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:267 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:376 -msgid "" -"If specified, mount the device by the partition label instead of a fixed " -"device node" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:116 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:108 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:150 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:56 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:100 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:87 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:61 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:74 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:97 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:61 -msgid "If unchecked, no default route is configured" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:124 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:39 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:116 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:59 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:103 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:90 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:77 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:100 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:69 -msgid "If unchecked, the advertised DNS server addresses are ignored" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:339 -msgid "" -"If your physical memory is insufficient unused data can be temporarily " -"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " -"slow process as the swap-device cannot be accessed with the high datarates " -"of the RAM." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:197 -msgid "Ignore /etc/hosts" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:579 -msgid "Ignore interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 -msgid "Ignore resolve file" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:419 -msgid "Image" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:67 -msgid "In" -msgstr "" - -#: modules/luci-base/luasrc/view/csrftoken.htm:13 -msgid "" -"In order to prevent unauthorized access to the system, your request has been " -"blocked. Click \"Continue »\" below to return to the previous page." -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:157 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:141 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:106 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:115 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:138 -msgid "Inactivity timeout" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:265 -msgid "Inbound:" -msgstr "Dintrant :" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:90 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:97 -msgid "Incoming checksum" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:82 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:87 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:89 -msgid "Incoming key" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 -msgid "Incoming serialization" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:166 -msgid "Info" -msgstr "Info" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 -msgid "Information" -msgstr "Informacion" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 -msgid "Initialization failure" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:77 -msgid "Initscript" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:111 -msgid "Initscripts" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 -msgid "Inner certificate constraint (Domain)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 -msgid "Inner certificate constraint (SAN)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1571 -msgid "Inner certificate constraint (Subject)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -msgid "Inner certificate constraint (Wildcard)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:268 -msgid "Install protocol extensions..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1938 -msgid "" -"Instead of joining any network with a matching SSID, only connect to the " -"BSSID %h." -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/map.htm:43 -msgid "Insufficient permissions to read UCI configuration." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:464 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:471 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:739 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:27 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:156 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:174 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 -msgid "Interface" -msgstr "Interfàcia" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 -msgid "Interface %q device auto-migrated from %q to %q." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 -msgid "Interface Configuration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:110 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 -msgid "Interface has %d pending changes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 -msgid "Interface is disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:64 -msgid "Interface is marked for deletion" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:209 -msgid "Interface is reconnecting..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:193 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:203 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:209 -msgid "Interface is shutting down..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:253 -msgid "Interface is starting..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:256 -msgid "Interface is stopping..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 -msgid "Interface name" -msgstr "Nom de l’interfàcia" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:122 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:272 -msgid "Interface not present or not connected yet." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:308 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:335 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 -msgid "Interfaces" -msgstr "Interfàcias" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 -msgid "Internal" -msgstr "Intèrne" - -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "Error intèrna de servidor" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:283 -msgid "Interval For Sending Learning Packets" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 -msgid "Invalid" -msgstr "Invalid" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:19 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:22 -msgid "Invalid Base64 key string" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 -msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 -msgid "Invalid VLAN ID given! Only unique IDs are allowed" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 -msgid "Invalid argument" -msgstr "Argument invalid" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 -msgid "" -"Invalid bearer list. Possibly too many bearers created. This protocol " -"supports one and only one bearer." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 -msgid "Invalid command" -msgstr "Comanda invalida" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:106 -msgid "Invalid hexadecimal value" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:12 -msgid "Invalid username and/or password! Please try again." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:71 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:81 -msgid "Invalid value" -msgstr "La valor es pas valida" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1075 -msgid "Isolate Clients" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:231 -msgid "" -"It appears that you are trying to flash an image that does not fit into the " -"flash memory, please verify the image file!" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:64 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:291 -msgid "JavaScript required!" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1746 -msgid "Join Network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1680 -msgid "Join Network: Wireless Scan" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 -msgid "Joining Network: %q" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 -msgid "Keep settings and retain the current configuration" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:51 -msgid "Kernel Log" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1369 -msgid "Key" -msgstr "Clau" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1400 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1412 -msgid "Key #%d" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:82 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:87 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:89 -msgid "Key for incoming packets (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 -msgid "Key for outgoing packets (optinal)." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 -msgid "Kill" -msgstr "Tuar" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:21 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:10 -msgid "L2TP" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:40 -msgid "L2TP Server" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:267 -msgid "LACPDU Packets" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:131 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:102 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:76 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:89 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:112 -msgid "LCP echo failure threshold" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:144 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:102 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:125 -msgid "LCP echo interval" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:101 -msgid "LED Configuration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:974 -msgid "LLC" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:267 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:376 -msgid "Label" -msgstr "Etiqueta" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:209 -msgid "Language" -msgstr "Lenga" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:111 -msgid "Language and Style" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Latency" -msgstr "Laténcia" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 -msgid "Leaf" -msgstr "Fuèlha" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:591 -msgid "Lease time" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:32 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:59 -msgid "Lease time remaining" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 -msgid "Leasefile" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 -msgid "Leave empty to autodetect" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 -msgid "Leave empty to use the current WAN address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4030 -msgid "Legend:" -msgstr "Legenda :" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 -msgid "Limit" -msgstr "Limit" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:389 -msgid "Limit DNS service to subnets interfaces on which we are serving DNS." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 -msgid "Limit listening to these interfaces, and loopback." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 -msgid "Line Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 -msgid "Line State" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 -msgid "Line Uptime" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:123 -msgid "Link Aggregation (Channel Bonding)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:348 -msgid "Link Monitoring" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:23 -msgid "Link On" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 -msgid "" -"List of DNS servers to forward " -"requests to" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -msgid "" -"List of R0KHs in the same Mobility Domain.
Format: MAC-address,NAS-" -"Identifier,128-bit key as hex string.
This list is used to map R0KH-ID " -"(NAS Identifier) to a destination MAC address when requesting PMK-R1 key " -"from the R0KH that the STA used during the Initial Mobility Domain " -"Association." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1486 -msgid "" -"List of R1KHs in the same Mobility Domain.
Format: MAC-address,R1KH-ID " -"as 6 octets with colons,128-bit key as hex string.
This list is used " -"to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the " -"R0KH. This is also the list of authorized R1KHs in the MD that can request " -"PMK-R1 keys." -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 -msgid "List of SSH key files for auth" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:308 -msgid "List of domains to allow RFC1918 responses for" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:267 -msgid "List of hosts that supply bogus NX domain results" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 -msgid "Listen Interfaces" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:78 -msgid "Listen Port" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 -msgid "Listen only on the given interface or, if unspecified, on all" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 -msgid "Listening port for inbound DNS queries" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:87 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 -msgid "Load" -msgstr "Carga" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 -msgid "Load Average" -msgstr "Carga mejana" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2938 -msgid "Loading directory contents…" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:1948 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -msgid "Loading view…" -msgstr "" - -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 -msgid "Local IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:12 -#: modules/luci-compat/luasrc/model/network.lua:30 -msgid "Local IP address is invalid" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:86 -msgid "Local IP address to assign" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 -msgid "Local IPv4 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:46 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 -msgid "Local IPv6 address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Local Service Only" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:115 -msgid "Local Startup" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:117 -msgid "Local Time" -msgstr "Ora locala" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:243 -msgid "Local domain" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:240 -msgid "" -"Local domain specification. Names matching this domain are never forwarded " -"and are resolved from DHCP or hosts files only" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:244 -msgid "Local domain suffix appended to DHCP names and hosts file entries" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:239 -msgid "Local server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 -msgid "" -"Localise hostname depending on the requesting subnet if multiple IPs are " -"available" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:223 -msgid "Localise queries" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1938 -msgid "Lock to BSSID" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:164 -msgid "Log output level" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 -msgid "Log queries" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:109 -msgid "Logging" -msgstr "Jornalizacion" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:50 -msgid "" -"Logical network from which to select the local endpoint if local IPv6 " -"address is empty and no WAN IPv6 is available (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:55 -msgid "Logical network to which the tunnel will be added (bridged) (optional)." -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:38 -msgid "Login" -msgstr "Connexion" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "Desconnexion" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:581 -msgid "Lowest leased address as offset from the network address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -msgid "MAC" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:251 -msgid "MAC Address For The Actor" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2069 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:31 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:139 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:155 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:173 -msgid "MAC-Address" -msgstr "Adreça MAC" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1011 -msgid "MAC-Address Filter" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -msgid "MAC-Filter" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 -msgid "MAC-List" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 -msgid "MAP / LW4over6" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 -msgid "MAP rule is invalid" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:321 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:322 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:323 -msgid "MBit/s" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:218 -msgid "MD5" -msgstr "MD5" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:71 -msgid "MHz" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:353 -msgid "MII" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:421 -msgid "MII / ETHTOOL ioctls" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:394 -msgid "MII Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:54 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:97 -msgid "MTU" -msgstr "MTU" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:302 -msgid "" -"Make sure to clone the root filesystem using something like the commands " -"below:" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:108 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:100 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 -msgid "Manual" -msgstr "Manual" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3664 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:642 -msgid "Master" -msgstr "Principal" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 -msgid "Maximum allowed Listen Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 -msgid "Maximum allowed number of active DHCP leases" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:354 -msgid "Maximum allowed number of concurrent DNS queries" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 -msgid "Maximum allowed size of EDNS.0 UDP packets" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:112 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:104 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:93 -msgid "Maximum amount of seconds to wait for the modem to become ready" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 -msgid "Maximum number of leased addresses." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:886 -msgid "Maximum transmit power" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:63 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:71 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:327 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:328 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:329 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 -msgid "Medium" -msgstr "Mejan" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 -msgid "Memory" -msgstr "Memòria" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 -msgid "Memory usage (%)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3667 -msgid "Mesh" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 -msgid "Mesh ID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 -msgid "Mesh Id" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 -msgid "Method not found" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 -msgid "Method of link monitoring" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:418 -msgid "Method to determine link status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:165 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:183 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:92 -msgid "Metric" -msgstr "Metric" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:235 -msgid "Minimum Number of Links" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:202 -msgid "Mirror monitor port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 -msgid "Mirror source port" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 -msgid "Mobile Data" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1442 -msgid "Mobility Domain" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:442 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:926 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1664 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:43 -msgid "Mode" -msgstr "Mòde" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 -msgid "Model" -msgstr "Modèl" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 -msgid "" -"Modem connection in progress. Please wait. This process will timeout after 2 " -"minutes." -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 -msgid "Modem default" -msgstr "Modem per defaut" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 -msgid "Modem device" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 -msgid "Modem information query failed" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:112 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:104 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:93 -msgid "Modem init timeout" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 -msgid "ModemManager" -msgstr "ModemManager" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3668 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1005 -msgid "Monitor" -msgstr "Monitor" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 -msgid "More Characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2504 -msgid "More…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 -msgid "Mount Point" -msgstr "Punt de montatge" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:88 -msgid "Mount Points" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:229 -msgid "Mount Points - Mount Entry" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 -msgid "Mount Points - Swap Entry" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 -msgid "" -"Mount Points define at which point a memory device will be attached to the " -"filesystem" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 -msgid "Mount attached devices" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 -msgid "Mount filesystems not specifically configured" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:331 -msgid "Mount options" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:292 -msgid "Mount point" -msgstr "Punt de montatge" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 -msgid "Mount swap not specifically configured" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 -msgid "Mounted file systems" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 -msgid "Move down" -msgstr "Desplaçar cap aval" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 -msgid "Move up" -msgstr "Desplaçar cap amont" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 -msgid "NAS ID" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 -msgid "NAT-T Mode" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 -msgid "NAT64 Prefix" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 -msgid "NCM" -msgstr "NCM" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:637 -msgid "NDP-Proxy" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 -msgid "NT Domain" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:274 -msgid "NTP server candidates" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2542 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3785 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:710 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:67 -msgid "Name" -msgstr "Nom" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1916 -msgid "Name of the new network" -msgstr "" - -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:40 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 -msgid "Navigation" -msgstr "Navigacion" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2068 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:381 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:138 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:162 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 -msgid "Network" -msgstr "Ret" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:68 -msgid "Network Utilities" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:380 -msgid "Network boot image" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 -msgid "Network device activity (kernel: netdev)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:15 -#: modules/luci-compat/luasrc/model/network.lua:33 -msgid "Network device is not present" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:55 -msgid "Network interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 -msgid "New interface for \"%s\" can not be created: %s" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:713 -msgid "New interface name…" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 -msgid "Next »" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3643 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:296 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:108 -msgid "No" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:562 -msgid "No DHCP Server configured for this interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1310 -msgid "No Encryption" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:87 -msgid "No Host Routes" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 -msgid "No NAT-T" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 -msgid "No RX signal" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 -msgid "No client associated" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 -msgid "No data received" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2878 -msgid "No entries in this directory" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "Pas cap de fichièr trobat" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:79 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:81 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:86 -msgid "No host route" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:674 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:241 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 -msgid "No information available" -msgstr "Pas cap d'informacion disponibla" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 -msgid "No matching prefix delegation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:140 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:143 -msgid "No more slaves available" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:187 -msgid "No more slaves available, can not save interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:251 -msgid "No negative cache" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:54 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:212 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:55 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:279 -msgid "No password set!" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:130 -msgid "No peers defined yet" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 -msgid "No public keys present yet." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:90 -msgid "No rules in this chain." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:384 -msgid "No validation or filtering" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 -msgid "No zone assigned" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:141 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:174 -msgid "Noise" -msgstr "Bruch" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Noise Margin (SNR)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:270 -msgid "Noise:" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:394 -msgid "Non-wildcard" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -msgid "None" -msgstr "Cap" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:177 -msgid "Normal" -msgstr "Normala" - -#: modules/luci-base/luasrc/view/error404.htm:8 -msgid "Not Found" -msgstr "Pas trobat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 -msgid "Not associated" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 -msgid "Not connected" -msgstr "Pas connectat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:120 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:146 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:280 -msgid "Not present" -msgstr "Pas present" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 -msgid "Not started on boot" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 -msgid "Not supported" -msgstr "Pas pres en carga" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 -msgid "Notice" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:127 -msgid "Nslookup" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:332 -msgid "Number of IGMP membership reports" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:362 -msgid "Number of cached DNS entries (max is 10000, 0 is no caching)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 -msgid "Number of parallel threads used for compression" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:309 -msgid "Number of peer notifications after failover event" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 -msgid "Obfuscated Group Password" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:61 -msgid "Obfuscated Password" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:93 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 -msgid "Obtain IPv6-Address" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:18 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:351 -msgid "Off" -msgstr "Desactivat" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:15 -msgid "Off-State Delay" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:18 -msgid "On" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:96 -msgid "On-Link route" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:11 -msgid "On-State Delay" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 -msgid "One of hostname or mac address must be specified!" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:466 -msgid "One of the following: %s" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 -msgid "One or more fields contain invalid values!" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/map.htm:32 -msgid "One or more invalid/required values on tab" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:19 -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:24 -msgid "One or more required fields have no value!" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 -msgid "" -"Only if current active slave fails and the primary slave is up (failure, 2)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:444 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 -msgid "Open list..." -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 -msgid "OpenConnect (CISCO AnyConnect)" -msgstr "" - -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 -msgid "OpenFortivpn" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:882 -msgid "Operating frequency" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:1971 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3653 -msgid "Option \"%s\" contains an invalid input value." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:1984 -msgid "Option \"%s\" must not be empty." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4037 -msgid "Option changed" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4039 -msgid "Option removed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1609 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:92 -msgid "Optional" -msgstr "Opcional" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:102 -msgid "" -"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " -"starting with 0x." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:218 -msgid "" -"Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " -"'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " -"server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " -"for the interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:143 -msgid "" -"Optional. Base64-encoded preshared key. Adds in an additional layer of " -"symmetric-key cryptography for post-quantum resistance." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:159 -msgid "Optional. Create routes for Allowed IPs for this peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:134 -msgid "Optional. Description of peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:87 -msgid "Optional. Do not create host routes to peers." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:161 -msgid "" -"Optional. Host of peer. Names are resolved prior to bringing up the " -"interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:97 -msgid "Optional. Maximum Transmission Unit of tunnel interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:165 -msgid "Optional. Port of peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:169 -msgid "" -"Optional. Seconds between keep alive messages. Default is 0 (disabled). " -"Recommended value if this device is behind a NAT is 25." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:78 -msgid "Optional. UDP port used for outgoing and incoming packets." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 -msgid "Options" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:346 -msgid "Other:" -msgstr "Autre :" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 -msgid "Out" -msgstr "Sortissant" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:275 -msgid "Outbound:" -msgstr "Sortent :" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:96 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:98 -msgid "Outgoing checksum" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 -msgid "Outgoing key" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:98 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:100 -msgid "Outgoing serialization" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 -msgid "Output Interface" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 -msgid "Output zone" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:57 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:222 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:40 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:50 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:76 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:71 -msgid "Override MAC address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:61 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:226 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:67 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:44 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:54 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:71 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:145 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:132 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:110 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:119 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:97 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:77 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 -msgid "Override MTU" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:72 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:72 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:67 -msgid "Override TOS" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:72 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 -msgid "Override TTL" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 -msgid "Override default interface name" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 -msgid "Override the gateway in DHCP responses" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:603 -msgid "" -"Override the netmask sent to clients. Normally it is calculated from the " -"subnet that is served." -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 -msgid "Override the table used for internal routes" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 -msgid "Overview" -msgstr "Apercebut" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2721 -msgid "Overwrite existing file \"%s\" ?" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 -msgid "Owner" -msgstr "Proprietari" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:97 -msgid "PAP/CHAP (both)" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:98 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:90 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:89 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:44 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:63 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:46 -msgid "PAP/CHAP password" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:96 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:87 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:42 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:61 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:77 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:44 -msgid "PAP/CHAP username" -msgstr "Identificant PAP / CHAP" - -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 -msgid "PDP Type" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 -msgid "PID" -msgstr "PID" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 -msgid "PIN" -msgstr "Còdi personal" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:21 -#: modules/luci-compat/luasrc/model/network.lua:39 -msgid "PIN code rejected" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1477 -msgid "PMK R1 Push" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 -msgid "PPP" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:58 -msgid "PPPoA Encapsulation" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:19 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:28 -msgid "PPPoATM" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:17 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:28 -msgid "PPPoE" -msgstr "PPPoE" - -#: modules/luci-compat/luasrc/model/network/proto_pppossh.lua:9 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:28 -msgid "PPPoSSH" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 -msgid "PPtP" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 -msgid "PSID offset" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:70 -msgid "PSID-bits length" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 -msgid "PTM/EFM (Packet Transfer Mode)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 -msgid "Packet Steering" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -msgid "Packets" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:275 -msgid "Packets To Transmit Before Moving To Next Slave" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 -msgid "Part of zone %q" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1599 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -msgid "Password" -msgstr "Senhal" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 -msgid "Password authentication" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1531 -msgid "Password of Private Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1589 -msgid "Password of inner Private Key" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 -msgid "Password strength" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 -msgid "Password2" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:239 -msgid "Paste or drag SSH key file…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1510 -msgid "Path to CA-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1525 -msgid "Path to Client-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1528 -msgid "Path to Private Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 -msgid "Path to inner CA-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1583 -msgid "Path to inner Client-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1586 -msgid "Path to inner Private Key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2731 -msgid "Paused" -msgstr "En pausa" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:271 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:281 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:332 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:342 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:352 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:237 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:247 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:257 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:266 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:276 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:294 -msgid "Peak:" -msgstr "Punta :" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 -msgid "Peer IP address to assign" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:14 -#: modules/luci-compat/luasrc/model/network.lua:32 -msgid "Peer address is missing" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:115 -msgid "Peers" -msgstr "Pars" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 -msgid "Perfect Forward Secrecy" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:98 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:100 -msgid "Perform outgoing packets serialization (optional)." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 -msgid "Perform reboot" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:378 -msgid "Perform reset" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:407 -msgid "Permission denied" -msgstr "Permission refusada" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:169 -msgid "Persistent Keep Alive" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:288 -msgid "Phy Rate:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:325 -msgid "Physical Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -msgid "Ping" -msgstr "Ping" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:63 -msgid "Pkts." -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:19 -msgid "Please enter your username and password." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3768 -msgid "Please select the file to upload." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -msgid "Policy" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 -msgid "Port" -msgstr "Pòrt" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 -msgid "Port status:" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:492 -msgid "Potential negation of: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 -msgid "Prefer LTE" -msgstr "Preferir LTE" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 -msgid "Prefer UMTS" -msgstr "Preferir UMTS" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 -msgid "Prefix Delegated" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:143 -msgid "Preshared Key" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:131 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:102 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:76 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:89 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:112 -msgid "" -"Presume peer to be dead after given amount of LCP echo failures, use 0 to " -"ignore failures" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:407 -msgid "Prevent listening on these interfaces." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1075 -msgid "Prevents client-to-client communication" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:211 -msgid "Primary Slave" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:228 -msgid "" -"Primary becomes active slave when it comes back up if speed and duplex " -"better than current slave (better, 1)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 -msgid "Primary becomes active slave whenever it comes back up (always, 0)" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:61 -msgid "Private Key" -msgstr "Clau privada" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:63 -msgid "Processes" -msgstr "Processus" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 -msgid "Profile" -msgstr "Perfil" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 -msgid "Prot." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:397 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:727 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:382 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 -msgid "Protocol" -msgstr "Protocòl" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:265 -msgid "Provide NTP server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:825 -msgid "Provide new network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 -msgid "Pseudo Ad-Hoc (ahdemo)" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:139 -msgid "Public Key" -msgstr "Clau publica" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:275 -msgid "" -"Public keys allow for the passwordless SSH logins with a higher security " -"compared to the use of plain passwords. In order to upload a new key to the " -"device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:214 -msgid "Public prefix routed to this device for distribution to clients." -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 -msgid "QMI Cellular" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:41 -msgid "Quality" -msgstr "Qualitat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 -msgid "" -"Query all available upstream DNS " -"servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1465 -msgid "R0 Key Lifetime" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1471 -msgid "R1 Key Holder" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 -msgid "RFC3947 NAT-T mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:939 -msgid "RSSI threshold for joining" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:903 -msgid "RTS/CTS Threshold" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 -msgid "RX" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:142 -msgid "RX Rate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2072 -msgid "RX Rate / TX Rate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 -msgid "Radius-Accounting-Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 -msgid "Radius-Accounting-Secret" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 -msgid "Radius-Accounting-Server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 -msgid "Radius-Authentication-Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 -msgid "Radius-Authentication-Secret" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -msgid "Radius-Authentication-Server" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:102 -msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:178 -msgid "" -"Read /etc/ethers to configure the DHCP-Server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:402 -msgid "Really switch protocol?" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:75 -msgid "Realtime Graphs" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1448 -msgid "Reassociation Deadline" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:293 -msgid "Rebind protection" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:20 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:126 -msgid "Reboot" -msgstr "Reaviar" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:153 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:162 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 -msgid "Rebooting…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 -msgid "Reboots the operating system of your device" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:25 -msgid "Receive" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:83 -msgid "Recommended. IP addresses of the WireGuard interface." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:348 -msgid "Reconnect this interface" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:56 -msgid "References" -msgstr "Referéncias" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2725 -msgid "Refreshing" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 -msgid "Relay" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 -msgid "Relay Bridge" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 -msgid "Relay between networks" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_relay.lua:12 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:64 -msgid "Relay bridge" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 -msgid "Remote IPv4 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 -msgid "Remote IPv4 address or FQDN" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 -msgid "Remote IPv6 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 -msgid "Remote IPv6 address or FQDN" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:849 -msgid "Remove" -msgstr "Levar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 -msgid "Replace wireless configuration" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 -msgid "Request IPv6-address" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:23 -msgid "Request IPv6-prefix of length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:408 -msgid "Request timeout" -msgstr "Temps passat per la requèsta" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:90 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:97 -msgid "Require incoming checksum (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 -msgid "Require incoming packets serialization (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 -msgid "Required" -msgstr "Requesit" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 -msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:61 -msgid "Required. Base64-encoded private key for this interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:139 -msgid "Required. Base64-encoded public key of peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:148 -msgid "" -"Required. IP addresses and prefixes that this peer is allowed to use inside " -"the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " -"routes through the tunnel." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 -msgid "Requires hostapd" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1246 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1247 -msgid "Requires hostapd with EAP Suite-B support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1244 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1245 -msgid "Requires hostapd with EAP support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1248 -msgid "Requires hostapd with OWE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1242 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1243 -msgid "Requires hostapd with SAE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 -msgid "Requires hostapd with WEP support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 -msgid "" -"Requires the 'full' version of wpad/hostapd and support from the wifi driver " -"
(as of Jan 2019: ath9k, ath10k, mwlwifi and mt76)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:233 -msgid "" -"Requires upstream supports DNSSEC; verify unsigned domain responses really " -"come from unsigned domains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1253 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1254 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1267 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1268 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1269 -msgid "Requires wpa-supplicant" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1260 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1261 -msgid "Requires wpa-supplicant with EAP Suite-B support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1258 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1259 -msgid "Requires wpa-supplicant with EAP support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1262 -msgid "Requires wpa-supplicant with OWE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1256 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1272 -msgid "Requires wpa-supplicant with SAE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1251 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1252 -msgid "Requires wpa-supplicant with WEP support" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:224 -msgid "Reselection policy for primary slave" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2203 -#: modules/luci-base/luasrc/view/sysauth.htm:39 -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 -#: modules/luci-compat/luasrc/view/cbi/footer.htm:30 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 -msgid "Reset" -msgstr "Reinicializar" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:308 -msgid "Reset Counters" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:376 -msgid "Reset to defaults" -msgstr "Reïnicializar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:162 -msgid "Resolv and Hosts Files" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 -msgid "Resolve file" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 -msgid "Resource not found" -msgstr "Ressorsa introbabla" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:350 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:817 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 -msgid "Restart" -msgstr "Reaviar" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 -msgid "Restart Firewall" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:815 -msgid "Restart radio interface" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:372 -msgid "Restore" -msgstr "Restablir" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:382 -msgid "Restore backup" -msgstr "Restaurar salvagarda" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:371 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:372 -msgid "Reveal/hide password" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4053 -msgid "Revert" -msgstr "Tornar" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4138 -msgid "Revert changes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4320 -msgid "Revert request failed with status %h" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4300 -msgid "Reverting configuration…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 -msgid "Root directory for files served via TFTP" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:297 -msgid "Root preparation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 -msgid "Round-Robin policy (balance-rr, 0)" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:159 -msgid "Route Allowed IPs" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:73 -msgid "Route table" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:60 -msgid "Route type" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:625 -msgid "Router Advertisement-Service" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 -msgid "Router Password" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:15 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:194 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:27 -msgid "Routes" -msgstr "Rotas" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:15 -msgid "" -"Routes specify over which interface and gateway a certain host or network " -"can be reached." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:206 -msgid "Rule" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:335 -msgid "Run a filesystem check before mounting the device" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:335 -msgid "Run filesystem check" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2364 -msgid "Runtime error" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:219 -msgid "SHA256" -msgstr "SHA256" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:175 -msgid "SNR" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 -msgid "SSH Access" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:70 -msgid "SSH server address" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:74 -msgid "SSH server port" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:58 -msgid "SSH username" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 -msgid "SSH-Keys" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:42 -msgid "SSID" -msgstr "SSID" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 -msgid "SSTP" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 -msgid "SSTP Server" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:339 -msgid "SWAP" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2866 -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2198 -#: modules/luci-compat/luasrc/view/cbi/error.htm:17 -#: modules/luci-compat/luasrc/view/cbi/footer.htm:26 -#: modules/luci-compat/luasrc/view/cbi/header.htm:20 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:435 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:123 -msgid "Save" -msgstr "Salvagardar" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2180 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4049 -#: modules/luci-compat/luasrc/view/cbi/footer.htm:22 -msgid "Save & Apply" -msgstr "Salvagardar e aplicar" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:602 -msgid "Save error" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:406 -msgid "Save mtdblock" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 -msgid "Save mtdblock contents" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:822 -msgid "Scan" -msgstr "Analisar" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:26 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:76 -msgid "Scheduled Tasks" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4033 -msgid "Section added" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4035 -msgid "Section removed" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:331 -msgid "See \"mount\" manpage for details" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:257 -msgid "" -"Select 'Force upgrade' to flash the image even if the image format check " -"fails. Use only if you are sure that the firmware is correct and meant for " -"your device!" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2622 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2762 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2927 -msgid "Select file…" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:318 -msgid "Selects the transmit hash policy to use for slave selection" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:144 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:102 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:125 -msgid "" -"Send LCP echo requests at the given interval in seconds, only effective in " -"conjunction with failure threshold" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 -msgid "Send the hostname of this device" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:157 -msgid "Server Settings" -msgstr "Paramètres del servidor" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 -msgid "Service Name" -msgstr "Nom de servici" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:87 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:71 -msgid "Service Type" -msgstr "Tipe de servici" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 -msgid "Services" -msgstr "Servicis" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2668 -msgid "Session expired" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:107 -msgid "Set VPN as Default Route" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:864 -msgid "" -"Set interface properties regardless of the link carrier (If set, carrier " -"sense events do not invoke hotplug handlers)." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:300 -msgid "Set same MAC Address to all slaves" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:642 -msgid "Set this interface as master for the dhcpv6 relay." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:304 -msgid "Set to currently active slave (active, 1)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 -msgid "Set to first slave added to the bond (follow, 2)" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 -msgid "Setting PLMN failed" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:565 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 -msgid "Setup DHCP Server" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Severely Errored Seconds (SES)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:208 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:80 -msgid "Short GI" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1085 -msgid "Short Preamble" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 -msgid "Show current backup file list" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:264 -msgid "Show empty chains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:354 -msgid "Shutdown this interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1661 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:41 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:141 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:173 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:179 -msgid "Signal" -msgstr "Senhal" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2071 -msgid "Signal / Noise" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Signal Attenuation (SATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:260 -msgid "Signal:" -msgstr "Senhal :" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3786 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:217 -msgid "Size" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:361 -msgid "Size of DNS query cache" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 -msgid "Size of the ZRam device in megabytes" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/footer.htm:18 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:57 -msgid "Skip" -msgstr "Ignorar" - -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:36 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 -msgid "Skip to content" -msgstr "" - -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:35 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 -msgid "Skip to navigation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:178 -msgid "Slave Interfaces" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2883 -#: modules/luci-compat/luasrc/model/network.lua:1428 -msgid "Software VLAN" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/header.htm:5 -msgid "Some fields are invalid, cannot save values!" -msgstr "" - -#: modules/luci-base/luasrc/view/error404.htm:9 -msgid "Sorry, the object you requested was not found." -msgstr "" - -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:414 -msgid "" -"Sorry, there is no sysupgrade support present; a new firmware image must be " -"flashed manually. Please refer to the wiki for device specific install " -"instructions." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:69 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:182 -msgid "Source" -msgstr "Font" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:84 -msgid "Source Address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:50 -msgid "Source interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 -msgid "" -"Specifies that duplicate frames (received on inactive ports) should be " -"dropped or delivered" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 -msgid "Specifies the ARP link monitoring frequency in milliseconds" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 -msgid "Specifies the IP addresses to use for ARP monitoring" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 -msgid "Specifies the MII link monitoring frequency in milliseconds" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:259 -msgid "Specifies the aggregation selection logic to use" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:292 -msgid "Specifies the directory the device is attached to" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:252 -msgid "" -"Specifies the mac-address for the actor in protocol packet exchanges " -"(LACPDUs). If empty, masters' mac address defaults to system default" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 -msgid "" -"Specifies the maximum amount of failed ARP requests until hosts are presumed " -"to be dead" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 -msgid "" -"Specifies the maximum amount of seconds after which hosts are presumed to be " -"dead" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:886 -msgid "" -"Specifies the maximum transmit power the wireless radio may use. Depending " -"on regulatory requirements and wireless usage, the actual transmit power may " -"be reduced by the driver." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:236 -msgid "" -"Specifies the minimum number of links that must be active before asserting " -"carrier" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:200 -msgid "Specifies the mode to be used for this bonding interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 -msgid "" -"Specifies the number of IGMP membership reports to be issued after a " -"failover event in 200ms intervals" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:276 -msgid "" -"Specifies the number of packets to transmit through a slave before moving to " -"the next one" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:310 -msgid "" -"Specifies the number of peer notifications (gratuitous ARPs and unsolicited " -"IPv6 Neighbor Advertisements) to be issued after a failover event" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:284 -msgid "" -"Specifies the number of seconds between instances where the bonding driver " -"sends learning packets to each slaves peer switch" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 -msgid "Specifies the quantity of ARP IP targets that must be reachable" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:268 -msgid "" -"Specifies the rate in which the link partner will be asked to transmit " -"LACPDU packets" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:225 -msgid "" -"Specifies the reselection policy for the primary slave when failure of the " -"active slave or recovery of the primary slave occurs" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:244 -msgid "Specifies the system priority" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 -msgid "" -"Specifies the time in milliseconds to wait before disabling a slave after a " -"link failure detection" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 -msgid "" -"Specifies the time in milliseconds to wait before enabling a slave after a " -"link recovery detection" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 -msgid "" -"Specifies whether ARP probes and replies should be validated or non-ARP " -"traffic should be filtered for link monitoring" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:301 -msgid "" -"Specifies whether active-backup mode should set all slaves to the same MAC " -"address at enslavement" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 -msgid "" -"Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " -"netif_carrier_ok()" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:293 -msgid "" -"Specifies whether to shuffle active flows across slaves based on the load" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:179 -msgid "" -"Specifies which slave interfaces should be attached to this bonding interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:212 -msgid "" -"Specifies which slave is the primary device. It will always be the active " -"slave while it is available" -msgstr "" - -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:72 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:67 -msgid "Specify a TOS (Type of Service)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:72 -msgid "" -"Specify a TOS (Type of Service). Can be either inherit (the " -"outer header inherits the value of the inner header) or an hexadecimal value " -"starting with 0x (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:72 -msgid "" -"Specify a TTL (Time to Live) for the encapsulating packet other than the " -"default (64) (optional)." -msgstr "" - -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 -msgid "" -"Specify a TTL (Time to Live) for the encapsulating packet other than the " -"default (64)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:72 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:77 -msgid "" -"Specify a Traffic Class. Can be either inherit (the outer " -"header inherits the value of the inner header) or an hexadecimal value " -"starting with 0x (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:67 -msgid "" -"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " -"bytes) (optional)." -msgstr "" - -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 -msgid "" -"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " -"bytes)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1931 -msgid "Specify the secret encryption key here." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:581 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 -msgid "Start" -msgstr "Debuta" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 -msgid "Start priority" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -msgid "Start refresh" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4253 -msgid "Starting configuration apply…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 -msgid "Starting wireless scan..." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:109 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 -msgid "Startup" -msgstr "Aviada" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:19 -msgid "Static IPv4 Routes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:19 -msgid "Static IPv6 Routes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:165 -msgid "Static Leases" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 -msgid "Static Routes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1981 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:172 -#: modules/luci-compat/luasrc/model/network.lua:967 -msgid "Static address" -msgstr "Adreça estatica" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:411 -msgid "" -"Static leases are used to assign fixed IP addresses and symbolic hostnames " -"to DHCP clients. They are also required for non-dynamic interface " -"configurations where only hosts with a corresponding lease are served." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 -msgid "Station inactivity limit" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:385 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:871 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 -msgid "Status" -msgstr "Estatut" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:356 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 -msgid "Stop" -msgstr "Arrestar" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 -msgid "Stop refresh" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 -msgid "Strict order" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 -msgid "Strong" -msgstr "Fòrt" - -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1956 -msgid "Submit" -msgstr "Sometre" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:203 -msgid "Suppress logging" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:204 -msgid "Suppress logging of the routine operation of these protocols" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:44 -msgid "Swap free" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 -msgid "Switch" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:172 -msgid "Switch %q" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 -msgid "" -"Switch %q has an unknown topology - the VLAN settings might not be accurate." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2883 -#: modules/luci-compat/luasrc/model/network.lua:1426 -msgid "Switch VLAN" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:403 -msgid "Switch protocol" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:103 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 -#: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 -msgid "Switch to CIDR list notation" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -msgid "Symbolic link" -msgstr "Ligam simbolic" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:75 -msgid "Sync with NTP-Server" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:67 -msgid "Sync with browser" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:99 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 -msgid "System" -msgstr "Sistèma" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:25 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:39 -msgid "System Log" -msgstr "Jornal sistèma" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:243 -msgid "System Priority" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:104 -msgid "System Properties" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:141 -msgid "System log buffer size" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:336 -msgid "TCP:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:163 -msgid "TFTP Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:371 -msgid "TFTP server root" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 -msgid "TX" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:142 -msgid "TX Rate" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:17 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:166 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:184 -msgid "Table" -msgstr "Tablèu" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:31 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:163 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:181 -msgid "Target" -msgstr "Cibla" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 -msgid "Target network" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 -msgid "Terminate" -msgstr "Terminar" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 -msgid "The block mount command failed with code %d" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 -msgid "" -"The HE.net endpoint update configuration changed, you must now use the plain " -"username instead of the user ID!" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 -msgid "The IPv4 address or the fully-qualified domain name of the remote end." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 -msgid "" -"The IPv4 address or the fully-qualified domain name of the remote tunnel end." -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 -msgid "The IPv6 address or the fully-qualified domain name of the remote end." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 -msgid "" -"The IPv6 address or the fully-qualified domain name of the remote tunnel end." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 -msgid "" -"The IPv6 prefix assigned to the provider, usually ends with ::" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1916 -msgid "" -"The allowed characters are: A-Z, a-z, 0-9 and _" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/error.htm:6 -msgid "The configuration file could not be loaded due to the following error:" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4129 -msgid "" -"The device could not be reached within %d seconds after applying the pending " -"changes, which caused the configuration to be rolled back for safety " -"reasons. If you believe that the configuration changes are correct " -"nonetheless, perform an unchecked configuration apply. Alternatively, you " -"can dismiss this warning and edit changes before attempting to apply again, " -"or revert all pending changes to keep the currently working configuration " -"state." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:280 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:392 -msgid "" -"The device file of the memory or partition (e.g." -" /dev/sda1)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:736 -msgid "" -"The existing wireless configuration needs to be changed for LuCI to function " -"properly." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:215 -msgid "" -"The flash image was uploaded. Below is the checksum and file size listed, " -"compare them with the original file to ensure data integrity.
Click " -"\"Proceed\" below to start the flash procedure." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:195 -msgid "The following rules are currently active on this system." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 -msgid "The gateway address must not be a local IP address" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:147 -msgid "The given SSH public key has already been added." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:153 -msgid "" -"The given SSH public key is invalid. Please supply proper public RSA or " -"ECDSA keys." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:716 -msgid "The interface name is already used" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:722 -msgid "The interface name is too long" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 -msgid "" -"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " -"addresses." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 -msgid "The length of the IPv6 prefix in bits" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:163 -msgid "The local IPv4 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 -msgid "The local IPv4 address over which the tunnel is created (optional)." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:169 -msgid "The local IPv4 netmask" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:46 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 -msgid "The local IPv6 address over which the tunnel is created (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 -msgid "The network name is already used" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 -msgid "" -"The network ports on this device can be combined to several VLANs in which computers can " -"communicate directly with each other. VLANs are often used to separate different network " -"segments. Often there is by default one Uplink port for a connection to the " -"next greater network like the internet and other ports for a local network." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 -msgid "The reboot command failed with code %d" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 -msgid "The restore command failed with code %d" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -msgid "The selected %s mode is incompatible with %s encryption" -msgstr "" - -#: modules/luci-base/luasrc/view/csrftoken.htm:11 -msgid "The submitted security token is invalid or already expired!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 -msgid "" -"The system is erasing the configuration partition now and will reboot itself " -"when finished." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:291 -msgid "" -"The system is flashing now.
DO NOT POWER OFF THE DEVICE!
Wait a " -"few minutes before you try to reconnect. It might be necessary to renew the " -"address of your computer to reach the device again, depending on your " -"settings." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 -msgid "" -"The system is rebooting now. If the restored configuration changed the " -"current LAN IP address, you might need to reconnect manually." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 -msgid "The system password has been successfully changed." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 -msgid "The sysupgrade command failed with code %d" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 -msgid "" -"The uploaded backup archive appears to be valid and contains the files " -"listed below. Press \"Continue\" to restore the backup and reboot, or " -"\"Cancel\" to abort the operation." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 -msgid "The uploaded backup archive is not readable" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 -msgid "The uploaded firmware does not allow keeping current configuration." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:239 -msgid "" -"The uploaded image file does not contain a supported format. Make sure that " -"you choose the generic image format for your platform." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:52 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 -msgid "There are no active leases" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 -msgid "There are no changes to apply" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:55 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:213 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:56 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:282 -msgid "" -"There is no password set on this router. Please configure a root password to " -"protect the web interface." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 -msgid "This IPv4 address of the relay" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 -msgid "This authentication type is not applicable to the selected EAP method." -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 -msgid "This does not look like a valid PEM file" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 -msgid "" -"This file may contain lines like 'server=/domain/1.2.3.4' or " -"'server=1.2.3.4' for domain-specific or full upstream DNS servers." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:426 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 -msgid "" -"This is a list of shell glob patterns for matching files and directories to " -"include during sysupgrade. Modified files in /etc/config/ and certain other " -"configurations are automatically preserved." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 -msgid "" -"This is either the \"Update Key\" configured for the tunnel or the account " -"password if no update key has been configured" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 -msgid "" -"This is the content of /etc/rc.local. Insert your own commands here (in " -"front of 'exit 0') to execute them at the end of the boot process." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 -msgid "" -"This is the local endpoint address assigned by the tunnel broker, it usually " -"ends with ...:2/64" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:173 -msgid "" -"This is the only DHCP in the local network" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 -msgid "This is the plain username for logging into the account" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 -msgid "" -"This is the prefix routed to you by the tunnel broker for use by clients" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:28 -msgid "This is the system crontab in which scheduled tasks can be defined." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 -msgid "" -"This is usually the address of the nearest PoP operated by the tunnel broker" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 -msgid "" -"This list gives an overview over currently running system processes and " -"their status." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1505 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1563 -msgid "" -"This option cannot be used because the ca-bundle package is not installed." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2205 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2511 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 -msgid "This section contains no values yet" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:110 -msgid "Time Synchronization" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1093 -msgid "Time interval for rekeying GTK" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 -msgid "Timezone" -msgstr "Fus orari" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2678 -msgid "To login…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:372 -msgid "" -"To restore configuration files, you can upload a previously generated backup " -"archive here. To reset the firmware to its initial state, click \"Perform " -"reset\" (only possible with squashfs images)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:907 -msgid "Tone" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 -msgid "Total Available" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:103 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -msgid "Traceroute" -msgstr "Traceroute" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:96 -msgid "Traffic" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:72 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:77 -msgid "Traffic Class" -msgstr "Classa del trafic" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 -msgid "Transfer" -msgstr "Transferir" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 -msgid "Transmit" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:317 -msgid "Transmit Hash Policy" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:74 -msgid "Trigger" -msgstr "Desenclavador" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:19 -msgid "Trigger Mode" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:69 -msgid "Tunnel ID" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2886 -#: modules/luci-compat/luasrc/model/network.lua:1431 -msgid "Tunnel Interface" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:44 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 -msgid "Tunnel Link" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 -msgid "Tx-Power" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:44 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 -msgid "Type" -msgstr "Tipe" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:326 -msgid "UDP:" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:90 -msgid "UMTS only" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 -msgid "UMTS/GPRS/EV-DO" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:254 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:360 -msgid "UUID" -msgstr "UUID" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:16 -#: modules/luci-base/htdocs/luci-static/resources/network.js:17 -#: modules/luci-compat/luasrc/model/network.lua:34 -#: modules/luci-compat/luasrc/model/network.lua:35 -msgid "Unable to determine device name" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:18 -#: modules/luci-compat/luasrc/model/network.lua:36 -msgid "Unable to determine external IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:19 -#: modules/luci-compat/luasrc/model/network.lua:37 -msgid "Unable to determine upstream interface" -msgstr "" - -#: modules/luci-base/luasrc/view/error404.htm:11 -msgid "Unable to dispatch" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 -msgid "Unable to load log data:" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:22 -msgid "Unable to obtain client ID" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:221 -msgid "Unable to obtain mount information" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:278 -msgid "Unable to reset ip6tables counters: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 -msgid "Unable to reset iptables counters: %s" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 -msgid "Unable to resolve AFTR host name" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:20 -#: modules/luci-compat/luasrc/model/network.lua:38 -msgid "Unable to resolve peer host name" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:284 -msgid "Unable to restart firewall: %s" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:20 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:342 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:57 -msgid "Unable to save contents: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Unavailable Seconds (UAS)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/fs.js:102 -msgid "Unexpected reply data format" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1983 -#: modules/luci-compat/luasrc/model/network.lua:971 -msgid "Unknown" -msgstr "Desconegut" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 -msgid "Unknown and unsupported connection method." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2292 -#: modules/luci-compat/luasrc/model/network.lua:1138 -msgid "Unknown error (%s)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:412 -msgid "Unknown error code" -msgstr "Còde d'error desconegut" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1980 -#: modules/luci-base/htdocs/luci-static/resources/protocol/none.js:6 -#: modules/luci-compat/luasrc/model/network.lua:965 -msgid "Unmanaged" -msgstr "Pas gerit" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:195 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:217 -msgid "Unmount" -msgstr "Desmontar" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:112 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:259 -msgid "Unnamed key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3973 -msgid "Unsaved Changes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:410 -msgid "Unspecified error" -msgstr "Error pas precisada" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 -msgid "Unsupported MAP type" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 -msgid "Unsupported modem" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:267 -msgid "Unsupported protocol type." -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 -msgid "Up" -msgstr "Amont" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:410 -msgid "Up Delay" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3860 -msgid "Upload" -msgstr "Mandadís" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:413 -msgid "" -"Upload a sysupgrade-compatible image here to replace the running firmware." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:138 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:169 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 -msgid "Upload archive..." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2816 -msgid "Upload file" -msgstr "Enviar un fichièr" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2791 -msgid "Upload file…" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2738 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3848 -msgid "Upload request failed: %s" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3767 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3821 -msgid "Uploading file…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:737 -msgid "" -"Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " -"assigned with a name in the form wifinet# and the network will be " -"restarted to apply the updated configuration." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 -msgid "Uptime" -msgstr "Temps de connexion" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 -msgid "Use /etc/ethers" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:269 -msgid "Use DHCP advertised servers" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 -msgid "Use DHCP gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:124 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:39 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:116 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:59 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:103 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:90 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:77 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:100 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:69 -msgid "Use DNS servers advertised by peer" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:565 -msgid "Use ISO/IEC 3166 alpha2 country codes." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:56 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:97 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:77 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:75 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:92 -msgid "Use MTU on tunnel interface" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:93 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:73 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:57 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 -msgid "Use TTL on tunnel interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 -msgid "Use XOR of hardware MAC addresses (layer2)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:321 -msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 -msgid "" -"Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " -"(encap2+3)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294 -msgid "Use as external overlay (/overlay)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 -msgid "Use as root filesystem (/)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 -msgid "Use broadcast flag" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:860 -msgid "Use builtin IPv6-management" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:43 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:182 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:127 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:42 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:62 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:106 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:93 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:67 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:80 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:103 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:72 -msgid "Use custom DNS servers" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:116 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:56 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:100 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:87 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:61 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:74 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:97 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:61 -msgid "Use default gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:48 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:230 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:119 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:51 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:88 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:68 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:52 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:70 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:83 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:153 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:67 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:111 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:98 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:72 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:85 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:108 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:64 -msgid "Use gateway metric" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:96 -msgid "Use legacy MAP" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:96 -msgid "" -"Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " -"instead of RFC7597" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 -msgid "Use routing table" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1498 -msgid "Use system certificates" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1556 -msgid "Use system certificates for inner-tunnel" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 -msgid "" -"Use the Add Button to add a new lease entry. The MAC-Address identifies the host, the IPv4-Address specifies the fixed " -"address to use, and the Hostname is assigned as a symbolic name to " -"the requesting host. The optional Lease time can be used to set non-" -"standard host-specific lease time, e.g. 12h, 3d or infinite." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 -msgid "Use upper layer protocol information (layer3+4)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 -msgid "" -"Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 -msgid "Used" -msgstr "Utilizat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 -msgid "Used Key Slot" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 -msgid "" -"Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " -"needed with normal WPA(2)-PSK." -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -msgid "User Group" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -msgid "User certificate (PEM encoded)" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 -msgid "User key (PEM encoded)" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:106 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -msgid "Username" -msgstr "Nom d'utilizaire" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 -msgid "VC-Mux" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "VDSL" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 -msgid "VLANs on %q" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 -msgid "VPN" -msgstr "VPN" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 -msgid "VPN Local address" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:46 -msgid "VPN Local port" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 -msgid "VPN Server" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:99 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 -msgid "VPN Server port" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 -msgid "VPN Server's certificate SHA1 hash" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_vpnc.lua:9 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:9 -msgid "VPNC (CISCO 3000 (and others) VPN)" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 -msgid "VXLAN (RFC7348)" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 -msgid "VXLAN network identifier" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 -msgid "VXLANv6 (RFC7348)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1498 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1556 -msgid "" -"Validate server certificate using built-in system CA bundle,
requires " -"the \"ca-bundle\" package" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 -msgid "Validation for all slaves" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 -msgid "Validation only for active slave" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 -msgid "Validation only for backup slaves" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:154 -msgid "Value must not be empty" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 -msgid "Vendor" -msgstr "Vendeire" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:55 -msgid "Vendor Class to send when requesting DHCP" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 -msgid "Verifying the uploaded image file." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:59 -msgid "Virtual dynamic interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1032 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1033 -msgid "WDS" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1217 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1306 -msgid "WEP Open System" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1218 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1307 -msgid "WEP Shared Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1931 -msgid "WEP passphrase" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1070 -msgid "WMM Mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1931 -msgid "WPA passphrase" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1208 -msgid "" -"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " -"and ad-hoc mode) to be installed." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 -msgid "Waiting for device..." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:168 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:178 -msgid "Warning" -msgstr "Avertiment" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26 -msgid "Warning: There are unsaved changes that will get lost on reboot!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 -msgid "Weak" -msgstr "Feble" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1460 -msgid "" -"When using a PSK, the PMK can be automatically generated. When enabled, the " -"R0/R1 key options below are not applied. Disable this to use the R0 and R1 " -"key options." -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:468 -msgid "Width" -msgstr "Largor" - -#: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:29 -msgid "WireGuard VPN" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:87 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 -msgid "Wireless" -msgstr "Inalambric" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2874 -#: modules/luci-compat/luasrc/model/network.lua:1419 -msgid "Wireless Adapter" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2853 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4057 -#: modules/luci-compat/luasrc/model/network.lua:1405 -#: modules/luci-compat/luasrc/model/network.lua:1868 -msgid "Wireless Network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:753 -msgid "Wireless Overview" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:922 -msgid "Wireless Security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:735 -msgid "Wireless configuration migration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:47 -msgid "Wireless is disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:47 -msgid "Wireless is not associated" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 -msgid "Wireless network is disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 -msgid "Wireless network is enabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:275 -msgid "Write received DNS requests to syslog" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:160 -msgid "Write system log to file" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 -msgid "XOR policy (balance-xor, 2)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3643 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:344 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:109 -msgid "Yes" -msgstr "Òc" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 -msgid "Yes (none, 0)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 -msgid "" -"You appear to be currently connected to the device via the \"%h\" interface. " -"Do you really want to shut down the interface?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 -msgid "" -"You can enable or disable installed init scripts here. Changes will applied " -"after a device reboot.
Warning: If you disable essential init " -"scripts like \"network\", your device might become inaccessible!" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:65 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:223 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:294 -msgid "" -"You must enable JavaScript in your browser or LuCI will not work properly." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:115 -msgid "" -"You must select a primary interface which is included in selected slave " -"interfaces!" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:96 -msgid "" -"You must select at least one ARP IP target if ARP monitoring is selected!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 -msgid "ZRam Compression Algorithm" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 -msgid "ZRam Compression Streams" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 -msgid "ZRam Settings" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 -msgid "ZRam Size" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 -msgid "any" -msgstr "Quin que siá" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:908 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:921 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1157 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:103 -msgid "auto" -msgstr "auto" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:85 -msgid "automatic" -msgstr "automatic" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 -msgid "baseT" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 -msgid "bridged" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:401 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:35 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:99 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:31 -msgid "create" -msgstr "crear" - -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:69 -msgid "create:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:55 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:62 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:83 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:87 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:173 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:174 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:178 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:179 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:261 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:264 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:267 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:271 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:274 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:277 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:303 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:304 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:305 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:309 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:310 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:311 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:313 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:314 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:315 -msgid "dBm" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1014 -msgid "disable" -msgstr "desactivar" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:185 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:626 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:638 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 -msgid "disabled" -msgstr "desactivat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:519 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:553 -msgid "driver default" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:81 -msgid "e.g: --proxy 10.10.10.10" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:83 -msgid "e.g: dump" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:69 -msgid "expired" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:182 -msgid "" -"file where given DHCP-leases will be stored" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:195 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:61 -msgid "forward" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 -msgid "full-duplex" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 -msgid "half-duplex" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:569 -msgid "hexadecimal encoded value" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1738 -msgid "hidden" -msgstr "amagat" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:629 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:640 -msgid "hybrid mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:36 -msgid "if target is a network" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 -msgid "ignore" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:191 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 -msgid "input" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:395 -msgid "key between 8 and 63 characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:407 -msgid "key with either 5 or 13 characters" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:189 -msgid "local DNS file" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -msgid "medium security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1465 -msgid "minutes" -msgstr "minutas" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 -msgid "netif_carrier_ok()" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 -msgid "no" -msgstr "non" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 -msgid "no link" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:59 -msgid "non-empty value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3007 -msgid "none" -msgstr "pas res" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:41 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:55 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:69 -msgid "not present" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:197 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:245 -msgid "off" -msgstr "desactivat" - -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:196 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:242 -msgid "on" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 -msgid "open network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 -msgid "output" -msgstr "sortida" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:241 -msgid "positive decimal value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:233 -msgid "positive integer value" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 -msgid "random" -msgstr "aleatòri" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:628 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:639 -msgid "relay mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 -msgid "routed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1093 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 -msgid "sec" -msgstr "seg" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -msgid "server mode" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:53 -msgid "sstpc Log-level" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 -msgid "stateful-only" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:647 -msgid "stateless" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:648 -msgid "stateless + stateful" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1315 -msgid "strong security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 -msgid "tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1448 -msgid "time units (TUs / 1.024 ms) [1000-65535]" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:559 -msgid "unique value" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:534 -msgid "unknown" -msgstr "desconegut" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:340 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:522 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:543 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:40 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:67 -msgid "unlimited" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3372 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:369 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:393 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:428 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:465 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:561 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:53 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:38 -msgid "unspecified" -msgstr "pas precisat" - -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 -msgid "unspecified -or- create:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:350 -msgid "untagged" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:246 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:121 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:132 -msgid "valid IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:246 -msgid "valid IP address or prefix" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:281 -msgid "valid IPv4 CIDR" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:254 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:125 -msgid "valid IPv4 address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:254 -msgid "valid IPv4 address or network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:374 -msgid "valid IPv4 address:port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:314 -msgid "valid IPv4 network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:276 -msgid "valid IPv4 or IPv6 CIDR" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:267 -msgid "valid IPv4 prefix value (0-32)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:286 -msgid "valid IPv6 CIDR" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:262 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:129 -msgid "valid IPv6 address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:262 -msgid "valid IPv6 address or prefix" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:304 -msgid "valid IPv6 host id" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:319 -msgid "valid IPv6 network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:272 -msgid "valid IPv6 prefix value (0-128)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:340 -msgid "valid MAC address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:411 -msgid "valid UCI identifier" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:362 -msgid "valid UCI identifier, hostname or IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:383 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:386 -msgid "valid address:port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:533 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 -msgid "valid date (YYYY-MM-DD)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:237 -msgid "valid decimal value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:405 -msgid "valid hexadecimal WEP key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:393 -msgid "valid hexadecimal WPA key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:368 -msgid "valid host:port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:355 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:357 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:73 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:107 -msgid "valid hostname" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:345 -msgid "valid hostname or IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:229 -msgid "valid integer value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:309 -msgid "valid network in address/netmask notation" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:508 -msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:332 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:335 -msgid "valid port or port range (port1-port2)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:324 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:136 -msgid "valid port value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:513 -msgid "valid time (HH:MM:SS)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 -msgid "value between %d and %d characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:416 -msgid "value between %f and %f" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:420 -msgid "value greater or equal to %f" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:424 -msgid "value smaller or equal to %f" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:429 -msgid "value with %d characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 -msgid "value with at least %d characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:445 -msgid "value with at most %d characters" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 -msgid "weak security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 -msgid "yes" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:20 -msgid "« Back" -msgstr "" diff --git a/luci-base/po/templates/base.pot b/luci-base/po/templates/base.pot deleted file mode 100755 index d23111f55..000000000 --- a/luci-base/po/templates/base.pot +++ /dev/null @@ -1,7611 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:929 -msgid "%.1f dB" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:114 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:261 -msgid "%d Bit" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3689 -msgid "%d invalid field(s)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:35 -msgid "%s is untagged in multiple VLANs!" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:294 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:403 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:270 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:307 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:325 -msgid "(%d minute window, %d second interval)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:118 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:124 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:258 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:282 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:88 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:91 -msgid "(empty)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:351 -#: modules/luci-compat/luasrc/view/cbi/network_netinfo.htm:23 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:58 -msgid "(no interfaces attached)" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:48 -msgid "-- Additional Field --" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/cbi.js:275 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3372 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3704 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:767 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1005 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1974 -#: modules/luci-compat/luasrc/view/cbi/header.htm:8 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:88 -msgid "-- Please choose --" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/cbi.js:276 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1006 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:1975 -#: modules/luci-compat/luasrc/view/cbi/header.htm:9 -msgid "-- custom --" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:270 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:379 -msgid "-- match by label --" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:256 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:362 -msgid "-- match by uuid --" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:27 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:44 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:23 -msgid "-- please select --" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:54 -msgctxt "sstp log level value" -msgid "0" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:939 -msgid "0 = not using RSSI threshold, 1 = do not change driver default" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:55 -msgctxt "sstp log level value" -msgid "1" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:231 -msgid "1 Minute Load:" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:251 -msgid "15 Minute Load:" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:56 -msgctxt "sstp log level value" -msgid "2" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:57 -msgctxt "sstp log level value" -msgid "3" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:58 -msgctxt "sstp log level value" -msgid "4" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1442 -msgid "4-character hexadecimal ID" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:18 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:11 -msgid "464XLAT (CLAT)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:241 -msgid "5 Minute Load:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1471 -msgid "6-octet identifier as a hex string - no colons" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 -msgid "802.11r Fast Transition" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 -msgid "802.11w Association SA Query maximum timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1626 -msgid "802.11w Association SA Query retry timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 -msgid "802.11w Management Frame Protection" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619 -msgid "802.11w maximum timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1626 -msgid "802.11w retry timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:956 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:326 -msgid "DNS query port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:317 -msgid "DNS server port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:260 -msgid "" -"DNS servers will be queried in the " -"order of the resolvfile" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:945 -msgid "ESSID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:475 -msgid "IPv4-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:42 -msgid "IPv4-Gateway" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:603 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:36 -msgid "IPv4-Netmask" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:31 -msgid "" -"IPv6-Address or Network " -"(CIDR)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:42 -msgid "IPv6-Gateway" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:504 -msgid "IPv6-Suffix (hex)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:58 -msgid "LED Configuration" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:69 -msgid "LED Name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:431 -msgid "MAC-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:498 -msgid "DUID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:335 -msgid "" -"Max. DHCP leases" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:344 -msgid "" -"Max. EDNS0 packet size" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:353 -msgid "Max. concurrent queries" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:29 -msgid "" -"
Note: you need to manually restart the cron service if the crontab file " -"was empty before editing." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2720 -msgid "A directory with the same name already exists." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2670 -msgid "A new login is required since the authentication session expired." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:909 -msgid "A43C + J43 + A43" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:910 -msgid "A43C + J43 + A43 + V43" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:922 -msgid "ADSL" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:898 -msgid "ANSI T1.413" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:94 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:93 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:86 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:67 -msgid "APN" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:197 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:352 -msgid "ARP" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:365 -msgid "ARP IP Targets" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:357 -msgid "ARP Interval" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:381 -msgid "ARP Validation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:373 -msgid "ARP mode to consider a slave as being up" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:77 -msgid "ARP monitoring is not supported for the selected policy!" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 -msgid "ARP retry threshold" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:917 -msgid "ATM (Asynchronous Transfer Mode)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:938 -msgid "ATM Bridges" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:970 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:66 -msgid "ATM Virtual Channel Identifier (VCI)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:971 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:70 -msgid "ATM Virtual Path Identifier (VPI)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:938 -msgid "" -"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " -"Linux network interfaces which can be used in conjunction with DHCP or PPP " -"to dial into the provider network." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:977 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:62 -msgid "ATM device number" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:37 -msgid "ATU-C System Vendor ID" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:265 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:543 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:547 -msgid "Absent Interface" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 -msgid "Access Concentrator" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:927 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1032 -msgid "Access Point" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:360 -msgid "Actions" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:200 -msgid "Active IPv4-Routes" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:206 -msgid "Active IPv6-Routes" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:81 -msgid "Active Connections" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:33 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:92 -msgid "Active DHCP Leases" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:52 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:94 -msgid "Active DHCPv6 Leases" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:203 -msgid "Active-Backup policy (active-backup, 1)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3666 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:929 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:23 -msgid "Ad-Hoc" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:208 -msgid "Adaptive load balancing (balance-alb, 6)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:207 -msgid "Adaptive transmit load balancing (balance-tlb, 5)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2167 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2170 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2184 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2185 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3170 -#: modules/luci-compat/luasrc/view/cbi/nsection.htm:25 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:189 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:197 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:39 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:47 -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:54 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:827 -msgid "Add" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:942 -msgid "Add ATM Bridge" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:92 -msgid "Add IPv4 address…" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:207 -msgid "Add IPv6 address…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:65 -msgid "Add LED action" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:219 -msgid "Add VLAN" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:15 -msgid "Add instance" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:146 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:152 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:247 -msgid "Add key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:248 -msgid "Add local domain suffix to names served from hosts files" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:311 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:757 -msgid "Add new interface..." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:125 -msgid "Add peer" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:200 -msgid "Additional Hosts files" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:255 -msgid "Additional servers file" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:34 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:35 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:36 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:37 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:38 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:39 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:40 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:41 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:43 -msgid "Address" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 -msgid "Address to access local relay bridge" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:285 -msgid "Addresses" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:3 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:15 -msgid "Administration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:164 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:324 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:553 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:968 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:25 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:866 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:924 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:241 -msgid "Advanced Settings" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:28 -msgid "Aggregate Transmit Power (ACTATP)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:258 -msgid "Aggregation Selection Logic" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:261 -msgid "Aggregator: All slaves down or has no slaves (stable, 0)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:263 -msgid "" -"Aggregator: Chosen by the largest number of ports + slave added/removed or " -"state changes (count, 2)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:262 -msgid "Aggregator: Slave added/removed or state changes (bandwidth, 1)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:171 -msgid "Alert" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2871 -#: modules/luci-compat/luasrc/model/network.lua:1417 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:61 -msgid "Alias Interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:145 -msgid "Alias of \"%s\"" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:263 -msgid "All Servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:209 -msgid "" -"Allocate IP addresses sequentially, starting from the lowest available " -"address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:208 -msgid "Allocate IP sequentially" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 -msgid "Allow SSH password authentication" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1112 -msgid "Allow AP mode to disconnect STAs based on low ACK condition" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1016 -msgid "Allow all except listed" -msgstr "" - -#: modules/luci-compat/root/usr/share/rpcd/acl.d/luci-compat.json:3 -msgid "Allow full UCI access for legacy applications" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:892 -msgid "Allow legacy 802.11b rates" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1015 -msgid "Allow listed only" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:300 -msgid "Allow localhost" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:157 -msgid "Allow rebooting the device" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 -msgid "Allow remote hosts to connect to local SSH forwarded ports" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow root logins with password" -msgstr "" - -#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:3 -msgid "Allow system feature probing" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:31 -msgid "Allow the root user to login with password" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:301 -msgid "" -"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:148 -msgid "Allowed IPs" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:654 -msgid "Always announce default router" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/none.js:5 -msgid "Always off (kernel: none)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:6 -msgid "Always on (kernel: default-on)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 -msgid "" -"Always use 40MHz channels even if the secondary channel overlaps. Using this " -"option does not comply with IEEE 802.11n-2009!" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:603 -msgid "An error occurred while saving the form:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:890 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:20 -msgid "Annex" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:891 -msgid "Annex A + L + M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:899 -msgid "Annex A G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:900 -msgid "Annex A G.992.2" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:901 -msgid "Annex A G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:902 -msgid "Annex A G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:892 -msgid "Annex B (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:895 -msgid "Annex B G.992.1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:896 -msgid "Annex B G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:897 -msgid "Annex B G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:893 -msgid "Annex J (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:903 -msgid "Annex L G.992.3 POTS 1" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:894 -msgid "Annex M (all)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:904 -msgid "Annex M G.992.3" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:905 -msgid "Annex M G.992.5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:654 -msgid "Announce as default router even if no public prefix is available." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:659 -msgid "Announced DNS domains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:658 -msgid "Announced DNS servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1596 -msgid "Anonymous Identity" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 -msgid "Anonymous Mount" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 -msgid "Anonymous Swap" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:84 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:174 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:195 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:60 -msgid "Any zone" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:119 -msgid "Apply backup?" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4276 -msgid "Apply request failed with status %h" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2181 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4142 -msgid "Apply unchecked" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4215 -msgid "Applying configuration changes… %ds" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:56 -msgid "Architecture" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:184 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 -msgid "" -"Assign a part of given length of every public IPv6-prefix to this interface" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:189 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:31 -msgid "" -"Assign prefix parts using this hexadecimal subprefix ID for this interface." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2078 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:245 -msgid "Associated Stations" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:46 -msgid "Associations" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 -msgid "Attempt to enable configured mount points for attached devices" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:104 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:64 -msgid "Auth Group" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1535 -msgid "Authentication" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:96 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:70 -msgid "Authentication Type" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:172 -msgid "Authoritative" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:17 -msgid "Authorization Required" -msgstr "" - -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:196 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:197 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:241 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:244 -msgid "Auto Refresh" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:106 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:18 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:24 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:98 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:50 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:94 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:81 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:55 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:68 -msgid "Automatic" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_hnet.lua:7 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:7 -msgid "Automatic Homenet (HNCP)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 -msgid "Automatically check filesystem for errors before mounting" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 -msgid "Automatically mount filesystems on hotplug" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 -msgid "Automatically mount swap on hotplug" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:170 -msgid "Automount Filesystem" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:166 -msgid "Automount Swap" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:193 -msgid "Available" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:268 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:278 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:329 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:339 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:349 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:234 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:244 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:254 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:263 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:273 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:291 -msgid "Average:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:911 -msgid "B43 + B43C" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:912 -msgid "B43 + B43C + V43" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:48 -msgid "BR / DMR / AFTR" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:182 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1665 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:44 -msgid "BSSID" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/footer.htm:14 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:48 -msgid "Back to Overview" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:48 -msgid "Back to configuration" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:363 -msgid "Backup" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:114 -msgid "Backup / Flash Firmware" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:323 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:12 -msgid "Backup file list" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:158 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:451 -msgid "Band" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:910 -msgid "Beacon Interval" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:324 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:46 -msgid "" -"Below is the determined list of files to backup. It consists of changed " -"configuration files marked by opkg, essential base files and the user " -"defined backup patterns." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:395 -msgid "" -"Bind dynamically to interfaces rather than wildcard address (recommended as " -"linux default)" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:52 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 -msgid "Bind interface" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:52 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:48 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:55 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:57 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:52 -msgid "Bind the tunnel to this interface (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:63 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:266 -msgid "Bogus NX Domain Override" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:199 -msgid "Bonding Policy" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2877 -#: modules/luci-compat/luasrc/model/network.lua:1421 -msgid "Bridge" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:730 -msgid "Bridge interfaces" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:978 -msgid "Bridge unit number" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:412 -msgid "Bring up on boot" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:205 -msgid "Broadcast policy (broadcast, 3)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2810 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3799 -msgid "Browse…" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:37 -msgid "Buffered" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:138 -msgid "CA certificate; if empty it will be saved after the first connection." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:7 -msgid "CLAT configuration failed" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:72 -msgid "CPU usage (%)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:41 -msgid "Cached" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:53 -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:53 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:21 -msgid "Call failed" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2903 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3808 -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:14 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:52 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:187 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:763 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1952 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:128 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:272 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:184 -msgid "Cancel" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:17 -msgid "Category" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 -msgid "Certificate constraint (Domain)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1516 -msgid "Certificate constraint (SAN)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 -msgid "Certificate constraint (Subject)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1522 -msgid "Certificate constraint (Wildcard)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1513 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1571 -msgid "" -"Certificate constraint substring - e.g. /CN=wifi.mycompany.com
See " -"`logread -f` during handshake for actual values" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1519 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 -msgid "" -"Certificate constraint(s) against DNS SAN values (if available)
or " -"Subject CN (exact match)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1522 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -msgid "" -"Certificate constraint(s) against DNS SAN values (if available)
or " -"Subject CN (suffix match)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1516 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 -msgid "" -"Certificate constraint(s) via Subject Alternate Name values
(supported " -"attributes: EMAIL, DNS, URI) - e.g. DNS:wifi.mycompany.com" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:200 -msgid "Chain" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4028 -msgid "Changes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4311 -msgid "Changes have been reverted." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 -msgid "Changes the administrator password for accessing the device" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:162 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:460 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1663 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:62 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:174 -msgid "Check filesystems before mount" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 -msgid "Check this option to delete the existing networks from this radio." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:110 -msgid "Checking archive…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:193 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:195 -msgid "Checking image…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:399 -msgid "Choose mtdblock" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1942 -msgid "" -"Choose the firewall zone you want to assign to this interface. Select " -"unspecified to remove the interface from the associated zone or " -"fill out the custom field to define a new zone and attach the " -"interface to it." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 -msgid "" -"Choose the network(s) you want to attach to this wireless interface or fill " -"out the custom field to define a new network." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1148 -msgid "Cipher" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:91 -msgid "Cisco UDP encapsulation" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:363 -msgid "" -"Click \"Generate archive\" to download a tar archive of the current " -"configuration files." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 -msgid "" -"Click \"Save mtdblock\" to download specified mtdblock file. (NOTE: THIS " -"FEATURE IS FOR PROFESSIONALS! )" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3665 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:928 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1033 -msgid "Client" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:52 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:47 -msgid "Client ID to send when requesting DHCP" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:148 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:154 -msgid "Close" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:157 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:141 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:106 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:115 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:138 -msgid "" -"Close inactive connection after the given amount of seconds, use 0 to " -"persist connection" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:49 -msgid "Close list..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:42 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2076 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:389 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:317 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:320 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:204 -msgid "Collecting data..." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:71 -msgid "Command" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:401 -msgid "Command OK" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:33 -msgid "Command failed" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:72 -msgid "Comment" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1634 -msgid "" -"Complicates key reinstallation attacks on the client side by disabling " -"retransmission of EAPOL-Key frames that are used to install keys. This " -"workaround might cause interoperability issues and reduced robustness of key " -"negotiation especially in environments with heavy traffic load." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:96 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:98 -msgid "Compute outgoing checksum (optional)." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4028 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:426 -msgid "Configuration" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4190 -msgid "Configuration changes applied." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4128 -msgid "Configuration changes have been rolled back!" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:63 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:21 -msgid "Configuration failed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:175 -msgid "Confirm disconnect" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:55 -msgid "Confirmation" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:51 -msgid "Connected" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:9 -#: modules/luci-compat/luasrc/model/network.lua:27 -msgid "Connection attempt failed" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:40 -msgid "Connection attempt failed." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:411 -msgid "Connection lost" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:117 -msgid "Connections" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:377 -msgid "Consider the slave up when all ARP IP targets are reachable (all, 1)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:376 -msgid "Consider the slave up when any ARP IP target is reachable (any, 0)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:18 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:340 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:55 -msgid "Contents have been saved." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:742 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:132 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:264 -msgid "Continue" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4164 -msgid "" -"Could not regain access to the device after applying the configuration " -"changes. You might need to reconnect if you modified network related " -"settings such as the IP address or wireless security credentials." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:189 -msgid "Country" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:889 -msgid "Country Code" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1942 -msgid "Create / Assign firewall-zone" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:798 -msgid "Create interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:416 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:730 -msgid "Creates a bridge over specified interface(s)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:170 -msgid "Critical" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:174 -msgid "Cron Log Level" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:533 -msgid "Current power" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:568 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:570 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:51 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:53 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:82 -#: modules/luci-compat/luasrc/view/cbi/network_ifacelist.htm:83 -msgid "Custom Interface" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:36 -msgid "Custom delegated IPv6-prefix" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:382 -msgid "" -"Custom files (certificates, scripts) may remain on the system. To prevent " -"this, perform a factory-reset first." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:6 -msgid "Custom flash interval (kernel: timer)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:59 -msgid "" -"Customizes the behaviour of the device LEDs if possible." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1353 -msgid "DAE-Client" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1358 -msgid "DAE-Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1363 -msgid "DAE-Secret" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:327 -msgid "DHCP Server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:155 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:50 -msgid "DHCP and DNS" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1982 -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:16 -#: modules/luci-compat/luasrc/model/network.lua:969 -msgid "DHCP client" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:619 -msgid "DHCP-Options" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_dhcpv6.lua:7 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:7 -msgid "DHCPv6 client" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -msgid "DHCPv6-Mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:631 -msgid "DHCPv6-Service" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:45 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:46 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:47 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:48 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:49 -msgid "DNS" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:277 -msgid "DNS forwardings" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:37 -msgid "DNS-Label / FQDN" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:228 -msgid "DNSSEC" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:232 -msgid "DNSSEC check unsigned" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:99 -msgid "DPD Idle Timeout" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:41 -msgid "DS-Lite AFTR address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:887 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:45 -msgid "DSL" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:14 -msgid "DSL Status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:920 -msgid "DSL line mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 -msgid "DTIM Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:57 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:58 -msgid "DUID" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:22 -msgid "Data Rate" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:165 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:176 -msgid "Debug" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1358 -msgid "Default %d" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:107 -msgid "Default Route" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:108 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:150 -msgid "Default gateway" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:646 -msgid "Default is stateless + stateful" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:11 -msgid "Default state" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:619 -msgid "" -"Define additional DHCP options, for example " -"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " -"servers to clients." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2237 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2662 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2666 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3154 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2872 -#: modules/luci-compat/luasrc/view/cbi/nsection.htm:11 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:162 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:16 -msgid "Delete" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:180 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:186 -msgid "Delete key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2769 -msgid "Delete request failed: %s" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:847 -msgid "Delete this network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1088 -msgid "Delivery Traffic Indication Message Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:340 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:134 -msgid "Description" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2868 -msgid "Deselect" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:220 -msgid "Design" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:384 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:70 -msgid "Destination" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:48 -msgid "Destination port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 -msgid "Destination zone" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:67 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:191 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:43 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:55 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:12 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:247 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:280 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:356 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:392 -msgid "Device" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:861 -msgid "Device Configuration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:132 -msgid "Device is not active" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:224 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:599 -msgid "Device is restarting…" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:45 -msgid "Device not managed by ModemManager." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4163 -msgid "Device unreachable!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:53 -msgid "Device unreachable! Still waiting for device..." -msgstr "" - -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:88 -msgid "Diagnostics" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:101 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:93 -msgid "Dial number" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2665 -msgid "Directory" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:839 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 -msgid "Disable" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:579 -msgid "" -"Disable DHCP for " -"this interface." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:373 -msgid "Disable DNS lookups" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 -msgid "Disable Encryption" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1098 -msgid "Disable Inactivity Polling" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:837 -msgid "Disable this network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1608 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:107 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:99 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:51 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:95 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:82 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:56 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:69 -msgid "Disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1112 -msgid "Disassociate On Low Acknowledgement" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:294 -msgid "Discard upstream RFC1918 responses" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:197 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:665 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:231 -msgid "Disconnect" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:64 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:22 -msgid "Disconnection attempt failed" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:48 -msgid "Disconnection attempt failed." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:606 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2861 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3309 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4045 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4134 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1688 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:330 -msgid "Dismiss" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 -msgid "Distance Optimization" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:895 -msgid "Distance to farthest network member in meters." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:155 -msgid "" -"Dnsmasq is a combined DHCP-Server and DNS-" -"Forwarder for NAT " -"firewalls" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:252 -msgid "Do not cache negative replies, e.g. for not existing domains" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:79 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:81 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:86 -msgid "Do not create host route to peer (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:219 -msgid "Do not forward requests that cannot be answered by public name servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:214 -msgid "Do not forward reverse lookups for local networks" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:25 -msgid "Do not send a hostname" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2755 -msgid "Do you really want to delete \"%s\" ?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:181 -msgid "Do you really want to delete the following SSH key?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:94 -msgid "Do you really want to erase all settings?" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2753 -msgid "Do you really want to recursively delete the directory \"%s\" ?" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:168 -msgid "Domain required" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:307 -msgid "Domain whitelist" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:81 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 -msgid "Don't Fragment" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:169 -msgid "" -"Don't forward DNS-Requests without " -"DNS-Name" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 -msgid "Down" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:402 -msgid "Down Delay" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:366 -msgid "Download backup" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:404 -msgid "Download mtdblock" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:925 -msgid "Downstream SNR offset" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2620 -msgid "Drag to reorder" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:341 -msgid "Drop Duplicate Frames" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:12 -msgid "Dropbear Instance" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 -msgid "" -"Dropbear offers SSH network shell access " -"and an integrated SCP server" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:14 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:11 -msgid "Dual-Stack Lite (RFC6333)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:595 -msgid "Dynamic DHCP" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 -msgid "Dynamic tunnel" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:595 -msgid "" -"Dynamically allocate DHCP addresses for clients. If disabled, only clients " -"having static leases will be served." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:67 -msgid "EA-bits length" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1491 -msgid "EAP-Method" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2640 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2643 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3017 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:154 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:160 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:339 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:844 -msgid "Edit" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/error.htm:13 -msgid "" -"Edit the raw configuration data above to fix any error and hit \"Save\" to " -"reload the page." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:842 -msgid "Edit this network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:793 -msgid "Edit wireless network" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:172 -msgid "Emergency" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:839 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:879 -msgid "Enable" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -msgid "" -"Enable IGMP " -"snooping" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:460 -msgid "Enable STP" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:174 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:367 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:373 -msgid "Enable DNS lookups" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:292 -msgid "Enable Dynamic Shuffling Of Flows" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60 -msgid "Enable HE.net dynamic endpoint update" -msgstr "" - -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:89 -msgid "Enable IPv6 negotiation" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:93 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 -msgid "Enable IPv6 negotiation on the PPP link" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:192 -msgid "Enable Jumbo Frame passthrough" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:240 -msgid "Enable NTP client" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 -msgid "Enable Single DES" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:368 -msgid "Enable TFTP server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:184 -msgid "Enable VLAN functionality" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1638 -msgid "Enable WPS pushbutton, requires WPA(2)-PSK/WPA3-SAE" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1634 -msgid "Enable key reinstallation (KRACK) countermeasures" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:187 -msgid "Enable learning and aging" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:198 -msgid "Enable mirroring of incoming packets" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:199 -msgid "Enable mirroring of outgoing packets" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 -msgid "" -"Enable packet steering across all CPUs. May help or hinder network speed." -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:80 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:75 -msgid "Enable rx checksum" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:81 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:67 -msgid "Enable the DF (Don't Fragment) flag of the encapsulating packets." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:837 -msgid "Enable this network" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:84 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:79 -msgid "Enable tx checksum" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:243 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:352 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:66 -msgid "Enabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:462 -msgid "Enables IGMP snooping on this bridge" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1431 -msgid "" -"Enables fast roaming among access points that belong to the same Mobility " -"Domain" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:460 -msgid "Enables the Spanning Tree Protocol on this bridge" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:59 -msgid "Encapsulation limit" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:915 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:973 -msgid "Encapsulation mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1117 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1666 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:45 -msgid "Encryption" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:161 -msgid "Endpoint Host" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:165 -msgid "Endpoint Port" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 -msgid "Enter custom value" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/dropdown.htm:16 -msgid "Enter custom values" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:97 -msgid "Erasing..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:103 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:104 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:105 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:106 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:169 -msgid "Error" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:30 -msgid "Errored seconds (ES)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2889 -#: modules/luci-compat/luasrc/model/network.lua:1433 -msgid "Ethernet Adapter" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2880 -#: modules/luci-compat/luasrc/model/network.lua:1423 -msgid "Ethernet Switch" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:270 -msgid "Every 30 seconds (slow, 0)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:271 -msgid "Every second (fast, 1)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:406 -msgid "Exclude interfaces" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:247 -msgid "Expand hosts" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:198 -msgid "Expecting a hexadecimal assignment hint" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:64 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:73 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:107 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:121 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:125 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:129 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:132 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:136 -msgid "Expecting: %s" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:48 -msgid "Expecting: non-empty value" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:50 -msgid "Expires" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:591 -msgid "" -"Expiry time of leased addresses, minimum is 2 minutes (2m)." -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:19 -msgid "External" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -msgid "External R0 Key Holder List" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1486 -msgid "External R1 Key Holder List" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:146 -msgid "External system log server" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:151 -msgid "External system log server port" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:156 -msgid "External system log server protocol" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:79 -msgid "Extra SSH command options" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:83 -msgid "Extra pppd options" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:81 -msgid "Extra sstpc options" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1456 -msgid "FT over DS" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1457 -msgid "FT over the Air" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1454 -msgid "FT protocol" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:87 -msgid "Failed to change the system password." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4122 -msgid "Failed to confirm apply within %ds, waiting for rollback…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:37 -msgid "Failed to execute \"/etc/init.d/%s %s\" action: %s" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2673 -msgid "File" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2620 -msgid "File not accessible" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2811 -msgid "Filename" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:381 -msgid "Filename of the boot image advertised to clients" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:191 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:314 -msgid "Filesystem" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:213 -msgid "Filter private" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:218 -msgid "Filter useless" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:388 -msgid "Filtering for all slaves, no validation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:389 -msgid "Filtering for all slaves, validation only for active slave" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:390 -msgid "Filtering for all slaves, validation only for backup slaves" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:65 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:23 -msgid "Finalizing failed" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 -msgid "" -"Find all currently attached filesystems and swap and replace configuration " -"with defaults based on what was detected" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:820 -msgid "Find and join network" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:9 -msgid "Finish" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:15 -msgid "Firewall" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:102 -msgid "Firewall Mark" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:326 -msgid "Firewall Settings" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:297 -msgid "Firewall Status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:932 -msgid "Firmware File" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:57 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:327 -msgid "Fixed source port for outbound DNS queries" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:283 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:421 -msgid "Flash image..." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:279 -msgid "Flash image?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:411 -msgid "Flash new firmware image" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:356 -msgid "Flash operations" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:288 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:290 -msgid "Flashing…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:598 -msgid "Force" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:907 -msgid "Force 40MHz mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1158 -msgid "Force CCMP (AES)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:598 -msgid "Force DHCP on this network even if another server is detected." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1159 -msgid "Force TKIP" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1160 -msgid "Force TKIP and CCMP (AES)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:864 -msgid "Force link" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:255 -msgid "Force upgrade" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:90 -msgid "Force use of NAT-T" -msgstr "" - -#: modules/luci-base/luasrc/view/csrftoken.htm:8 -msgid "Form token mismatch" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:164 -msgid "Forward DHCP traffic" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:29 -msgid "Forward Error Correction Seconds (FECS)" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:161 -msgid "Forward broadcast traffic" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:934 -msgid "Forward mesh peer traffic" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:980 -msgid "Forwarding mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899 -msgid "Fragmentation Threshold" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:115 -msgid "" -"Further information about WireGuard interfaces and peers at wireguard.com." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:128 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:184 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:62 -msgid "GHz" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:91 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:77 -msgid "GPRS only" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:10 -msgid "GRE tunnel over IPv4" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:10 -msgid "GRE tunnel over IPv6" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:10 -msgid "GRETAP tunnel over IPv4" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:10 -msgid "GRETAP tunnel over IPv6" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:44 -msgid "Gateway" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:36 -msgid "Gateway Ports" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:11 -#: modules/luci-compat/luasrc/model/network.lua:29 -msgid "Gateway address is invalid" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:124 -msgid "Gateway metric" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:161 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:323 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:24 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:240 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:108 -msgid "General Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:552 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:967 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:865 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:921 -msgid "General Setup" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:150 -msgid "Generate Config" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:66 -msgid "Generate Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1460 -msgid "Generate PMK locally" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:368 -msgid "Generate archive" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:79 -msgid "Given password confirmation did not match, password not changed!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:146 -msgid "Global Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:875 -msgid "Global network options" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:57 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:215 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:58 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:82 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:284 -msgid "Go to password configuration..." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2562 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3336 -#: modules/luci-compat/luasrc/view/cbi/full_valueheader.htm:4 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:58 -msgid "Go to relevant configuration page" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:33 -msgid "Grant access to DHCP configuration" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:102 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:111 -msgid "Grant access to DSL status display" -msgstr "" - -#: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3 -msgid "Grant access to LuCI OpenConnect procedures" -msgstr "" - -#: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3 -msgid "Grant access to LuCI Wireguard procedures" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:19 -msgid "Grant access to SSH configuration" -msgstr "" - -#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12 -msgid "Grant access to basic LuCI procedures" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:64 -msgid "Grant access to crontab configuration" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:60 -msgid "Grant access to firewall status" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:116 -msgid "Grant access to flash operations" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:86 -msgid "Grant access to main status display" -msgstr "" - -#: protocols/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json:3 -msgid "Grant access to mmcli" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:84 -msgid "Grant access to mount configuration" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3 -msgid "Grant access to network configuration" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:46 -msgid "Grant access to network diagnostic tools" -msgstr "" - -#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36 -msgid "Grant access to network status information" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13 -msgid "Grant access to process status" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3 -msgid "Grant access to realtime statistics" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:42 -msgid "Grant access to startup configuration" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3 -msgid "Grant access to system configuration" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30 -msgid "Grant access to system logs" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:120 -msgid "Grant access to wireless status display" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66 -msgid "Group Password" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:22 -msgid "Guest" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 -msgid "HE.net password" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 -msgid "HE.net username" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:46 -msgid "Hang Up" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:34 -msgid "Header Error Code Errors (HEC)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/heartbeat.js:5 -msgid "Heartbeat interval (kernel: heartbeat)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:100 -msgid "" -"Here you can configure the basic aspects of your device like its hostname or " -"the timezone." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1066 -msgid "Hide ESSID" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:264 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:303 -msgid "Hide empty chains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:55 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2070 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:140 -msgid "Host" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:22 -msgid "Host entries" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 -msgid "Host expiry timeout" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:31 -msgid "Host-IP or Network" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:102 -msgid "Host-Uniq tag content" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:36 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:419 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:27 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:54 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:29 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:121 -msgid "Hostname" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:22 -msgid "Hostname to send when requesting DHCP" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:20 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:63 -msgid "Hostnames" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:24 -msgid "Hybrid" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 -msgid "ID used to uniquely identify the VXLAN" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:206 -msgid "IEEE 802.3ad Dynamic link aggregation (802.3ad, 4)" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:75 -msgid "IKE DH Group" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:83 -msgid "IP Addresses" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:80 -msgid "IP Protocol" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:114 -msgid "IP Type" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js:31 -msgid "IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:10 -#: modules/luci-compat/luasrc/model/network.lua:28 -msgid "IP address is invalid" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:13 -#: modules/luci-compat/luasrc/model/network.lua:31 -msgid "IP address is missing" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:85 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:86 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:87 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:88 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:89 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:82 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:316 -msgid "IPv4 Firewall" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 -msgid "IPv4 Upstream" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:178 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:162 -msgid "IPv4 address" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:33 -msgid "IPv4 assignment length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:181 -msgid "IPv4 broadcast" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:180 -msgid "IPv4 gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:179 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:168 -msgid "IPv4 netmask" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:291 -msgid "IPv4 network in address/netmask notation" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:116 -msgid "IPv4 only" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:52 -msgid "IPv4 prefix" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 -msgid "IPv4 prefix length" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:83 -msgid "IPv4+IPv6" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:37 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:30 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:154 -msgid "IPv4-Address" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:164 -msgid "IPv4-Gateway" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ipip.lua:9 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:10 -msgid "IPv4-in-IPv4 (RFC2003)" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:115 -msgid "IPv4/IPv6 (both - defaults to IPv4)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:103 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:90 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:91 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:92 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:93 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:94 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:95 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:96 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:97 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:98 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:99 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:84 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:319 -msgid "IPv6 Firewall" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:203 -msgid "IPv6 Neighbours" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:554 -msgid "IPv6 Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:879 -msgid "IPv6 ULA-Prefix" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:29 -msgid "IPv6 Upstream" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:205 -msgid "IPv6 address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:189 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:31 -msgid "IPv6 assignment hint" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:184 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:27 -msgid "IPv6 assignment length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:210 -msgid "IPv6 gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:296 -msgid "IPv6 network in address/netmask notation" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:117 -msgid "IPv6 only" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 -msgid "IPv6 prefix" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 -msgid "IPv6 prefix length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:214 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 -msgid "IPv6 routed prefix" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:218 -msgid "IPv6 suffix" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 -msgid "IPv6 support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:57 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:172 -msgid "IPv6-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100 -msgid "IPv6-PD" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:13 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:10 -msgid "IPv6-in-IPv4 (RFC4213)" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:17 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:9 -msgid "IPv6-over-IPv4 (6rd)" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_6x4.lua:15 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:9 -msgid "IPv6-over-IPv4 (6to4)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1593 -msgid "Identity" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:96 -msgid "If checked, 1DES is enabled" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:51 -msgid "If checked, adds \"+ipv6\" to the pppd options" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:93 -msgid "If checked, encryption is disabled" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:254 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:360 -msgid "" -"If specified, mount the device by its UUID instead of a fixed device node" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:267 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:376 -msgid "" -"If specified, mount the device by the partition label instead of a fixed " -"device node" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:116 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:48 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:85 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:65 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:49 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:67 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:80 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:108 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:150 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:56 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:100 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:87 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:61 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:74 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:97 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:61 -msgid "If unchecked, no default route is configured" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:124 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:39 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:116 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:59 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:103 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:90 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:77 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:100 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:69 -msgid "If unchecked, the advertised DNS server addresses are ignored" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:339 -msgid "" -"If your physical memory is insufficient unused data can be temporarily " -"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " -"slow process as the swap-device cannot be accessed with the high datarates " -"of the RAM." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:197 -msgid "Ignore /etc/hosts" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:579 -msgid "Ignore interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:185 -msgid "Ignore resolve file" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:419 -msgid "Image" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:67 -msgid "In" -msgstr "" - -#: modules/luci-base/luasrc/view/csrftoken.htm:13 -msgid "" -"In order to prevent unauthorized access to the system, your request has been " -"blocked. Click \"Continue »\" below to return to the previous page." -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:157 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:141 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:106 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:115 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:138 -msgid "Inactivity timeout" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:265 -msgid "Inbound:" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:90 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:97 -msgid "Incoming checksum" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:82 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:87 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:89 -msgid "Incoming key" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 -msgid "Incoming serialization" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:166 -msgid "Info" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 -msgid "Information" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:67 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:25 -msgid "Initialization failure" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:77 -msgid "Initscript" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:111 -msgid "Initscripts" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1577 -msgid "Inner certificate constraint (Domain)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1574 -msgid "Inner certificate constraint (SAN)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1571 -msgid "Inner certificate constraint (Subject)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1580 -msgid "Inner certificate constraint (Wildcard)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:268 -msgid "Install protocol extensions..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1938 -msgid "" -"Instead of joining any network with a matching SSID, only connect to the " -"BSSID %h." -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/map.htm:43 -msgid "Insufficient permissions to read UCI configuration." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:464 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:471 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:735 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:739 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:27 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:156 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:174 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 -msgid "Interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:62 -msgid "Interface %q device auto-migrated from %q to %q." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:917 -msgid "Interface Configuration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:110 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:151 -msgid "Interface has %d pending changes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:92 -msgid "Interface is disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:64 -msgid "Interface is marked for deletion" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:209 -msgid "Interface is reconnecting..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:193 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:203 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:209 -msgid "Interface is shutting down..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:253 -msgid "Interface is starting..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:256 -msgid "Interface is stopping..." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 -msgid "Interface name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:122 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:272 -msgid "Interface not present or not connected yet." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:308 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:335 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:38 -msgid "Interfaces" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:20 -msgid "Internal" -msgstr "" - -#: modules/luci-base/luasrc/view/error500.htm:8 -msgid "Internal Server Error" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:283 -msgid "Interval For Sending Learning Packets" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:192 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:42 -msgid "Invalid" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:19 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:22 -msgid "Invalid Base64 key string" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:285 -msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:294 -msgid "Invalid VLAN ID given! Only unique IDs are allowed" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:403 -msgid "Invalid argument" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:46 -msgid "" -"Invalid bearer list. Possibly too many bearers created. This protocol " -"supports one and only one bearer." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:402 -msgid "Invalid command" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:106 -msgid "Invalid hexadecimal value" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:12 -msgid "Invalid username and/or password! Please try again." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:71 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:76 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:81 -msgid "Invalid value" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1075 -msgid "Isolate Clients" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:231 -msgid "" -"It appears that you are trying to flash an image that does not fit into the " -"flash memory, please verify the image file!" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:64 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:72 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:291 -msgid "JavaScript required!" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1746 -msgid "Join Network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1680 -msgid "Join Network: Wireless Scan" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1946 -msgid "Joining Network: %q" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:223 -msgid "Keep settings and retain the current configuration" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:20 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:51 -msgid "Kernel Log" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:58 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1369 -msgid "Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1397 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1398 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1399 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1400 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1412 -msgid "Key #%d" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:82 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:87 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:89 -msgid "Key for incoming packets (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 -msgid "Key for outgoing packets (optinal)." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:54 -msgid "Kill" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:21 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:10 -msgid "L2TP" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:40 -msgid "L2TP Server" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:267 -msgid "LACPDU Packets" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:131 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:102 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:76 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:89 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:112 -msgid "LCP echo failure threshold" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:144 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:102 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:125 -msgid "LCP echo interval" -msgstr "" - -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:101 -msgid "LED Configuration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:974 -msgid "LLC" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:267 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:376 -msgid "Label" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:209 -msgid "Language" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:111 -msgid "Language and Style" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:24 -msgid "Latency" -msgstr "" - -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:21 -msgid "Leaf" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:495 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:591 -msgid "Lease time" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:39 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:58 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:32 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:59 -msgid "Lease time remaining" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:181 -msgid "Leasefile" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:47 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 -msgid "Leave empty to autodetect" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 -msgid "Leave empty to use the current WAN address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4030 -msgid "Legend:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 -msgid "Limit" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:389 -msgid "Limit DNS service to subnets interfaces on which we are serving DNS." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:402 -msgid "Limit listening to these interfaces, and loopback." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:25 -msgid "Line Attenuation (LATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:18 -msgid "Line Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:17 -msgid "Line State" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:19 -msgid "Line Uptime" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:123 -msgid "Link Aggregation (Channel Bonding)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:348 -msgid "Link Monitoring" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:23 -msgid "Link On" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:278 -msgid "" -"List of DNS servers to forward " -"requests to" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1482 -msgid "" -"List of R0KHs in the same Mobility Domain.
Format: MAC-address,NAS-" -"Identifier,128-bit key as hex string.
This list is used to map R0KH-ID " -"(NAS Identifier) to a destination MAC address when requesting PMK-R1 key " -"from the R0KH that the STA used during the Initial Mobility Domain " -"Association." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1486 -msgid "" -"List of R1KHs in the same Mobility Domain.
Format: MAC-address,R1KH-ID " -"as 6 octets with colons,128-bit key as hex string.
This list is used " -"to map R1KH-ID to a destination MAC address when sending PMK-R1 key from the " -"R0KH. This is also the list of authorized R1KHs in the MD that can request " -"PMK-R1 keys." -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:82 -msgid "List of SSH key files for auth" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:308 -msgid "List of domains to allow RFC1918 responses for" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:286 -msgid "List of domains to force to an IP address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:267 -msgid "List of hosts that supply bogus NX domain results" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:401 -msgid "Listen Interfaces" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:78 -msgid "Listen Port" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17 -msgid "Listen only on the given interface or, if unspecified, on all" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:318 -msgid "Listening port for inbound DNS queries" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:87 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:54 -msgid "Load" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:61 -msgid "Load Average" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2938 -msgid "Loading directory contents…" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:1948 -#: modules/luci-base/luasrc/view/view.htm:4 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:12 -msgid "Loading view…" -msgstr "" - -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:77 -msgid "Local IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:12 -#: modules/luci-compat/luasrc/model/network.lua:30 -msgid "Local IP address is invalid" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:86 -msgid "Local IP address to assign" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:40 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:39 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:39 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:151 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 -msgid "Local IPv4 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:46 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:45 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 -msgid "Local IPv6 address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:388 -msgid "Local Service Only" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:115 -msgid "Local Startup" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:59 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:117 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:243 -msgid "Local domain" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:240 -msgid "" -"Local domain specification. Names matching this domain are never forwarded " -"and are resolved from DHCP or hosts files only" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:244 -msgid "Local domain suffix appended to DHCP names and hosts file entries" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:239 -msgid "Local server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:224 -msgid "" -"Localise hostname depending on the requesting subnet if multiple IPs are " -"available" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:223 -msgid "Localise queries" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1938 -msgid "Lock to BSSID" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:164 -msgid "Log output level" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:274 -msgid "Log queries" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:109 -msgid "Logging" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:50 -msgid "" -"Logical network from which to select the local endpoint if local IPv6 " -"address is empty and no WAN IPv6 is available (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:55 -msgid "Logical network to which the tunnel will be added (bridged) (optional)." -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:38 -msgid "Login" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:81 -msgid "Logout" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:32 -msgid "Loss of Signal Seconds (LOSS)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:581 -msgid "Lowest leased address as offset from the network address." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:47 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:82 -msgid "MAC" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:251 -msgid "MAC Address For The Actor" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2069 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:56 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:31 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:139 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:155 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:173 -msgid "MAC-Address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1011 -msgid "MAC-Address Filter" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:923 -msgid "MAC-Filter" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1018 -msgid "MAC-List" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:16 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:13 -msgid "MAP / LW4over6" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:62 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:7 -msgid "MAP rule is invalid" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:321 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:322 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:323 -msgid "MBit/s" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:218 -msgid "MD5" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:71 -msgid "MHz" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:353 -msgid "MII" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:421 -msgid "MII / ETHTOOL ioctls" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:394 -msgid "MII Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:54 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:97 -msgid "MTU" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:302 -msgid "" -"Make sure to clone the root filesystem using something like the commands " -"below:" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:108 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:100 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:52 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:96 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:83 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:57 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:70 -msgid "Manual" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3664 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:642 -msgid "Master" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:23 -msgid "Max. Attainable Data Rate (ATTNDR)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1107 -msgid "Maximum allowed Listen Interval" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:336 -msgid "Maximum allowed number of active DHCP leases" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:354 -msgid "Maximum allowed number of concurrent DNS queries" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:345 -msgid "Maximum allowed size of EDNS.0 UDP packets" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:112 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:104 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:93 -msgid "Maximum amount of seconds to wait for the modem to become ready" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:586 -msgid "Maximum number of leased addresses." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:886 -msgid "Maximum transmit power" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:129 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:188 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:199 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:63 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:71 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:327 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:328 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:329 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 -msgid "Medium" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:24 -msgid "Memory" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:73 -msgid "Memory usage (%)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3667 -msgid "Mesh" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 -msgid "Mesh ID" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:931 -msgid "Mesh Id" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:404 -msgid "Method not found" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349 -msgid "Method of link monitoring" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:418 -msgid "Method to determine link status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:165 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:183 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:92 -msgid "Metric" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:235 -msgid "Minimum Number of Links" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:202 -msgid "Mirror monitor port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:201 -msgid "Mirror source port" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:9 -msgid "Mobile Data" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1442 -msgid "Mobility Domain" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:154 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:157 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:180 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:442 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:926 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1664 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:43 -msgid "Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:55 -msgid "Model" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43 -msgid "Modem bearer teardown in progress." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42 -msgid "" -"Modem connection in progress. Please wait. This process will timeout after 2 " -"minutes." -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72 -msgid "Modem default" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:73 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:82 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:61 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:73 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:57 -msgid "Modem device" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41 -msgid "Modem disconnection in progress. Please wait." -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24 -msgid "Modem information query failed" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:112 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:104 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:93 -msgid "Modem init timeout" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:44 -msgid "Modem is disabled." -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:52 -msgid "ModemManager" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:3668 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1005 -msgid "Monitor" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 -msgid "More Characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2504 -msgid "More…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:192 -msgid "Mount Point" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:144 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:88 -msgid "Mount Points" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:229 -msgid "Mount Points - Mount Entry" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:340 -msgid "Mount Points - Swap Entry" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:228 -msgid "" -"Mount Points define at which point a memory device will be attached to the " -"filesystem" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:154 -msgid "Mount attached devices" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:162 -msgid "Mount filesystems not specifically configured" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:331 -msgid "Mount options" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:292 -msgid "Mount point" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:158 -msgid "Mount swap not specifically configured" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:223 -msgid "Mounted file systems" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:152 -msgid "Move down" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 -msgid "Move up" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 -msgid "NAS ID" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:87 -msgid "NAT-T Mode" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:41 -msgid "NAT64 Prefix" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:26 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:31 -msgid "NCM" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:637 -msgid "NDP-Proxy" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:72 -msgid "NT Domain" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:274 -msgid "NTP server candidates" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2542 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3785 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:27 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:710 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:67 -msgid "Name" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1916 -msgid "Name of the new network" -msgstr "" - -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:40 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:50 -msgid "Navigation" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:959 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2068 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:381 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:63 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:138 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:162 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:180 -msgid "Network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:68 -msgid "Network Utilities" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:380 -msgid "Network boot image" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:7 -msgid "Network device activity (kernel: netdev)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:15 -#: modules/luci-compat/luasrc/model/network.lua:33 -msgid "Network device is not present" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:55 -msgid "Network interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:777 -msgid "New interface for \"%s\" can not be created: %s" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:713 -msgid "New interface name…" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:11 -msgid "Next »" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3643 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:296 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:345 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:108 -msgid "No" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:562 -msgid "No DHCP Server configured for this interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1310 -msgid "No Encryption" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:87 -msgid "No Host Routes" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:89 -msgid "No NAT-T" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:79 -msgid "No RX signal" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:69 -msgid "No client associated" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:406 -msgid "No data received" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2878 -msgid "No entries in this directory" -msgstr "" - -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:82 -msgid "No files found" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:79 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:84 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:81 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:86 -msgid "No host route" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:674 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:241 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:59 -msgid "No information available" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:63 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:8 -msgid "No matching prefix delegation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:140 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:143 -msgid "No more slaves available" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:187 -msgid "No more slaves available, can not save interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:251 -msgid "No negative cache" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:54 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:212 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:55 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:79 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:279 -msgid "No password set!" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:130 -msgid "No peers defined yet" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:121 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:268 -msgid "No public keys present yet." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:90 -msgid "No rules in this chain." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:384 -msgid "No validation or filtering" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 -msgid "No zone assigned" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:141 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:174 -msgid "Noise" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:27 -msgid "Noise Margin (SNR)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:270 -msgid "Noise:" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:35 -msgid "Non Pre-emptive CRC errors (CRC_P)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:394 -msgid "Non-wildcard" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:159 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:183 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:100 -msgid "None" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:177 -msgid "Normal" -msgstr "" - -#: modules/luci-base/luasrc/view/error404.htm:8 -msgid "Not Found" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:75 -msgid "Not associated" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:45 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:120 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:146 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:280 -msgid "Not present" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:101 -msgid "Not started on boot" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:409 -msgid "Not supported" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167 -msgid "Notice" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:127 -msgid "Nslookup" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:332 -msgid "Number of IGMP membership reports" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:362 -msgid "Number of cached DNS entries (max is 10000, 0 is no caching)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 -msgid "Number of parallel threads used for compression" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:309 -msgid "Number of peer notifications after failover event" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69 -msgid "Obfuscated Group Password" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:61 -msgid "Obfuscated Password" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:105 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:97 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:49 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:93 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:80 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:54 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:67 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:93 -msgid "Obtain IPv6-Address" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:18 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:351 -msgid "Off" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:15 -msgid "Off-State Delay" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/default-on.js:18 -msgid "On" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:96 -msgid "On-Link route" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/timer.js:11 -msgid "On-State Delay" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:484 -msgid "One of hostname or mac address must be specified!" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:466 -msgid "One of the following: %s" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:17 -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:22 -msgid "One or more fields contain invalid values!" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/map.htm:32 -msgid "One or more invalid/required values on tab" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/nullsection.htm:19 -#: modules/luci-compat/luasrc/view/cbi/ucisection.htm:24 -msgid "One or more required fields have no value!" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229 -msgid "" -"Only if current active slave fails and the primary slave is up (failure, 2)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:444 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19 -msgid "Open list..." -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_openconnect.lua:9 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:64 -msgid "OpenConnect (CISCO AnyConnect)" -msgstr "" - -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:12 -msgid "OpenFortivpn" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:882 -msgid "Operating frequency" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:1971 -#: modules/luci-base/htdocs/luci-static/resources/form.js:3653 -msgid "Option \"%s\" contains an invalid input value." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:1984 -msgid "Option \"%s\" must not be empty." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4037 -msgid "Option changed" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4039 -msgid "Option removed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1609 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:92 -msgid "Optional" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:102 -msgid "" -"Optional. 32-bit mark for outgoing encrypted packets. Enter value in hex, " -"starting with 0x." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:218 -msgid "" -"Optional. Allowed values: 'eui64', 'random', fixed value like '::1' or " -"'::1:2'. When IPv6 prefix (like 'a:b:c:d::') is received from a delegating " -"server, use the suffix (like '::1') to form the IPv6 address ('a:b:c:d::1') " -"for the interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:143 -msgid "" -"Optional. Base64-encoded preshared key. Adds in an additional layer of " -"symmetric-key cryptography for post-quantum resistance." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:159 -msgid "Optional. Create routes for Allowed IPs for this peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:134 -msgid "Optional. Description of peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:87 -msgid "Optional. Do not create host routes to peers." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:161 -msgid "" -"Optional. Host of peer. Names are resolved prior to bringing up the " -"interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:97 -msgid "Optional. Maximum Transmission Unit of tunnel interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:165 -msgid "Optional. Port of peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:169 -msgid "" -"Optional. Seconds between keep alive messages. Default is 0 (disabled). " -"Recommended value if this device is behind a NAT is 25." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:78 -msgid "Optional. UDP port used for outgoing and incoming packets." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:71 -msgid "Options" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:346 -msgid "Other:" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:68 -msgid "Out" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:275 -msgid "Outbound:" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:96 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:98 -msgid "Outgoing checksum" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:86 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:91 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93 -msgid "Outgoing key" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:98 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:100 -msgid "Outgoing serialization" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50 -msgid "Output Interface" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:59 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:165 -msgid "Output zone" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:57 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:222 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:40 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:50 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:76 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:71 -msgid "Override MAC address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:61 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:226 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:67 -#: protocols/luci-proto-hnet/htdocs/luci-static/resources/protocol/hnet.js:44 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:54 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:120 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:158 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:71 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:145 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:132 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:110 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:119 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:97 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:77 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 -msgid "Override MTU" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:72 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:72 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:67 -msgid "Override TOS" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:72 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 -msgid "Override TTL" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1079 -msgid "Override default interface name" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 -msgid "Override the gateway in DHCP responses" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:603 -msgid "" -"Override the netmask sent to clients. Normally it is calculated from the " -"subnet that is served." -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 -msgid "Override the table used for internal routes" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:3 -msgid "Overview" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2721 -msgid "Overwrite existing file \"%s\" ?" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:70 -msgid "Owner" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:97 -msgid "PAP/CHAP (both)" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:98 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:108 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:90 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:45 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:89 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:76 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:44 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:63 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:82 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:46 -msgid "PAP/CHAP password" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:96 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:103 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:88 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:43 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:87 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:74 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:42 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:61 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:77 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:44 -msgid "PAP/CHAP username" -msgstr "" - -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:101 -msgid "PDP Type" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:69 -msgid "PID" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:95 -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:94 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:87 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:68 -msgid "PIN" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:21 -#: modules/luci-compat/luasrc/model/network.lua:39 -msgid "PIN code rejected" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1477 -msgid "PMK R1 Push" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:13 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:43 -msgid "PPP" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:58 -msgid "PPPoA Encapsulation" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:19 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:28 -msgid "PPPoATM" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:17 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:28 -msgid "PPPoE" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_pppossh.lua:9 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:28 -msgid "PPPoSSH" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ppp.lua:15 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:28 -msgid "PPtP" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:73 -msgid "PSID offset" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:70 -msgid "PSID-bits length" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:918 -msgid "PTM/EFM (Packet Transfer Mode)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:882 -msgid "Packet Steering" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -msgid "Packets" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:275 -msgid "Packets To Transmit Before Moving To Next Slave" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:152 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:825 -msgid "Part of zone %q" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:29 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1599 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:51 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:108 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:52 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:58 -msgid "Password" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:25 -msgid "Password authentication" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1531 -msgid "Password of Private Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1589 -msgid "Password of inner Private Key" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:31 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:35 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 -msgid "Password strength" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111 -msgid "Password2" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:239 -msgid "Paste or drag SSH key file…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1510 -msgid "Path to CA-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1525 -msgid "Path to Client-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1528 -msgid "Path to Private Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1568 -msgid "Path to inner CA-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1583 -msgid "Path to inner Client-Certificate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1586 -msgid "Path to inner Private Key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2731 -msgid "Paused" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:271 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js:281 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:332 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:342 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:352 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:237 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:247 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js:257 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:266 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:276 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:294 -msgid "Peak:" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:89 -msgid "Peer IP address to assign" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:14 -#: modules/luci-compat/luasrc/model/network.lua:32 -msgid "Peer address is missing" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:115 -msgid "Peers" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:80 -msgid "Perfect Forward Secrecy" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:93 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:98 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:100 -msgid "Perform outgoing packets serialization (optional)." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34 -msgid "Perform reboot" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:378 -msgid "Perform reset" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:407 -msgid "Permission denied" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:169 -msgid "Persistent Keep Alive" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:288 -msgid "Phy Rate:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:325 -msgid "Physical Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:80 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:90 -msgid "Ping" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:138 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:63 -msgid "Pkts." -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:19 -msgid "Please enter your username and password." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3768 -msgid "Please select the file to upload." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -msgid "Policy" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:21 -msgid "Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:278 -msgid "Port status:" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:492 -msgid "Potential negation of: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:38 -msgid "Power Management Mode" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:36 -msgid "Pre-emptive CRC errors (CRCP_P)" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:73 -msgid "Prefer LTE" -msgstr "" - -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:74 -msgid "Prefer UMTS" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:33 -msgid "Prefix Delegated" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:143 -msgid "Preshared Key" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:131 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:102 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:76 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:89 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:112 -msgid "" -"Presume peer to be dead after given amount of LCP echo failures, use 0 to " -"ignore failures" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:407 -msgid "Prevent listening on these interfaces." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1075 -msgid "Prevents client-to-client communication" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:211 -msgid "Primary Slave" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:228 -msgid "" -"Primary becomes active slave when it comes back up if speed and duplex " -"better than current slave (better, 1)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227 -msgid "Primary becomes active slave whenever it comes back up (always, 0)" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:61 -msgid "Private Key" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:64 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:63 -msgid "Processes" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:21 -msgid "Profile" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:66 -msgid "Prot." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:397 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:727 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:382 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js:32 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:265 -msgid "Provide NTP server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:825 -msgid "Provide new network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1004 -msgid "Pseudo Ad-Hoc (ahdemo)" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:139 -msgid "Public Key" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:275 -msgid "" -"Public keys allow for the passwordless SSH logins with a higher security " -"compared to the use of plain passwords. In order to upload a new key to the " -"device, paste an OpenSSH compatible public key line or drag a .pub file into the input field." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:214 -msgid "Public prefix routed to this device for distribution to clients." -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:9 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:27 -msgid "QMI Cellular" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:41 -msgid "Quality" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:264 -msgid "" -"Query all available upstream DNS " -"servers" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1465 -msgid "R0 Key Lifetime" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1471 -msgid "R1 Key Holder" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:88 -msgid "RFC3947 NAT-T mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:939 -msgid "RSSI threshold for joining" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:903 -msgid "RTS/CTS Threshold" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:48 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:83 -msgid "RX" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:142 -msgid "RX Rate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2072 -msgid "RX Rate / TX Rate" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1343 -msgid "Radius-Accounting-Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1348 -msgid "Radius-Accounting-Secret" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1338 -msgid "Radius-Accounting-Server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1328 -msgid "Radius-Authentication-Port" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1333 -msgid "Radius-Authentication-Secret" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1323 -msgid "Radius-Authentication-Server" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:102 -msgid "Raw hex-encoded bytes. Leave empty unless your ISP require this" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:178 -msgid "" -"Read /etc/ethers to configure the DHCP-Server" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:402 -msgid "Really switch protocol?" -msgstr "" - -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:75 -msgid "Realtime Graphs" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1448 -msgid "Reassociation Deadline" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:293 -msgid "Rebind protection" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:20 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:126 -msgid "Reboot" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:153 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:162 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:46 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:51 -msgid "Rebooting…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:21 -msgid "Reboots the operating system of your device" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:25 -msgid "Receive" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:83 -msgid "Recommended. IP addresses of the WireGuard interface." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:348 -msgid "Reconnect this interface" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:56 -msgid "References" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2725 -msgid "Refreshing" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_relay.lua:153 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:39 -msgid "Relay" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_relay.lua:157 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:36 -msgid "Relay Bridge" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:154 -msgid "Relay between networks" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_relay.lua:12 -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:64 -msgid "Relay bridge" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 -msgid "Remote IPv4 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 -msgid "Remote IPv4 address or FQDN" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 -msgid "Remote IPv6 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 -msgid "Remote IPv6 address or FQDN" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:849 -msgid "Remove" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1914 -msgid "Replace wireless configuration" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:17 -msgid "Request IPv6-address" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:23 -msgid "Request IPv6-prefix of length" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:408 -msgid "Request timeout" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:90 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:95 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:97 -msgid "Require incoming checksum (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:92 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:97 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:94 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:99 -msgid "Require incoming packets serialization (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1610 -msgid "Required" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 -msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:61 -msgid "Required. Base64-encoded private key for this interface." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:139 -msgid "Required. Base64-encoded public key of peer." -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:148 -msgid "" -"Required. IP addresses and prefixes that this peer is allowed to use inside " -"the tunnel. Usually the peer's tunnel IP addresses and the networks the peer " -"routes through the tunnel." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1239 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1240 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1241 -msgid "Requires hostapd" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1246 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1247 -msgid "Requires hostapd with EAP Suite-B support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1244 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1245 -msgid "Requires hostapd with EAP support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1248 -msgid "Requires hostapd with OWE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1242 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1243 -msgid "Requires hostapd with SAE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1237 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1238 -msgid "Requires hostapd with WEP support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1607 -msgid "" -"Requires the 'full' version of wpad/hostapd and support from the wifi driver " -"
(as of Jan 2019: ath9k, ath10k, mwlwifi and mt76)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:233 -msgid "" -"Requires upstream supports DNSSEC; verify unsigned domain responses really " -"come from unsigned domains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1253 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1254 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1255 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1267 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1268 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1269 -msgid "Requires wpa-supplicant" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1260 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1261 -msgid "Requires wpa-supplicant with EAP Suite-B support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1258 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1259 -msgid "Requires wpa-supplicant with EAP support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1262 -msgid "Requires wpa-supplicant with OWE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1256 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1257 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1272 -msgid "Requires wpa-supplicant with SAE support" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1251 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1252 -msgid "Requires wpa-supplicant with WEP support" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:224 -msgid "Reselection policy for primary slave" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2203 -#: modules/luci-base/luasrc/view/sysauth.htm:39 -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:17 -#: modules/luci-compat/luasrc/view/cbi/footer.htm:30 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:66 -msgid "Reset" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:308 -msgid "Reset Counters" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:376 -msgid "Reset to defaults" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:162 -msgid "Resolv and Hosts Files" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:188 -msgid "Resolve file" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:405 -msgid "Resource not found" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:350 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:817 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:100 -msgid "Restart" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:313 -msgid "Restart Firewall" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:815 -msgid "Restart radio interface" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:372 -msgid "Restore" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:382 -msgid "Restore backup" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:371 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:372 -msgid "Reveal/hide password" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4053 -msgid "Revert" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4138 -msgid "Revert changes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4320 -msgid "Revert request failed with status %h" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4300 -msgid "Reverting configuration…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:372 -msgid "Root directory for files served via TFTP" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:297 -msgid "Root preparation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202 -msgid "Round-Robin policy (balance-rr, 0)" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:159 -msgid "Route Allowed IPs" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:73 -msgid "Route table" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:60 -msgid "Route type" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:625 -msgid "Router Advertisement-Service" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:46 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:26 -msgid "Router Password" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:15 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:194 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:27 -msgid "Routes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:15 -msgid "" -"Routes specify over which interface and gateway a certain host or network " -"can be reached." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:206 -msgid "Rule" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:335 -msgid "Run a filesystem check before mounting the device" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:335 -msgid "Run filesystem check" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2364 -msgid "Runtime error" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:219 -msgid "SHA256" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:59 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:175 -msgid "SNR" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:10 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:38 -msgid "SSH Access" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:70 -msgid "SSH server address" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:74 -msgid "SSH server port" -msgstr "" - -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:58 -msgid "SSH username" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:274 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:51 -msgid "SSH-Keys" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:156 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:181 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1662 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:42 -msgid "SSID" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:9 -msgid "SSTP" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41 -msgid "SSTP Server" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:339 -msgid "SWAP" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2866 -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2198 -#: modules/luci-compat/luasrc/view/cbi/error.htm:17 -#: modules/luci-compat/luasrc/view/cbi/footer.htm:26 -#: modules/luci-compat/luasrc/view/cbi/header.htm:20 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:435 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:123 -msgid "Save" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2180 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4049 -#: modules/luci-compat/luasrc/view/cbi/footer.htm:22 -msgid "Save & Apply" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:602 -msgid "Save error" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:406 -msgid "Save mtdblock" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:396 -msgid "Save mtdblock contents" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:822 -msgid "Scan" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:26 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:76 -msgid "Scheduled Tasks" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4033 -msgid "Section added" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4035 -msgid "Section removed" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:331 -msgid "See \"mount\" manpage for details" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:257 -msgid "" -"Select 'Force upgrade' to flash the image even if the image format check " -"fails. Use only if you are sure that the firmware is correct and meant for " -"your device!" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2622 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2762 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2927 -msgid "Select file…" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:318 -msgid "Selects the transmit hash policy to use for slave selection" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:144 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:115 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:89 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:102 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:125 -msgid "" -"Send LCP echo requests at the given interval in seconds, only effective in " -"conjunction with failure threshold" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24 -msgid "Send the hostname of this device" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:157 -msgid "Server Settings" -msgstr "" - -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:50 -msgid "Service Name" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:87 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:71 -msgid "Service Type" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:36 -msgid "Services" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2668 -msgid "Session expired" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:107 -msgid "Set VPN as Default Route" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:864 -msgid "" -"Set interface properties regardless of the link carrier (If set, carrier " -"sense events do not invoke hotplug handlers)." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:300 -msgid "Set same MAC Address to all slaves" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:642 -msgid "Set this interface as master for the dhcpv6 relay." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:304 -msgid "Set to currently active slave (active, 1)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305 -msgid "Set to first slave added to the bond (follow, 2)" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55 -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:23 -msgid "Setting PLMN failed" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:68 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:26 -msgid "Setting operation mode failed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:565 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:575 -msgid "Setup DHCP Server" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:31 -msgid "Severely Errored Seconds (SES)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:208 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:80 -msgid "Short GI" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1085 -msgid "Short Preamble" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:442 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:18 -msgid "Show current backup file list" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:264 -msgid "Show empty chains" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:354 -msgid "Shutdown this interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1661 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:41 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:141 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:173 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:179 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2071 -msgid "Signal / Noise" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:26 -msgid "Signal Attenuation (SATN)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:260 -msgid "Signal:" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3786 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:217 -msgid "Size" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:361 -msgid "Size of DNS query cache" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 -msgid "Size of the ZRam device in megabytes" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/footer.htm:18 -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:57 -msgid "Skip" -msgstr "" - -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:36 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:46 -msgid "Skip to content" -msgstr "" - -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:35 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:45 -msgid "Skip to navigation" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:178 -msgid "Slave Interfaces" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2883 -#: modules/luci-compat/luasrc/model/network.lua:1428 -msgid "Software VLAN" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/header.htm:5 -msgid "Some fields are invalid, cannot save values!" -msgstr "" - -#: modules/luci-base/luasrc/view/error404.htm:9 -msgid "Sorry, the object you requested was not found." -msgstr "" - -#: modules/luci-base/luasrc/view/error500.htm:9 -msgid "Sorry, the server encountered an unexpected error." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:414 -msgid "" -"Sorry, there is no sysupgrade support present; a new firmware image must be " -"flashed manually. Please refer to the wiki for device specific install " -"instructions." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:383 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:69 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:182 -msgid "Source" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:84 -msgid "Source Address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:50 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:50 -msgid "Source interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342 -msgid "" -"Specifies that duplicate frames (received on inactive ports) should be " -"dropped or delivered" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358 -msgid "Specifies the ARP link monitoring frequency in milliseconds" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366 -msgid "Specifies the IP addresses to use for ARP monitoring" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395 -msgid "Specifies the MII link monitoring frequency in milliseconds" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:259 -msgid "Specifies the aggregation selection logic to use" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:292 -msgid "Specifies the directory the device is attached to" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:252 -msgid "" -"Specifies the mac-address for the actor in protocol packet exchanges " -"(LACPDUs). If empty, masters' mac address defaults to system default" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175 -msgid "" -"Specifies the maximum amount of failed ARP requests until hosts are presumed " -"to be dead" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:171 -msgid "" -"Specifies the maximum amount of seconds after which hosts are presumed to be " -"dead" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:886 -msgid "" -"Specifies the maximum transmit power the wireless radio may use. Depending " -"on regulatory requirements and wireless usage, the actual transmit power may " -"be reduced by the driver." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:236 -msgid "" -"Specifies the minimum number of links that must be active before asserting " -"carrier" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:200 -msgid "Specifies the mode to be used for this bonding interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333 -msgid "" -"Specifies the number of IGMP membership reports to be issued after a " -"failover event in 200ms intervals" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:276 -msgid "" -"Specifies the number of packets to transmit through a slave before moving to " -"the next one" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:310 -msgid "" -"Specifies the number of peer notifications (gratuitous ARPs and unsolicited " -"IPv6 Neighbor Advertisements) to be issued after a failover event" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:284 -msgid "" -"Specifies the number of seconds between instances where the bonding driver " -"sends learning packets to each slaves peer switch" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374 -msgid "Specifies the quantity of ARP IP targets that must be reachable" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:268 -msgid "" -"Specifies the rate in which the link partner will be asked to transmit " -"LACPDU packets" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:225 -msgid "" -"Specifies the reselection policy for the primary slave when failure of the " -"active slave or recovery of the primary slave occurs" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:244 -msgid "Specifies the system priority" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403 -msgid "" -"Specifies the time in milliseconds to wait before disabling a slave after a " -"link failure detection" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411 -msgid "" -"Specifies the time in milliseconds to wait before enabling a slave after a " -"link recovery detection" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382 -msgid "" -"Specifies whether ARP probes and replies should be validated or non-ARP " -"traffic should be filtered for link monitoring" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:301 -msgid "" -"Specifies whether active-backup mode should set all slaves to the same MAC " -"address at enslavement" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419 -msgid "" -"Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. " -"netif_carrier_ok()" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:293 -msgid "" -"Specifies whether to shuffle active flows across slaves based on the load" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:179 -msgid "" -"Specifies which slave interfaces should be attached to this bonding interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:212 -msgid "" -"Specifies which slave is the primary device. It will always be the active " -"slave while it is available" -msgstr "" - -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:72 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:67 -msgid "Specify a TOS (Type of Service)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:72 -msgid "" -"Specify a TOS (Type of Service). Can be either inherit (the " -"outer header inherits the value of the inner header) or an hexadecimal value " -"starting with 0x (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:67 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:72 -msgid "" -"Specify a TTL (Time to Live) for the encapsulating packet other than the " -"default (64) (optional)." -msgstr "" - -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:62 -msgid "" -"Specify a TTL (Time to Live) for the encapsulating packet other than the " -"default (64)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:72 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:77 -msgid "" -"Specify a Traffic Class. Can be either inherit (the outer " -"header inherits the value of the inner header) or an hexadecimal value " -"starting with 0x (optional)." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:57 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:62 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:67 -msgid "" -"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " -"bytes) (optional)." -msgstr "" - -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:57 -msgid "" -"Specify an MTU (Maximum Transmission Unit) other than the default (1280 " -"bytes)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1931 -msgid "Specify the secret encryption key here." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:581 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:99 -msgid "Start" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76 -msgid "Start priority" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1765 -msgid "Start refresh" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4253 -msgid "Starting configuration apply…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1678 -msgid "Starting wireless scan..." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:109 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:64 -msgid "Startup" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:19 -msgid "Static IPv4 Routes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:19 -msgid "Static IPv6 Routes" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:165 -msgid "Static Leases" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:76 -msgid "Static Routes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1981 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:172 -#: modules/luci-compat/luasrc/model/network.lua:967 -msgid "Static address" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:411 -msgid "" -"Static leases are used to assign fixed IP addresses and symbolic hostnames " -"to DHCP clients. They are also required for non-dynamic interface " -"configurations where only hosts with a corresponding lease are served." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 -msgid "Station inactivity limit" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:16 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:385 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:871 -#: modules/luci-mod-status/luasrc/view/admin_status/index.htm:9 -msgid "Status" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:356 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:101 -msgid "Stop" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1676 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1770 -msgid "Stop refresh" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:259 -msgid "Strict order" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:33 -msgid "Strong" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/simpleform.htm:61 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1956 -msgid "Submit" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:203 -msgid "Suppress logging" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:204 -msgid "Suppress logging of the routine operation of these protocols" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:44 -msgid "Swap free" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:3 -msgid "Switch" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:172 -msgid "Switch %q" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:150 -msgid "" -"Switch %q has an unknown topology - the VLAN settings might not be accurate." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2883 -#: modules/luci-compat/luasrc/model/network.lua:1426 -msgid "Switch VLAN" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:403 -msgid "Switch protocol" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:103 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:104 -#: modules/luci-compat/luasrc/view/cbi/ipaddr.htm:26 -msgid "Switch to CIDR list notation" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2657 -msgid "Symbolic link" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:75 -msgid "Sync with NTP-Server" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:67 -msgid "Sync with browser" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:26 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:17 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:99 -#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:3 -msgid "System" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:25 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:39 -msgid "System Log" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:243 -msgid "System Priority" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:104 -msgid "System Properties" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:141 -msgid "System log buffer size" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:336 -msgid "TCP:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:163 -msgid "TFTP Settings" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:371 -msgid "TFTP server root" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:49 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:84 -msgid "TX" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:142 -msgid "TX Rate" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:17 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:166 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:184 -msgid "Table" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:31 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:65 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:163 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:181 -msgid "Target" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:103 -msgid "Target network" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:50 -msgid "Terminate" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:84 -msgid "The block mount command failed with code %d" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:77 -msgid "" -"The HE.net endpoint update configuration changed, you must now use the plain " -"username instead of the user ID!" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40 -msgid "The IPv4 address or the fully-qualified domain name of the remote end." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:40 -msgid "" -"The IPv4 address or the fully-qualified domain name of the remote tunnel end." -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40 -msgid "The IPv6 address or the fully-qualified domain name of the remote end." -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42 -msgid "" -"The IPv6 address or the fully-qualified domain name of the remote tunnel end." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59 -msgid "" -"The IPv6 prefix assigned to the provider, usually ends with ::" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1916 -msgid "" -"The allowed characters are: A-Z, a-z, 0-9 and _" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/error.htm:6 -msgid "The configuration file could not be loaded due to the following error:" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4129 -msgid "" -"The device could not be reached within %d seconds after applying the pending " -"changes, which caused the configuration to be rolled back for safety " -"reasons. If you believe that the configuration changes are correct " -"nonetheless, perform an unchecked configuration apply. Alternatively, you " -"can dismiss this warning and edit changes before attempting to apply again, " -"or revert all pending changes to keep the currently working configuration " -"state." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:280 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:392 -msgid "" -"The device file of the memory or partition (e.g." -" /dev/sda1)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:736 -msgid "" -"The existing wireless configuration needs to be changed for LuCI to function " -"properly." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:215 -msgid "" -"The flash image was uploaded. Below is the checksum and file size listed, " -"compare them with the original file to ensure data integrity.
Click " -"\"Proceed\" below to start the flash procedure." -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:195 -msgid "The following rules are currently active on this system." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:154 -msgid "The gateway address must not be a local IP address" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:147 -msgid "The given SSH public key has already been added." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:153 -msgid "" -"The given SSH public key is invalid. Please supply proper public RSA or " -"ECDSA keys." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:716 -msgid "The interface name is already used" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:722 -msgid "The interface name is too long" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:55 -msgid "" -"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " -"addresses." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:57 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:63 -msgid "The length of the IPv6 prefix in bits" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:163 -msgid "The local IPv4 address" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:46 -#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:44 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:44 -msgid "The local IPv4 address over which the tunnel is created (optional)." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:169 -msgid "The local IPv4 netmask" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:46 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44 -msgid "The local IPv6 address over which the tunnel is created (optional)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1922 -msgid "The network name is already used" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:139 -msgid "" -"The network ports on this device can be combined to several VLANs in which computers can " -"communicate directly with each other. VLANs are often used to separate different network " -"segments. Often there is by default one Uplink port for a connection to the " -"next greater network like the internet and other ports for a local network." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:158 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:42 -msgid "The reboot command failed with code %d" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:147 -msgid "The restore command failed with code %d" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1297 -msgid "The selected %s mode is incompatible with %s encryption" -msgstr "" - -#: modules/luci-base/luasrc/view/csrftoken.htm:11 -msgid "The submitted security token is invalid or already expired!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:98 -msgid "" -"The system is erasing the configuration partition now and will reboot itself " -"when finished." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:291 -msgid "" -"The system is flashing now.
DO NOT POWER OFF THE DEVICE!
Wait a " -"few minutes before you try to reconnect. It might be necessary to renew the " -"address of your computer to reach the device again, depending on your " -"settings." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:163 -msgid "" -"The system is rebooting now. If the restored configuration changed the " -"current LAN IP address, you might need to reconnect manually." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:85 -msgid "The system password has been successfully changed." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:317 -msgid "The sysupgrade command failed with code %d" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:120 -msgid "" -"The uploaded backup archive appears to be valid and contains the files " -"listed below. Press \"Continue\" to restore the backup and reboot, or " -"\"Cancel\" to abort the operation." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:115 -msgid "The uploaded backup archive is not readable" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:244 -msgid "The uploaded firmware does not allow keeping current configuration." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:239 -msgid "" -"The uploaded image file does not contain a supported format. Make sure that " -"you choose the generic image format for your platform." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:535 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:567 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:52 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:89 -msgid "There are no active leases" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:4268 -msgid "There are no changes to apply" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:55 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:213 -#: themes/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm:56 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:80 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:282 -msgid "" -"There is no password set on this router. Please configure a root password to " -"protect the web interface." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:49 -msgid "This IPv4 address of the relay" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1551 -msgid "This authentication type is not applicable to the selected EAP method." -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:57 -msgid "This does not look like a valid PEM file" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:256 -msgid "" -"This file may contain lines like 'server=/domain/1.2.3.4' or " -"'server=1.2.3.4' for domain-specific or full upstream DNS servers." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:426 -#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:16 -msgid "" -"This is a list of shell glob patterns for matching files and directories to " -"include during sysupgrade. Modified files in /etc/config/ and certain other " -"configurations are automatically preserved." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:81 -msgid "" -"This is either the \"Update Key\" configured for the tunnel or the account " -"password if no update key has been configured" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:116 -msgid "" -"This is the content of /etc/rc.local. Insert your own commands here (in " -"front of 'exit 0') to execute them at the end of the boot process." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:54 -msgid "" -"This is the local endpoint address assigned by the tunnel broker, it usually " -"ends with ...:2/64" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:173 -msgid "" -"This is the only DHCP in the local network" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:73 -msgid "This is the plain username for logging into the account" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:57 -msgid "" -"This is the prefix routed to you by the tunnel broker for use by clients" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:28 -msgid "This is the system crontab in which scheduled tasks can be defined." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:50 -msgid "" -"This is usually the address of the nearest PoP operated by the tunnel broker" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js:65 -msgid "" -"This list gives an overview over currently running system processes and " -"their status." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1505 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1563 -msgid "" -"This option cannot be used because the ca-bundle package is not installed." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:2205 -#: modules/luci-base/htdocs/luci-static/resources/form.js:2511 -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:172 -#: modules/luci-compat/luasrc/view/cbi/tsection.htm:32 -msgid "This section contains no values yet" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:110 -msgid "Time Synchronization" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1093 -msgid "Time interval for rekeying GTK" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124 -msgid "Timezone" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/luci.js:2678 -msgid "To login…" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:372 -msgid "" -"To restore configuration files, you can upload a previously generated backup " -"archive here. To reset the firmware to its initial state, click \"Perform " -"reset\" (only possible with squashfs images)." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:907 -msgid "Tone" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:35 -msgid "Total Available" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:102 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:103 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:113 -msgid "Traceroute" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:53 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:64 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:96 -msgid "Traffic" -msgstr "" - -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:72 -#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:77 -msgid "Traffic Class" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385 -msgid "Transfer" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:24 -msgid "Transmit" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:317 -msgid "Transmit Hash Policy" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:74 -msgid "Trigger" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/led-trigger/netdev.js:19 -msgid "Trigger Mode" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:69 -msgid "Tunnel ID" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2886 -#: modules/luci-compat/luasrc/model/network.lua:1431 -msgid "Tunnel Interface" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:44 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:55 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:76 -msgid "Tunnel Link" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 -msgid "Tx-Power" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:44 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:43 -msgid "Type" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:326 -msgid "UDP:" -msgstr "" - -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:90 -msgid "UMTS only" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_3g.lua:10 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:43 -msgid "UMTS/GPRS/EV-DO" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:254 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:360 -msgid "UUID" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:16 -#: modules/luci-base/htdocs/luci-static/resources/network.js:17 -#: modules/luci-compat/luasrc/model/network.lua:34 -#: modules/luci-compat/luasrc/model/network.lua:35 -msgid "Unable to determine device name" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:18 -#: modules/luci-compat/luasrc/model/network.lua:36 -msgid "Unable to determine external IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:19 -#: modules/luci-compat/luasrc/model/network.lua:37 -msgid "Unable to determine upstream interface" -msgstr "" - -#: modules/luci-base/luasrc/view/error404.htm:11 -msgid "Unable to dispatch" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/dmesg.js:9 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/syslog.js:15 -msgid "Unable to load log data:" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:54 -#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:54 -#: protocols/luci-proto-qmi/htdocs/luci-static/resources/protocol/qmi.js:22 -msgid "Unable to obtain client ID" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:221 -msgid "Unable to obtain mount information" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:278 -msgid "Unable to reset ip6tables counters: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:276 -msgid "Unable to reset iptables counters: %s" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:7 -msgid "Unable to resolve AFTR host name" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:20 -#: modules/luci-compat/luasrc/model/network.lua:38 -msgid "Unable to resolve peer host name" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:284 -msgid "Unable to restart firewall: %s" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/crontab.js:20 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:342 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:57 -msgid "Unable to save contents: %s" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js:33 -msgid "Unavailable Seconds (UAS)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/fs.js:102 -msgid "Unexpected reply data format" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1983 -#: modules/luci-compat/luasrc/model/network.lua:971 -msgid "Unknown" -msgstr "" - -#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47 -msgid "Unknown and unsupported connection method." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2292 -#: modules/luci-compat/luasrc/model/network.lua:1138 -msgid "Unknown error (%s)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:412 -msgid "Unknown error code" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:1980 -#: modules/luci-base/htdocs/luci-static/resources/protocol/none.js:6 -#: modules/luci-compat/luasrc/model/network.lua:965 -msgid "Unmanaged" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:195 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:217 -msgid "Unmount" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:112 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:259 -msgid "Unnamed key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3973 -msgid "Unsaved Changes" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/rpc.js:410 -msgid "Unspecified error" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_4x6.lua:64 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:9 -msgid "Unsupported MAP type" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:69 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:27 -msgid "Unsupported modem" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:267 -msgid "Unsupported protocol type." -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/tblsection.htm:151 -msgid "Up" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:410 -msgid "Up Delay" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3860 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:413 -msgid "" -"Upload a sysupgrade-compatible image here to replace the running firmware." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:138 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:169 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:384 -msgid "Upload archive..." -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2816 -msgid "Upload file" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2791 -msgid "Upload file…" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:2738 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3848 -msgid "Upload request failed: %s" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3767 -#: modules/luci-base/htdocs/luci-static/resources/ui.js:3821 -msgid "Uploading file…" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:737 -msgid "" -"Upon pressing \"Continue\", anonymous \"wifi-iface\" sections will be " -"assigned with a name in the form wifinet# and the network will be " -"restarted to apply the updated configuration." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:81 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js:60 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:177 -msgid "Use /etc/ethers" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:269 -msgid "Use DHCP advertised servers" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:167 -msgid "Use DHCP gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:40 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:124 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:39 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:116 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:68 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:59 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:103 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:90 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:77 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:100 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:69 -msgid "Use DNS servers advertised by peer" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:565 -msgid "Use ISO/IEC 3166 alpha2 country codes." -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:56 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:97 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:77 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:61 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:75 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:92 -msgid "Use MTU on tunnel interface" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:93 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:73 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:57 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:88 -msgid "Use TTL on tunnel interface" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320 -msgid "Use XOR of hardware MAC addresses (layer2)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:321 -msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323 -msgid "" -"Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect " -"(encap2+3)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294 -msgid "Use as external overlay (/overlay)" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:293 -msgid "Use as root filesystem (/)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:34 -msgid "Use broadcast flag" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:860 -msgid "Use builtin IPv6-management" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:43 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:182 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:127 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:42 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:119 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:62 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:106 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:93 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:67 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:80 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:103 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:72 -msgid "Use custom DNS servers" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:37 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:116 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:33 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:64 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:56 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:100 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:87 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:61 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:74 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:97 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:61 -msgid "Use default gateway" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:48 -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:230 -#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:119 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/464xlat.js:51 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:88 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:68 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6to4.js:52 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:70 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:83 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:111 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:153 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:72 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/l2tp.js:67 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:111 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoa.js:98 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:72 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:85 -#: protocols/luci-proto-pppossh/htdocs/luci-static/resources/protocol/pppossh.js:108 -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:64 -msgid "Use gateway metric" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:96 -msgid "Use legacy MAP" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:96 -msgid "" -"Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) " -"instead of RFC7597" -msgstr "" - -#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179 -msgid "Use routing table" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1498 -msgid "Use system certificates" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1556 -msgid "Use system certificates for inner-tunnel" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:412 -msgid "" -"Use the Add Button to add a new lease entry. The MAC-Address identifies the host, the IPv4-Address specifies the fixed " -"address to use, and the Hostname is assigned as a symbolic name to " -"the requesting host. The optional Lease time can be used to set non-" -"standard host-specific lease time, e.g. 12h, 3d or infinite." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322 -msgid "Use upper layer protocol information (layer3+4)" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324 -msgid "" -"Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)" -msgstr "" - -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194 -msgid "Used" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1394 -msgid "Used Key Slot" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1437 -msgid "" -"Used for two different purposes: RADIUS NAS ID and 802.11r R0KH-ID. Not " -"needed with normal WPA(2)-PSK." -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:105 -msgid "User Group" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:114 -msgid "User certificate (PEM encoded)" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:126 -msgid "User key (PEM encoded)" -msgstr "" - -#: modules/luci-base/luasrc/view/sysauth.htm:23 -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:106 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:50 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:56 -msgid "Username" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:975 -msgid "VC-Mux" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:923 -msgid "VDSL" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:173 -msgid "VLANs on %q" -msgstr "" - -#: modules/luci-base/root/usr/share/luci/menu.d/luci-base.json:54 -msgid "VPN" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:42 -msgid "VPN Local address" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:46 -msgid "VPN Local port" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pptp.js:58 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:39 -msgid "VPN Server" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:99 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:45 -msgid "VPN Server port" -msgstr "" - -#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:103 -#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:60 -msgid "VPN Server's certificate SHA1 hash" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_vpnc.lua:9 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:9 -msgid "VPNC (CISCO 3000 (and others) VPN)" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10 -msgid "VXLAN (RFC7348)" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53 -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48 -msgid "VXLAN network identifier" -msgstr "" - -#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10 -msgid "VXLANv6 (RFC7348)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1498 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1556 -msgid "" -"Validate server certificate using built-in system CA bundle,
requires " -"the \"ca-bundle\" package" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387 -msgid "Validation for all slaves" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385 -msgid "Validation only for active slave" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386 -msgid "Validation only for backup slaves" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:154 -msgid "Value must not be empty" -msgstr "" - -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:73 -msgid "Vendor" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:55 -msgid "Vendor Class to send when requesting DHCP" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:196 -msgid "Verifying the uploaded image file." -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:59 -msgid "Virtual dynamic interface" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1032 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1033 -msgid "WDS" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1217 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1306 -msgid "WEP Open System" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1218 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1307 -msgid "WEP Shared Key" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1931 -msgid "WEP passphrase" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1070 -msgid "WMM Mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1931 -msgid "WPA passphrase" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1208 -msgid "" -"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " -"and ad-hoc mode) to be installed." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47 -msgid "Waiting for device..." -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:168 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:178 -msgid "Warning" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26 -msgid "Warning: There are unsaved changes that will get lost on reboot!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37 -msgid "Weak" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1460 -msgid "" -"When using a PSK, the PMK can be automatically generated. When enabled, the " -"R0/R1 key options below are not applied. Disable this to use the R0 and R1 " -"key options." -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:468 -msgid "Width" -msgstr "" - -#: modules/luci-compat/luasrc/model/network/proto_wireguard.lua:9 -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:29 -msgid "WireGuard VPN" -msgstr "" - -#: modules/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json:17 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:87 -#: modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json:105 -msgid "Wireless" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2874 -#: modules/luci-compat/luasrc/model/network.lua:1419 -msgid "Wireless Adapter" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/network.js:2853 -#: modules/luci-base/htdocs/luci-static/resources/network.js:4057 -#: modules/luci-compat/luasrc/model/network.lua:1405 -#: modules/luci-compat/luasrc/model/network.lua:1868 -msgid "Wireless Network" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:753 -msgid "Wireless Overview" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:922 -msgid "Wireless Security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:735 -msgid "Wireless configuration migration" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:47 -msgid "Wireless is disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:153 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:193 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:47 -msgid "Wireless is not associated" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 -msgid "Wireless network is disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:877 -msgid "Wireless network is enabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:275 -msgid "Write received DNS requests to syslog" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:160 -msgid "Write system log to file" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204 -msgid "XOR policy (balance-xor, 2)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3643 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295 -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:344 -#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:109 -msgid "Yes" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303 -msgid "Yes (none, 0)" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176 -msgid "" -"You appear to be currently connected to the device via the \"%h\" interface. " -"Do you really want to shut down the interface?" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:112 -msgid "" -"You can enable or disable installed init scripts here. Changes will applied " -"after a device reboot.
Warning: If you disable essential init " -"scripts like \"network\", your device might become inaccessible!" -msgstr "" - -#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:65 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:223 -#: themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm:73 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:294 -msgid "" -"You must enable JavaScript in your browser or LuCI will not work properly." -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:115 -msgid "" -"You must select a primary interface which is included in selected slave " -"interfaces!" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:96 -msgid "" -"You must select at least one ARP IP target if ARP monitoring is selected!" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192 -msgid "ZRam Compression Algorithm" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:199 -msgid "ZRam Compression Streams" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:185 -msgid "ZRam Settings" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:187 -msgid "ZRam Size" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:331 -msgid "any" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:908 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:916 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:921 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1157 -#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:78 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:48 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:51 -#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/pppoe.js:103 -msgid "auto" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:85 -msgid "automatic" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:82 -msgid "baseT" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:981 -msgid "bridged" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:146 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:401 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:35 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:99 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:31 -msgid "create" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:69 -msgid "create:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:55 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:57 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:58 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:62 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:63 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:83 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:84 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:87 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:185 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:186 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:187 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:171 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:173 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:174 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:178 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:179 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:261 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:264 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:267 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:271 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:274 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:277 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:303 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:304 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:305 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:309 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:310 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:311 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:313 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:314 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js:315 -msgid "dBm" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1014 -msgid "disable" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:185 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:626 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:632 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:638 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:91 -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:25 -msgid "disabled" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:519 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:553 -msgid "driver default" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:81 -msgid "e.g: --proxy 10.10.10.10" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:83 -msgid "e.g: dump" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:524 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:545 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:42 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:69 -msgid "expired" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:182 -msgid "" -"file where given DHCP-leases will be stored" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:85 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:195 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:61 -msgid "forward" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 -msgid "full-duplex" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:84 -msgid "half-duplex" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:569 -msgid "hexadecimal encoded value" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1738 -msgid "hidden" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:629 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:635 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:640 -msgid "hybrid mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:36 -msgid "if target is a network" -msgstr "" - -#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dslite.js:63 -msgid "ignore" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:191 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 -msgid "input" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:395 -msgid "key between 8 and 63 characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:407 -msgid "key with either 5 or 13 characters" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:189 -msgid "local DNS file" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1316 -msgid "medium security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1465 -msgid "minutes" -msgstr "" - -#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422 -msgid "netif_carrier_ok()" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 -msgid "no" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:76 -msgid "no link" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:59 -msgid "non-empty value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3007 -msgid "none" -msgstr "" - -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:41 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:55 -#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:69 -msgid "not present" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:347 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:901 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:905 -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:197 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:245 -msgid "off" -msgstr "" - -#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:196 -#: themes/luci-theme-rosy/luasrc/view/themes/rosy/header.htm:242 -msgid "on" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 -msgid "open network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:69 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:46 -msgid "output" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:241 -msgid "positive decimal value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:233 -msgid "positive integer value" -msgstr "" - -#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:80 -msgid "random" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:628 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:634 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:639 -msgid "relay mode" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:982 -msgid "routed" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1093 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1102 -msgid "sec" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:627 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:633 -msgid "server mode" -msgstr "" - -#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:53 -msgid "sstpc Log-level" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649 -msgid "stateful-only" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:647 -msgid "stateless" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:648 -msgid "stateless + stateful" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1315 -msgid "strong security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:352 -msgid "tagged" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1448 -msgid "time units (TUs / 1.024 ms) [1000-65535]" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:559 -msgid "unique value" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:534 -msgid "unknown" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:340 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:522 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:543 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:40 -#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:67 -msgid "unlimited" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/form.js:3372 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:76 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:138 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:369 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:393 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:428 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:465 -#: modules/luci-base/htdocs/luci-static/resources/tools/widgets.js:561 -#: modules/luci-compat/luasrc/view/cbi/firewall_zonelist.htm:53 -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:38 -msgid "unspecified" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/network_netlist.htm:71 -msgid "unspecified -or- create:" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js:350 -msgid "untagged" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:246 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:121 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:132 -msgid "valid IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:246 -msgid "valid IP address or prefix" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:281 -msgid "valid IPv4 CIDR" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:254 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:125 -msgid "valid IPv4 address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:254 -msgid "valid IPv4 address or network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:374 -msgid "valid IPv4 address:port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:314 -msgid "valid IPv4 network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:276 -msgid "valid IPv4 or IPv6 CIDR" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:267 -msgid "valid IPv4 prefix value (0-32)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:286 -msgid "valid IPv6 CIDR" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:262 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:129 -msgid "valid IPv6 address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:262 -msgid "valid IPv6 address or prefix" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:304 -msgid "valid IPv6 host id" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:319 -msgid "valid IPv6 network" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:272 -msgid "valid IPv6 prefix value (0-128)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:340 -msgid "valid MAC address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:411 -msgid "valid UCI identifier" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:362 -msgid "valid UCI identifier, hostname or IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:383 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:386 -msgid "valid address:port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:533 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:537 -msgid "valid date (YYYY-MM-DD)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:237 -msgid "valid decimal value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:405 -msgid "valid hexadecimal WEP key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:393 -msgid "valid hexadecimal WPA key" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:368 -msgid "valid host:port" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:355 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:357 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:73 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:79 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:107 -msgid "valid hostname" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:345 -msgid "valid hostname or IP address" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:229 -msgid "valid integer value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:309 -msgid "valid network in address/netmask notation" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:508 -msgid "valid phone digit (0-9, \"*\", \"#\", \"!\" or \".\")" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:332 -#: modules/luci-base/htdocs/luci-static/resources/validation.js:335 -msgid "valid port or port range (port1-port2)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:324 -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:136 -msgid "valid port value" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:513 -msgid "valid time (HH:MM:SS)" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:435 -msgid "value between %d and %d characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:416 -msgid "value between %f and %f" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:420 -msgid "value greater or equal to %f" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:424 -msgid "value smaller or equal to %f" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:429 -msgid "value with %d characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:440 -msgid "value with at least %d characters" -msgstr "" - -#: modules/luci-base/htdocs/luci-static/resources/validation.js:445 -msgid "value with at most %d characters" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1317 -msgid "weak security" -msgstr "" - -#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46 -msgid "yes" -msgstr "" - -#: modules/luci-compat/luasrc/view/cbi/delegator.htm:20 -msgid "« Back" -msgstr "" diff --git a/luci-theme-bootstrap/Makefile b/luci-theme-bootstrap/Makefile deleted file mode 100644 index b80a18ee1..000000000 --- a/luci-theme-bootstrap/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -# Copyright (C) 2008-2014 The LuCI Team -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Bootstrap Theme (default) -LUCI_DEPENDS:= - -PKG_LICENSE:=Apache-2.0 - -define Package/luci-theme-bootstrap/postrm -#!/bin/sh -[ -n "$${IPKG_INSTROOT}" ] || { - uci -q delete luci.themes.Bootstrap - uci -q delete luci.themes.BootstrapDark - uci -q delete luci.themes.BootstrapLight - uci commit luci -} -endef - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-openwrt-2020/Makefile b/luci-theme-openwrt-2020/Makefile deleted file mode 100644 index 0e18a5f43..000000000 --- a/luci-theme-openwrt-2020/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2020 Jo-Philipp Wich -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI modern OpenWrt theme -LUCI_DEPENDS:= - -define Package/luci-theme-openwrt-2020/postrm -#!/bin/sh -[ -n "$${IPKG_INSTROOT}" ] || { - uci -q delete luci.themes.OpenWrt2020 - uci commit luci -} -endef - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 deleted file mode 100644 index 950ac98cc5f79db9863bd001fe66a20d551d0785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29004 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 Dq@qpE diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css deleted file mode 100644 index ff3b90917..000000000 --- a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css +++ /dev/null @@ -1,1943 +0,0 @@ -:root { - --main-bright-color: #00A3E1; - --main-dark-color: #002B49; - --secondary-bright-color: #FFFFFF; - --secondary-dark-color: #212322; - --danger-color: #CC1111; - --warning-color: #CC8800; - --success-color: #5CB85C; - --regular-font: "GalanoGrotesqueW00-Regular"; - --base-font-size: 16px; -} - -@font-face { - font-family: "GalanoGrotesqueW00-Regular"; - src: url("GalanoGrotesqueW00-Regular.woff2") format("woff2"); -} - -:root[lang="bg"], :root[lang="ru"], :root[lang="uk"], :root[lang="el"], :root[lang="he"] { - --regular-font: "Helvetica"; -} - -/* - * resets and base style - */ - -* { - margin: 0; - padding: 0; - box-sizing: border-box; - text-decoration: none; - list-style: none; - color: inherit; - font-family: var(--regular-font), "sans-serif"; - border: none; - font-size: 100%; - background: none; - outline: none; - -webkit-appearance: none; - -webkit-text-size-adjust: none; -} - -html { - height: 100%; - width: 100%; - max-width: 1366px; - margin: 0 auto; - background: #fff linear-gradient(90deg, rgba(0, 0, 0, .8), rgba(0, 0, 0 ,.5), rgba(0, 0, 0, .8)); -} - -body { - background: var(--secondary-bright-color); - color: var(--secondary-dark-color); - font-size: var(--base-font-size); - cursor: default; - display: inline-flex; - flex-direction: column; - min-height: 100%; - min-width: 100%; -} - -abbr[title], acronym[title] { - text-decoration: dotted underline; -} - -/* - * scaffholding - */ - -#menubar { - background-color: var(--main-bright-color); - background-image: url("logo.svg"); - background-position: 10px center; - background-size: 50px 50px; - background-repeat: no-repeat; - padding: 0 1em 0 70px; - min-height: 70px; - display: flex; - align-items: center; - color: var(--secondary-bright-color); - flex: 0; - width: 100%; - box-shadow: inset 0 0 1px var(--main-dark-color); -} - -#menubar > * { - flex: 1 1 auto; -} - -#menubar .hostname { - font-weight: bold; - font-size: 2em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -#menubar .distversion { - flex: 3; -} - -#indicators { - flex: 1 1 25%; - text-align: right; -} - -#indicators > * { - background: var(--secondary-bright-color); - color: var(--main-bright-color); - display: inline-block; - font-size: .85em; - line-height: 1.5em; - padding: 0 .5em; - margin: .125em; - border-radius: 1em; - cursor: pointer; - white-space: nowrap; -} - -#indicators > [data-style="inactive"] { - background: var(--main-bright-color); - color: var(--secondary-bright-color); - border: 2px solid var(--secondary-bright-color); - line-height: calc(1.5em - 4px); - padding: 0 calc(.5em - 2px); -} - -#menubar h2, -.skiplink { - display: none; -} - -#modemenu { - background: var(--main-bright-color); - padding: .5rem 1rem; - display: flex; - align-items: center; - color: var(--secondary-bright-color); - box-shadow: inset 0 0 1px var(--main-dark-color); - font-size: 1rem; - flex-wrap: wrap; -} - -#modemenu > * { - margin: .125rem; -} - -#modemenu > .active { - font-weight: bold; - border-bottom: 2px solid var(--secondary-bright-color); -} - -#maincontainer { - flex-direction: row; - display: inline-flex; - flex: 1 0 auto; -} - -#mainmenu { - flex: 1 1 100px; - max-width: 250px; - background: var(--main-dark-color); - color: var(--main-bright-color); - padding: 1em; -} - -#mainmenu:empty { - max-width: 0; - padding: 1em 0; - transition: all .2s ease-in-out; -} - -#mainmenu > div { - position: sticky; - top: 1em; -} - -#mainmenu ul { - padding: 0; - margin: 0 0 0 .5em; - line-height: 1.5em; -} - -#mainmenu ul > li { - list-style: none; -} - -#mainmenu li > ul { - max-height: 0; - overflow: hidden; - transition: max-height .1s ease-in-out; -} - -#mainmenu li.selected > a { - color: var(--secondary-bright-color); -} - -#mainmenu ul:not(.active) > li.selected > ul, -#mainmenu li.active > ul { - max-height: 3000px; - transition: max-height 1s ease-in-out; - margin: 0 0 .5em .5em; -} - -#mainmenu .l1 > li > a { - font-weight: bold; - font-size: 1.05em; -} - -#maincontent { - flex: 10; - padding: 1em 1em 0 1em; -} - -body > .luci { - flex: 0; - font-size: .7em; - padding: .25em; - text-align: right; - background: var(--main-bright-color); - color: var(--secondary-bright-color); - margin: 0; -} - -/* - * modal - */ - -body.modal-overlay-active { - overflow: hidden; -} - -body.modal-overlay-active #modal_overlay { - left: 0; - right: 0; - opacity: 1; -} - -#modal_overlay { - position: fixed; - top: 0; - bottom: 0; - left: -10000px; - right: 10000px; - background: rgba(0, 0, 0, 0.7); - z-index: 10000; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - transition: opacity .125s ease-in; - opacity: 0; -} - -#modal_overlay > .modal { - max-width: 1300px; - width: 80%; - margin: 10% auto 5rem auto; - background: var(--secondary-bright-color); - box-shadow: 0 0 3px 1px var(--main-bright-color); - padding: .5em; - border-radius: .25em; - display: flex; - flex-direction: column; -} - -.modal > h4:first-child { - padding: .5rem; - margin: -.5rem -.5rem .5rem -.5rem; - background: var(--main-bright-color); - color: var(--secondary-bright-color); - border-radius: .25rem .25rem 0 0; -} - -.modal > *:first-child:last-child { - margin: .5em 0 !important; -} - -.modal .cbi-section > legend:first-child { font-size: 120%; } - - -/* - * table layout - */ - -table { - width: 100%; - margin: 0 0 1rem 0; - position: relative; - border-collapse: collapse; -} - -tr.cbi-section-table-titles[data-title]::before { - font-weight: bold; - border-top: none; -} - -tr[data-title]::before { - content: attr(data-title); - display: table-cell; - border-top: 1px solid var(--main-dark-color); - padding: .5em; -} - -th { - text-align: left; - font-weight: bold; - padding: .5em; - /* word-break: break-word; */ -} - -.cbi-section-table-descr th { - opacity: .8; - font-size: 90%; - font-weight: normal; -} - -td { - border-top: 1px solid var(--main-dark-color); - padding: .5em; - vertical-align: middle; -} - -td input:not([type]), -td input[type="text"], -td input[type="password"], -td select, -td .cbi-dropdown:not(.btn):not(.cbi-button), -td .cbi-dynlist, -td .control-group { - min-width: auto; - width: 100%; -} - -tr.drag-over-above { - box-shadow: 0 -6px 6px var(--main-bright-color); -} - -tr.drag-over-below { - box-shadow: 0 6px 6px var(--main-bright-color); -} - -tr.placeholder { - height: 4em; - position: relative; -} - -tr.placeholder > td { - position: absolute; - left: 0; - right: 0; - bottom: 0; - text-align: center; - line-height: 3em; - font-size: 90%; - opacity: .8; -} - -/* - * view specific table invariants - */ - - #cbi-wireless-wifi-device .ifacebadge { - flex-direction: column; - justify-content: space-around; - } - -.assoclist td, -[data-page="admin-status-overview"] td { - font-size: .9rem; - vertical-align: middle; -} - -.assoclist td:nth-of-type(3) > span { - display: block; - max-width: 270px; - font-size: .8rem; -} - -.assoclist td:nth-of-type(5) > span { - font-size: .8rem; -} - -.assoclist td > .ifacebadge { - flex-wrap: wrap; - justify-content: space-around; - max-width: 120px; - padding: .2em; -} - -.assoclist td > .ifacebadge::after { - overflow: hidden; - text-overflow: ellipsis; -} - -.assoclist td > .ifacebadge > img { - margin: 0 25px; -} - -.assoclist td > .ifacebadge[data-ssid][data-ifname] > span { - display: none; -} - -.assoclist td > .ifacebadge[data-ssid][data-ifname]::after { - content: attr(data-ssid) " (" attr(data-ifname) ")"; -} - -[data-page="admin-status-overview"] td:nth-of-type(3) { - min-width: 100px; -} - -[data-page="admin-network-firewall"] table > tr > *:nth-child(1) { - flex: 1 1 30%; -} - -[data-page="admin-network-wireless"] .cbi-section-actions > div { - display: flex; -} - -[data-page="admin-network-wireless"] .cbi-section-actions > div > * { - flex: 1; -} - -[data-page="admin-status-processes"] table td:nth-of-type(3), -[data-tab="leases"] table td[data-name="duid"] { - word-break: break-word; -} - -/* - * uci changelog - */ - -.uci-change-list { - font-size: 90%; - white-space: pre; - overflow: hidden; -} - -.uci-change-list del, -.uci-change-list ins, -.uci-change-list var, -.uci-change-legend-label del, -.uci-change-legend-label ins, -.uci-change-legend-label var { - text-decoration: none; - font-family: monospace; - font-style: normal; - border: 1px solid #ccc; - background: #eee; - padding: 2px; - display: block; - line-height: 15px; - margin-bottom: 1px; -} - -.uci-change-list h5 { - margin: .5em 0 .25em 0; -} - -.uci-change-list ins, -.uci-change-legend-label ins { - border-color: #0f0; - background: #cfc; -} - -.uci-change-list del, -.uci-change-legend-label del { - border-color: #f00; - background: #fcc; -} - -.uci-change-list var, -.uci-change-legend-label var { - border-color: #ccc; - background: #eee; -} - -.uci-change-list var ins, -.uci-change-list var del { - display: inline-block; - border: none; - width: 100%; - padding: 0; -} - -.uci-change-legend { - margin: .5em 0 0 0; - display: flex; - flex-wrap: wrap; -} - -.uci-change-legend-label { - flex: 1 1 10em; - white-space: nowrap; -} - -.uci-change-legend-label > ins, -.uci-change-legend-label > del, -.uci-change-legend-label > var { - float: left; - margin-right: 4px; - width: 16px; - height: 16px; - display: block; - position: relative; -} - -.uci-change-legend-label var ins, -.uci-change-legend-label var del { - border: none; - position: absolute; - top: 2px; - left: 2px; - right: 2px; - bottom: 2px; -} - -/* - * alignment helpers - */ - -.left { - text-align: left !important; -} - -.right { - text-align: right !important; -} - -.center { - text-align: center !important; -} - -.top { - vertical-align: top !important; -} - -.bottom { - vertical-align: bottom !important; -} - -.middle { - vertical-align: middle !important; -} - -.nowrap { - white-space: nowrap !important; -} - -.hidden { - display: none !important; -} - -/* - * legacy hacks - */ - -[width="33%"] { - width: 33%; - max-width: 33%; -} - -[width="50%"] { - width: 50%; - max-width: 50%; -} - -[data-name="_freq"] select { - min-width: auto; -} - -.cbi-value-field > div:first-child + br { - display: none; -} - -/* - * typography - */ - -h1, h2, h3, h4, h5, h6, -.cbi-section > legend:first-child { - font-weight: bold; - margin: 0 0 1rem 0; -} - -strong, b { - font-weight: bold; -} - -h1 { font-size: 160%; } -h2 { font-size: 150%; } -h3 { font-size: 140%; } -h4 { font-size: 130%; } -h5 { font-size: 120%; } -h6 { font-size: 110%; } - -.cbi-section > legend:first-child { font-size: 140%; } - -p, ul, textarea { - margin: 0 0 1em 0; -} - -p > textarea:last-child { - margin: 0; -} - -var { - color: var(--main-dark-color); - font-weight: bold; -} - -code { - font-family: monospace; - color: var(--main-dark-color); -} - -pre { - font-family: monospace; - margin: 0 0 1em 0; - font-size: .9rem; - box-shadow: inset 0 0 2px var(--main-dark-color); - padding: .25rem; - overflow: auto; -} - -big { - font-size: 110%; -} - -small { - font-size: 95%; -} - -ul { - padding: 0 0 0 1.5em; -} - -ul > li { - list-style: disc; -} - -p > a { - text-decoration: underline; -} - -/* - * widgets - */ - -.ifacebox, .ifacebadge, .zonebadge { - display: inline-flex; - line-height: 1.8em; - padding: 0 .25em; - margin: .25em; - box-shadow: 0px 0px 2px var(--main-dark-color); - font-size: .9em; - border-radius: .5em; - overflow: hidden; - font-size: .8rem; - vertical-align: text-top; - background: var(--secondary-bright-color); - align-items: center; - color: var(--secondary-dark-color); - vertical-align: middle; -} - -.zonebadge > .ifacebadge { - margin: .125em -.125em .125em .35em; -} - -.zonebadge > .ifacebadge > img -{ - margin: .125em 0 .125em .25em; -} - -.ifacebox { - display: inline-flex; - flex-direction: column; - padding: 0; - text-align: center; - width: 100%; - max-width: 150px; -} - -.ifacebox-head { - background: var(--main-bright-color); - width: 100%; -} - -.ifacebox-body { - text-align: center; - padding: .3em .25em .25em .25em; - white-space: nowrap; -} - -.ifacebadge { - display: inline-flex; - align-items: center; -} - -.ifacebadge.large { - line-height: 1.3em; -} - -.ifacebadge > img { - vertical-align: text-bottom; - margin: .25em; - height: 16px; -} - -.ifacebadge > * { - margin-left: .25em; -} - -.network-status-table { - display: inline-flex; - flex-wrap: wrap; - width: 100%; - margin: 0 -.2em 1em -.2em; -} - -.network-status-table > .ifacebox { - max-width: none; - flex: 1 1 45%; - margin: .25em; - min-width: 250px; -} - -.network-status-table > .ifacebox .ifacebadge { - font-size: 100%; - max-width: none; - flex: 1 1 45%; - margin: .2em; -} - -.network-status-table .ifacebox-body > div { - display: flex; - flex-wrap: wrap; - margin: .3em -.1em -.1em -.1em; -} - -.cbi-tooltip-container { - cursor: help; -} - -.cbi-tooltip { - position: absolute; - z-index: 10000; - left: -10000px; - box-shadow: 0 0 2px rgba(0, 0, 0, .7); - border-radius: 3px; - background: var(--secondary-bright-color); - white-space: pre; - padding: 2px 5px; - opacity: 0; - transition: opacity .25s ease-in; - font-size: .8rem; -} - -.cbi-tooltip.error { - color: var(--danger-color); -} - -.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) { - left: auto; - opacity: 1; - transition: opacity .25s ease-in; -} - -.zone-forwards { - display: flex; - align-items: center; -} - -.cbi-progressbar { - border-radius: .25em; - position: relative; - min-width: 20rem; - height: 1.5em; - box-shadow: 0 0 2px var(--main-dark-color); - overflow: hidden; - margin: .125rem 0; -} - -.cbi-progressbar > div { - background: var(--main-bright-color); - height: 100%; - transition: width .25s ease-in; - width: 0%; -} - -.cbi-progressbar::after { - position: absolute; - bottom: 0; - top: 0; - right: 0; - left: 0; - text-align: center; - text-shadow: 0 0 2px var(--secondary-bright-color); - content: attr(title); - white-space: nowrap; - line-height: 1.5em; -} - -.cbi-tabmenu { - padding: 0; - margin: 0 -.5em 1em -.5em; - font-weight: bold; - color: var(--main-dark-color); -} - -.cbi-tabmenu > li { - display: inline-flex; - white-space: nowrap; - opacity: 1; - height: 1.8em; - max-height: none; - overflow: visible; -} - -.cbi-tabmenu > li > a { - flex: 1; - margin: .1em .5em; -} - -.cbi-tabmenu > .cbi-tab > a { - border-bottom: 2px solid var(--main-dark-color); -} - -[data-tab] { - opacity: 0; - max-height: 0; - transition: opacity .25s ease-in-out; - overflow: hidden; -} - -[data-tab-active="true"] { - opacity: 1; - height: auto; - max-height: none; - overflow: visible; -} - -.alert-message:not(.modal) { - box-shadow: 0 0 3px var(--secondary-dark-color); - padding: .5em; - margin: 0 0 1em 0; - background: var(--warning-color); - color: var(--secondary-bright-color); - transition: opacity .4s ease; -} - -.alert-message + .alert-message { - margin: -.5em 0 1em 0; -} - -.alert-message.info { - background: var(--main-bright-color); -} - -.alert-message.warning { - background: var(--warning-color); -} - -.alert-message.danger { - background: var(--danger-color); -} - -.alert-message.success { - background: var(--success-color); -} - -.alert-message .btn { - box-shadow: 0 0 2px var(--secondary-bright-color); -} - -.alert-message .btn:hover { - box-shadow: 0 0 4px 1px var(--secondary-bright-color); -} - -@keyframes fade-in { - 0% { opacity: 0; } - 100% { opacity: 1; } -} - -@keyframes fade-out { - 0% { opacity: 1; } - 100% { opacity: 0; } -} - -.fade-in { - animation: fade-in .4s ease; -} - -.fade-out { - animation: fade-out .4s ease; - opacity: 0; -} - -/* - * forms - */ - -button, .btn { - background: var(--main-bright-color); - color: var(--secondary-bright-color); - line-height: 1.5em; - border-radius: .25em; - cursor: pointer; - box-shadow: 0 0 2px var(--main-dark-color); - padding: 0 .5em; - display: inline-block; -} - -button:hover, .btn:hover { - box-shadow: 0 0 6px var(--main-bright-color); -} - -button + button, .btn + .btn, button + .btn, .btn + button, select + button { - margin-left: .25em; -} - -button.important { - background: var(--main-dark-color); -} - -button[disabled], button.disabled, .btn[disabled], .btn.disabled { - pointer-events: none; - opacity: .6; -} - -.cbi-button-apply, .cbi-button-positive { - background: var(--main-dark-color); -} - -.cbi-button-negative, .cbi-button-remove { - background: var(--danger-color); -} - -.cbi-checkbox { - position: relative; -} - -.cbi-checkbox input[type="checkbox"] { - position: absolute; - z-index: 10; - -webkit-appearence: button; - height: 1.3em; - width: 1.3em; - opacity: 0; - cursor: pointer; -} - -.cbi-checkbox input[type="checkbox"] + label { - position: relative; - display: inline-block; - width: 1.3em; - height: 1.3em; - vertical-align: text-top; -} - -.cbi-checkbox input[type="checkbox"] + label::before { - content: "\0a"; - height: 1em; - width: 1em; - box-shadow: 0 0 2px var(--main-dark-color); - display: inline-block; - border-radius: .25em; - margin: .15em 0; - position: absolute; - left: 0; - top: 0; -} - -.cbi-checkbox input[type="checkbox"]:checked + label::after { - content: "\0a"; - position: absolute; - display: inline-block; - background: var(--main-dark-color); - top: .35em; - left: .2em; - width: .6em; - height: .6em; - border-radius: .15em; - cursor: pointer; -} - -.cbi-checkbox input.cbi-input-invalid[type="checkbox"] + label::before { - box-shadow: 0 0 2px var(--danger-color); -} - -.cbi-checkbox input.cbi-input-invalid[type="checkbox"]:checked + label::after { - background: var(--danger-color); -} - -.cbi-checkbox input[type="checkbox"][disabled] + label::before, -.cbi-checkbox input[type="checkbox"][disabled] + label::after { - pointer-events: none; - opacity: .6; -} - -.cbi-checkbox input[type="checkbox"][disabled] { - pointer-events: none; -} - -input:not([type]), -input[type="text"], -input[type="password"], -select, -.cbi-dropdown:not(.btn):not(.cbi-button) { - border-bottom: 2px solid transparent; - box-shadow: inset 0 0 1px var(--main-dark-color); - padding: 0 .2rem; - line-height: 1.5rem; - min-height: calc(1.5rem + 2px); - min-width: 20rem; - border-radius: .25em; -} - -input:not([type]):focus, -input[type="text"]:focus, -input[type="password"]:focus, -select:focus, -.cbi-dropdown:not(.btn):not(.cbi-button):focus, -.cbi-dropdown[open]:not(.btn):not(.cbi-button) { - border-color: var(--main-dark-color); -} - -input[disabled]:not([type]), -input[disabled][type="text"], -input[disabled][type="password"], -select[disabled], -.cbi-dynlist[disabled] { - opacity: .6; - pointer-events: none; -} - -input:not([type]) + .btn, input:not([type]) + button, -input[type="text"] + .btn, input[type="text"] + button, -input[type="password"] + .btn, input[type="password"] + button { - margin: 0 0 2px -1px; - background: var(--main-dark-color); - border-radius: 0 .25em .25em 0; -} - -.control-group > select + .btn, .control-group > select + button { - margin-left: .25em; -} - -.control-group > input:not([type]) + .btn, .control-group > input:not([type]) + button, -.control-group > input[type="text"] + .btn, .control-group > input[type="text"] + button, -.control-group > input[type="password"] + .btn, .control-group > input[type="password"] + button { - margin: .125em .125em calc(.125em + 2px) calc(-.125em - .25em) !important; -} - -input[type="checkbox"] { - height: 1em; - vertical-align: middle; - -webkit-appearance: checkbox; -} - -select { - padding: .1rem 0; - -webkit-appearance: menulist; -} - -textarea { - width: 100%; - box-shadow: inset 0 0 2px var(--main-dark-color); - font-family: monospace; - font-size: .9rem; - padding: .2rem; -} - -.cbi-input-invalid, -.cbi-input-invalid:focus { - color: var(--danger-color); - border-color: var(--danger-color) !important; - box-shadow: inset 0 0 2px var(--danger-color); -} - -.control-group { - display: inline-flex; - margin: 0 -.125rem; - min-width: 20.25em; -} - -.control-group > *, -.control-group > .cbi-dropdown > ul > li { - justify-content: space-around; -} - -.control-group > * { - margin: .125rem !important; - min-width: auto !important; -} - -.control-group > select, -.control-group > input:not([type]), -.control-group > input[type="text"], -.control-group > input[type="password"] { - flex: 10; -} - -.cbi-value { - display: flex; - flex-wrap: wrap; - margin: 0 0 1em 0; -} - -.cbi-value > label:first-child { - flex: 1 1 40%; - padding: 0 .5em 0 0; -} - -.cbi-value > .cbi-value-field { - flex: 2 2 55%; -} - -.cbi-value > .cbi-section { - flex: 1 1 100%; -} - -.cbi-map-descr, -.cbi-tab-descr, -.cbi-section-descr, -.cbi-value-description, -.cbi-value[data-widget="CBI.DummyValue"] > div:first-child { - opacity: .8; - font-size: .9rem; - padding: .2em 0; -} - -.cbi-map-descr, -.cbi-tab-descr, -.cbi-section-descr, -.cbi-section-table, -.cbi-section-create { - margin: 0 0 1em 0; -} - -.cbi-dynlist { - display: inline-block; - font-size: 90%; - min-height: calc(1.5em + 2px); - line-height: 1.5em; - min-width: 20rem; - flex-wrap: wrap; -} - -.cbi-dynlist > .item { - box-shadow: 0 0 2px var(--main-dark-color); - margin: .3em 0; - padding: .15em 2em .15em .2em; - border-radius: .25em; - position: relative; - overflow: hidden; - transition: box-shadow .25s ease-in-out; - pointer-events: none; - flex: 1 1 100%; - word-break: break-all; -} - -.cbi-dynlist > .item::after { - content: "-"; - top: 0; - right: 0; - bottom: 0; - width: 1.6rem; - background: var(--main-bright-color); - display: flex; - align-items: center; - justify-content: space-around; - position: absolute; - box-shadow: 0 0 2px var(--main-dark-color); - text-align: center; - color: var(--secondary-bright-color); - cursor: pointer; - pointer-events: all; -} - -.cbi-dynlist[disabled] > .item::after { - pointer-events: none; -} - -.cbi-dynlist > .item:hover { - box-shadow: 0 0 2px var(--main-bright-color); -} - -.cbi-dynlist > .add-item { - flex: 1; - display: flex; -} - -.cbi-dynlist > .add-item > input { - flex: 1; - min-width: 18.5rem; - border-radius: .25rem 0 0 .25rem; -} - -.cbi-dynlist > .add-item > .btn { - flex: 0 0 1.6rem; - margin: 0 0 2px -1px; - width: 1.6rem; - text-align: center; -} - -.cbi-dropdown { - display: inline-flex !important; - cursor: pointer; - height: auto; - position: relative; - padding: 0 !important; -} - -.cbi-dropdown:not(.btn):not(.cbi-button) { - box-shadow: inset 0 0 1px var(--main-dark-color); -} - -.cbi-dropdown > ul { - margin: 0 !important; - padding: 0; - list-style: none; - overflow-x: hidden; - overflow-y: auto; - display: flex; - width: 100%; -} - -.cbi-dropdown.btn > ul:not(.dropdown) { - padding-left: .5em; -} - -.cbi-dropdown.btn.spinning > ul:not(.dropdown) { - padding-left: 0; -} - -.cbi-dropdown.btn > ul.dropdown > li { - color: var(--main-dark-color); -} - -.cbi-dropdown > ul.preview { - display: none; -} - -.cbi-dropdown > .open, -.cbi-dropdown > .more { - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - padding: 0 .25em; -} - -.cbi-dropdown.btn > .open, -.cbi-dropdown.cbi-button > .open { - padding: 0 .5em; - margin-left: .5em; - border-left: 1px solid; -} - -.cbi-dropdown > .more, -.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li[placeholder] { - display: none; - justify-content: center; - color: rgba(0, 0, 0, .5); -} - -.cbi-dropdown > ul > li { - display: none; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 1; - flex-grow: 1; - align-items: center; - align-self: center; - color: inherit; -} - -.cbi-dropdown > ul.dropdown > li, -.cbi-dropdown:not(.btn):not(.cbi-button) > ul > li { - padding: 0 .25em; -} - -.cbi-dropdown > ul > li .hide-open { display: block; display: initial; } -.cbi-dropdown > ul > li .hide-close { display: none; } - -.cbi-dropdown > ul > li[display]:not([display="0"]) { - border-left: 1px solid #ccc; -} - -.cbi-dropdown[empty] > ul { - max-width: 1px; - max-height: 1.5em; -} - -.cbi-dropdown > ul > li > form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown > ul > li img { - align-self: center; - margin-right: .25em; -} - -.cbi-dropdown > ul > li input[type="text"] { - margin: .25em 0; - border: none; - background: var(--secondary-bright-color); -} - -.cbi-dropdown[open] { - position: relative; -} - -.cbi-dropdown[open] > ul.dropdown { - display: block; - background: var(--secondary-bright-color); - box-shadow: 0 0 1px var(--main-dark-color), 0 0 4px rgba(0, 0, 0, .7); - position: absolute; - z-index: 1100; - max-width: none; - min-width: 100%; - width: auto; - transition: max-height .125s ease-in; -} - -.cbi-dropdown > ul > li[display], -.cbi-dropdown[open] > ul.preview, -.cbi-dropdown[open] > ul.dropdown > li, -.cbi-dropdown[multiple] > ul > li > label, -.cbi-dropdown[multiple][open] > ul.dropdown > li, -.cbi-dropdown[multiple][more] > .more, -.cbi-dropdown[multiple][empty] > .more { - flex-grow: 1; - display: flex !important; -} - -.cbi-dropdown[empty] > ul > li, -.cbi-dropdown[optional][open] > ul.dropdown > li[placeholder], -.cbi-dropdown[multiple][open] > ul.dropdown > li > form { - display: block !important; -} - -.cbi-dropdown[open] > ul.dropdown > li .hide-open { display: none; } -.cbi-dropdown[open] > ul.dropdown > li .hide-close { display: block; display: initial; } - -.cbi-dropdown[open] > ul.dropdown > li { - border-bottom: 1px solid #ccc; -} - -.cbi-dropdown[open] > ul.dropdown > li[selected] { - background: var(--main-dark-color); - color: var(--secondary-bright-color); -} - -.cbi-dropdown[open] > ul.dropdown > li.focus { - background: var(--main-bright-color); -} - -.cbi-dropdown[open] > ul.dropdown > li:last-child { - margin-bottom: 0; - border-bottom: none; -} - -.cbi-dropdown[open] > ul.dropdown > li[unselectable] { - opacity: 0.7; -} - -.cbi-dropdown[open] > ul.dropdown > li > input.create-item-input:first-child:last-child { - width: 100%; -} - -.cbi-dropdown[disabled] { - pointer-events: none; - opacity: .6; -} - -.cbi-filebrowser { - max-width: 100%; - width: 1px; - box-shadow: 0 0 2px var(--main-dark-color); - border-radius: .25rem; - display: flex; - flex-direction: column; - opacity: 0; - height: 0; - overflow: hidden; -} - -.cbi-filebrowser.open { - min-width: 20rem; - width: auto; - opacity: 1; - height: auto; - overflow: visible; - transition: opacity .25s ease-in; -} - -.cbi-filebrowser > * { - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - padding: 0 0 .25em 0; - margin: .25em .25em 0px .25em; - white-space: nowrap; - border-bottom: 1px solid var(--main-dark-color); -} - -.cbi-filebrowser .cbi-button-positive { - margin-right: .25em; -} - -.cbi-filebrowser > div { - border-bottom: none; -} - -.cbi-filebrowser > ul > li { - display: flex; - flex-direction: row; - align-items: center; -} - -.cbi-filebrowser > ul > li a:hover { - font-weight: bold; - text-decoration: underline; -} - -.cbi-filebrowser > ul > li > div:first-child { - flex: 10; - overflow: hidden; - text-overflow: ellipsis; -} - -.cbi-filebrowser > ul > li > div:last-child { - flex: 3 3 10em; - text-align: right; -} - -.cbi-filebrowser > ul > li > div:last-child > button { - padding: .125em .25em; - margin: 1px 0 1px .25em; -} - -.cbi-filebrowser .upload { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 0 -.125em .25em -.125em; - padding: 0 0 .125em 0px; - border-bottom: 1px solid var(--main-dark-color); -} - -.cbi-filebrowser .upload > * { - margin: .125em; - flex: 1; -} - -.cbi-filebrowser .upload > div > input { - width: 100%; -} - -.cbi-section-actions { - text-align: right; -} - -.cbi-page-actions { - flex-wrap: wrap; - width: 100%; - justify-content: flex-end; - margin-bottom: 1em; - margin-top: 1em; - border-top: 1px solid var(--main-dark-color); - padding-top: 1em; - text-align: right; -} - -div[id$=".ipaddr"] > input, -.cbi-value-field > div > input[type="password"] { - min-width: 18.5rem; - border-radius: .25rem 0 0 .25rem; -} - -div[id$=".txpower"] { - flex-wrap: wrap; - align-items: center; -} - -div[id$=".txpower"] > span { - white-space: nowrap; - margin-left: .25em; -} - -div[id$=".editlist"] { - flex: 1; -} - -[data-errors]::after { - content: attr(data-errors); - background: var(--danger-color); - color: var(--secondary-bright-color); - border-radius: .6rem; - height: 1.1rem; - padding: 0 .25rem; - font-size: .9rem; - display: inline-block; - font-weight: bold; - min-width: .6rem; - line-height: 1rem; - margin: -.1rem 0 0 -.2rem; - text-align: center; -} - -@keyframes spin { - 100% { transform: rotate(360deg); } -} - -.spinning { - position: relative; - padding-left: 2.1em !important; -} - -.spinning::before { - position: absolute; - display: block; - align-items: center; - top: 0; - bottom: 0; - left: .4em; - width: 1.4em; - height: 1.4em; - animation: spin 1s linear infinite; - content: url("spinner.svg"); - margin: auto; - line-height: 0; -} - -button.spinning, .btn.spinning { - padding-left: 1.6em !important; -} - -button.spinning::before, .btn.spinning::before { - filter: invert(1); - left: .2em; - width: 1.2em; - height: 1.2em; -} - -#view > div.spinning:first-child { - padding: .5em 0; -} - -#view > *:last-child { - margin: 0 0 1em 0; -} - -.label { - background: var(--main-bright-color); - color: var(--secondary-bright-color); - font-size: .8rem; - padding: 0 .4rem; - border-radius: .5rem; -} - -.label.warning { - background: var(--danger-color); -} - -.label.success { - background: var(--success-color); -} - -ul.deps { - margin: 0; - padding: 0; - font-size: .9rem; -} - -ul.errors { - margin: 0 0 1em 0; - padding: 0; -} - -@media only screen and (max-width: 800px) { - body { - padding-top: 70px; - } - - #maincontent { - padding: .25em; - max-width: 100vw; - } - - #menubar { - background: var(--main-bright-color); - padding: 0 .5em; - position: fixed; - top: 0; - z-index: 1000; - } - - #menubar > h2 { - flex: 0 0 2em; - display: block; - border: 2px solid var(--secondary-bright-color); - color: var(--secondary-bright-color); - border-radius: .5em; - cursor: pointer; - font-size: 100%; - margin: 0 1em 0 0; - } - - #menubar > h2:hover { - border-color: var(--secondary-bright-color); - color: var(--secondary-bright-color); - } - - #menubar > h2 > * { - display: none; - } - - #menubar > h2::before { - content: "☰"; - width: 35px; - line-height: 35px; - text-align: center; - display: inline-block; - color: inherit; - font-weight: bold; - } - - #menubar > h2.active::before { - content: "×"; - font-size: 200%; - } - - #menubar .hostname { - font-size: 1.6em; - } - - .distversion { - display: none; - } - - #modemenu { - padding: .125em .25em; - } - - #mainmenu { - overflow-x: hidden; - overflow-y: auto; - max-width: 0; - padding: 1em 0; - transition: max-width .25s ease-in-out, padding .25s ease-in-out; - position: fixed; - z-index: 900; - height: 100%; - } - - #mainmenu.active { - max-width: 200px; - padding: 1em 1em calc(1em + 70px) 1em; - overflow-x: visible; - } - - #mainmenu > div { - position: static; - } - - #mainmenu ul > li { - padding: .25em 0; - } - - .hide-xs { - display: none !important; - } - - table { - display: flex; - flex-direction: column; - } - - tr { - display: block; - border-bottom: 1px solid var(--main-dark-color); - margin-bottom: .5em; - padding-bottom: .5em; - } - - tr.cbi-section-table-titles[data-title]::before, - tr.cbi-section-table-titles, - tr.cbi-section-table-descr { - display: none; - } - - tr[data-title]::before { - display: block; - font-weight: bold; - border-top: none; - padding: .4em 0; - font-size: 110%; - } - - td { - display: block; - border-top: none; - text-align: left !important; - padding: .2em 0; - } - - th, table-titles { - display: none; - } - - td[data-title] { - position: relative; - padding: .2em 0 .2em 40%; - } - - td[data-title]::before { - content: attr(data-title) ": "; - white-space: nowrap; - font-weight: bold; - width: 40%; - overflow: hidden; - text-overflow: ellipsis; - position: absolute; - left: 0; - top: 0; - bottom: 0; - padding: .2em 0; - text-align: left; - display: inline-flex; - align-items: center; - } - - td[data-title]::after { - content: ""; - width: 2em; - position: absolute; - left: calc(40% - 2em); - top: 0; - bottom: 0; - display: block; - background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--secondary-bright-color) 90%); - } - - [data-page="admin-status-overview"] .cbi-section:nth-of-type(1) td:first-of-type, - [data-page="admin-status-overview"] .cbi-section:nth-of-type(2) td:first-of-type { - font-weight: bold; - max-width: none; - width: 100%; - } - - [data-page="admin-status-overview"] td > span > span { font-size: .9rem; } - - [data-page="admin-status-routes"] table:nth-of-type(3) td:nth-of-type(1) { word-break: break-all; } - - [data-page="admin-network-firewall-zones"] td[data-name="_info"] { - padding: .2em 0; - line-height: 2.2rem; - } - - [data-page="admin-network-firewall-zones"] td[data-name="_info"]::before, - [data-page="admin-network-firewall-zones"] td[data-name="_info"]::after { - display: none; - } - - [data-page="admin-network-firewall-zones"] td[data-name="_info"] label { - font-size: 1rem; - } - - #cbi-wireless-wifi-device tr { display: flex; flex-wrap: wrap; } - #cbi-wireless-wifi-device tr > *:nth-child(1) { flex: 1 1 20%; align-self: center; } - #cbi-wireless-wifi-device tr > *:nth-child(2) { flex: 2 2 75%; } - #cbi-wireless-wifi-device tr > *:nth-child(3) { flex: 3 3 100%; } - - #cbi-network-interface tr { display: flex; flex-wrap: wrap; } - #cbi-network-interface tr > *:nth-child(1) { flex: 1 1 33%; align-self: center; } - #cbi-network-interface tr > *:nth-child(2) { flex: 2 2 60%; align-self: center; font-size: .9rem; overflow: hidden; } - #cbi-network-interface tr > *:nth-child(3) { flex: 3 3 100%; } - #cbi-network-interface tr > *:nth-child(2) > div { overflow: hidden; text-overflow: ellipsis; } - - .assoclist tr { - display: flex; - flex-wrap: wrap; - } - - .assoclist td > .ifacebadge { - max-width: 90px; - } - - .assoclist td > .ifacebadge > img { - margin: 0 35px; - } - - .assoclist td > .ifacebadge > span { - display: none; - } - - .assoclist td > .ifacebadge[data-ifname]::after { - content: attr(data-ifname); - } - - .assoclist td > .ifacebadge[data-signal]::after { - content: attr(data-signal) " dBm"; - } - - .assoclist td:nth-of-type(3) { - font-weight: bold; - font-size: 1rem; - } - - .assoclist td:nth-of-type(1), .assoclist td:nth-of-type(4) { - flex: 1 1 100px; - margin-right: .5em; - } - - .assoclist td:nth-of-type(3), .assoclist td:nth-of-type(5) { - flex: 2 2 calc(100% - 110px); - overflow: hidden; - text-overflow: ellipsis; - align-self: center; - } - - .assoclist td:nth-of-type(6) { flex: 1; text-align: right !important; } - .assoclist td[data-title] { padding: .2em 0; } - .assoclist td[data-title]::before, - .assoclist td[data-title]::after { display: none; } - - .leases6 td:nth-of-type(3) { word-wrap: break-word; } - - td.cbi-section-actions > div { display: flex; } - td.cbi-section-actions > div > * { flex: 1; } - - body.modal-overlay-active #modal_overlay > .modal { - width: 95%; - margin: 5% auto; - } - - input:not([type]), - input[type="text"], - input[type="password"], - select, - .cbi-dropdown:not(.btn):not(.cbi-button), - .cbi-dynlist { - min-height: calc(2.2rem + 2px); - line-height: 2.2rem; - font-size: 1.2rem; - min-width: 10rem; - } - - button, .btn { - line-height: 1.8rem; - font-size: 1.2rem; - } - - select { - padding: .4em 0; - } - - .cbi-value > .cbi-value-field { - flex: 1 0 100%; - display: flex; - flex-direction: column; - max-width: 100%; - } - - .cbi-value > .cbi-value-field > div[id] { - display: flex; - flex-direction: row; - } - - .cbi-value > .cbi-value-field > div[id] > input, - .cbi-value > .cbi-value-field > div[id] > select, - .cbi-value > .cbi-value-field > div[id] > .cbi-filebrowser.open { - flex: 1; - width: 100%; - } - - .cbi-dynlist .item::after, - .cbi-dynlist .add-item > .btn { - line-height: 2em; - flex-basis: 2rem; - width: 2rem; - } - - .ifacebadge.large { - font-size: .9rem; - } - - .control-group > *, - .control-group > .cbi-dropdown > ul > li { - flex: 1; - white-space: normal; - word-wrap: break-word; - } - - .cbi-page-actions .cbi-dropdown, - .cbi-page-actions .cbi-button-apply:first-child { - flex-basis: 100%; - } - - .cbi-checkbox { - margin: .25rem; - } - - .cbi-tabmenu { - margin: 0 -.25em 1em -.25em; - } - - .cbi-tooltip { - font-size: 1rem; - box-shadow: 0 0 4px rgba(0, 0, 0, .7); - } - - .cbi-value > label:first-child { - padding: 0 0 .5em 0; - } - - [data-page="admin-system-admin-sshkeys"] .cbi-dynlist > .item { - font-size: .9rem; - line-height: 1rem; - } - - [data-page="admin-system-opkg"] .control-group { - flex-wrap: wrap; - } - - [data-page="admin-status-iptables"] h2 + div.right { - margin: 0 0 1em 0 !important; - display: flex; - } -} - -@media only screen and (min-width: 800px) and (max-width: 1200px) { - .assoclist tr > *:nth-of-type(2) { - display: none; - } -} diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/logo.png deleted file mode 100644 index 182d7e35c538eab769c98e8bf437e943eb2fd2a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 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 - - - - - - diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg deleted file mode 100644 index f3b52efac..000000000 --- a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js b/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js deleted file mode 100644 index b6fbfd4c2..000000000 --- a/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js +++ /dev/null @@ -1,147 +0,0 @@ -'use strict'; -'require baseclass'; -'require ui'; - -return baseclass.extend({ - __init__: function() { - ui.menu.load().then(L.bind(this.render, this)); - }, - - render: function(tree) { - var node = tree, - url = ''; - - this.renderModeMenu(node); - - if (L.env.dispatchpath.length >= 3) { - for (var i = 0; i < 3 && node; i++) { - node = node.children[L.env.dispatchpath[i]]; - url = url + (url ? '/' : '') + L.env.dispatchpath[i]; - } - - if (node) - this.renderTabMenu(node, url); - } - - document.querySelector('#menubar > .navigation') - .addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); - }, - - handleMenuExpand: function(ev) { - var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling; - - document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) { - if (li !== a.parentNode) - li.classList.remove('active'); - }); - - if (!ul2) - return; - - if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth) - ul2.classList.add('align-left'); - - ul1.classList.add('active'); - a.parentNode.classList.add('active'); - a.blur(); - - ev.preventDefault(); - ev.stopPropagation(); - }, - - renderMainMenu: function(tree, url, level) { - var l = (level || 0) + 1, - ul = E('ul', { 'class': 'mainmenu l%d'.format(l) }), - children = ui.menu.getChildren(tree); - - if (children.length == 0 || l > 2) - return E([]); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[l] == children[i].name), - isReadonly = children[i].readonly, - activeClass = 'mainmenu-item-%s%s'.format(children[i].name, isActive ? ' selected' : ''); - - ul.appendChild(E('li', { 'class': activeClass }, [ - E('a', { - 'href': L.url(url, children[i].name), - 'click': (l == 1) ? ui.createHandlerFn(this, 'handleMenuExpand') : null - }, [ _(children[i].title) ]), - this.renderMainMenu(children[i], url + '/' + children[i].name, l) - ])); - } - - if (l == 1) - document.querySelector('#mainmenu').appendChild(E('div', [ ul ])); - - return ul; - }, - - renderModeMenu: function(tree) { - var menu = document.querySelector('#modemenu'), - children = ui.menu.getChildren(tree); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); - - if (i > 0) - menu.appendChild(E([], ['\u00a0|\u00a0'])); - - menu.appendChild(E('div', { 'class': isActive ? 'active' : null }, [ - E('a', { 'href': L.url(children[i].name) }, [ _(children[i].title) ]) - ])); - - if (isActive) - this.renderMainMenu(children[i], children[i].name); - } - - if (menu.children.length > 1) - menu.style.display = ''; - }, - - renderTabMenu: function(tree, url, level) { - var container = document.querySelector('#tabmenu'), - l = (level || 0) + 1, - ul = E('ul', { 'class': 'cbi-tabmenu' }), - children = ui.menu.getChildren(tree), - activeNode = null; - - if (children.length == 0) - return E([]); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[l + 2] == children[i].name), - activeClass = isActive ? ' cbi-tab' : '', - className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); - - ul.appendChild(E('li', { 'class': className }, [ - E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] ) - ])); - - if (isActive) - activeNode = children[i]; - } - - container.appendChild(ul); - container.style.display = ''; - - if (activeNode) - container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l)); - - return ul; - }, - - handleSidebarToggle: function(ev) { - var btn = ev.currentTarget, - bar = document.querySelector('#mainmenu'); - - if (btn.classList.contains('active')) { - btn.classList.remove('active'); - bar.classList.remove('active'); - } - else { - btn.classList.add('active'); - bar.classList.add('active'); - } - } -}); diff --git a/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 b/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 deleted file mode 100755 index 7c49acfda..000000000 --- a/luci-theme-openwrt-2020/root/etc/uci-defaults/30_luci-theme-openwrt-2020 +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -if [ "$PKG_UPGRADE" != 1 ]; then - uci get luci.themes.OpenWrt2020 >/dev/null 2>&1 || \ - uci batch <<-EOF - set luci.themes.OpenWrt2020=/luci-static/openwrt2020 - set luci.main.mediaurlbase=/luci-static/openwrt2020 - commit luci - EOF -fi - -exit 0 diff --git a/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut b/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut deleted file mode 100644 index 5899f2a9d..000000000 --- a/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/footer.ut +++ /dev/null @@ -1,16 +0,0 @@ -{# - Copyright 2020 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --#} - -
-
- -

- Powered by {{ version.luciname }} ({{ version.luciversion }}) -

- - - - - diff --git a/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut b/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut deleted file mode 100644 index 2b7c58138..000000000 --- a/luci-theme-openwrt-2020/ucode/template/themes/openwrt2020/header.ut +++ /dev/null @@ -1,72 +0,0 @@ -{# - Copyright 2020 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --#} - -{% - import { getuid, getspnam } from 'luci.core'; - - const boardinfo = ubus.call('system', 'board'); - - http.prepare_content('text/html; charset=UTF-8'); --%} - - - - - - - - - - - - - -{{ striptags(`${boardinfo.hostname ?? '?'}${node ? ` - ${node.title}` : ''}`) }} - LuCI -{% if (css): %} - -{% endif %} - - - - - - - - - -
- - -
- {% if (getuid() == 0 && getspnam('root')?.pwdp === '' && join('-', ctx.request_path) != 'admin-system-admin'): %} -
-

{{ _('No password set!') }}

-

{{ _('There is no password set on this router. Please configure a root password to protect the web interface.') }}

- {% if (dispatcher.lookup("admin/system/admin")): %} - - {% endif %} -
- {% endif %} - - {% if (boardinfo.rootfs_type == "initramfs"): %} -
-

{{ _('System running in recovery (initramfs) mode.') }}

-

{{ _('No changes to settings will be stored and are lost after rebooting. This mode should only be used to install a firmware upgrade') }}

- {% if (dispatcher.lookup("admin/system/flash")): %} - - {% endif %} -
- {% endif %} - - diff --git a/luci-theme-openwrt/Makefile b/luci-theme-openwrt/Makefile deleted file mode 100644 index 8c75e93c4..000000000 --- a/luci-theme-openwrt/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2008-2014 The LuCI Team -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI OpenWrt.org theme -LUCI_DEPENDS:= - -define Package/luci-theme-openwrt/postrm -#!/bin/sh -[ -n "$${IPKG_INSTROOT}" ] || { - uci -q delete luci.themes.OpenWrt - uci commit luci -} -endef - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature From dacb6205fbc44e73e526c2861a8bcced9131828c Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 08:41:33 +0800 Subject: [PATCH 20/73] fix netifd --- netifd/Makefile | 13 ++++++++----- .../hotplug.d/net/20-smp-packet-steering} | 7 ++----- netifd/files/etc/init.d/packet_steering | 18 ------------------ netifd/files/lib/netifd/dhcp.script | 4 ++-- netifd/files/lib/netifd/proto/dhcp.sh | 9 +++++---- 5 files changed, 17 insertions(+), 34 deletions(-) rename netifd/files/{usr/libexec/network/packet-steering.sh => etc/hotplug.d/net/20-smp-packet-steering} (92%) mode change 100755 => 100644 delete mode 100755 netifd/files/etc/init.d/packet_steering diff --git a/netifd/Makefile b/netifd/Makefile index 31fd0838a..4b5f110da 100644 --- a/netifd/Makefile +++ b/netifd/Makefile @@ -5,15 +5,15 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git -PKG_SOURCE_DATE:=2023-06-04 -PKG_SOURCE_VERSION:=ec9dba72124597b7224bbfe75960386dc320f4bd -PKG_MIRROR_HASH:=baee39a3882a2b03fc83a3a6a8963c340fa8d884c7a8c9e80e7d2dddc50e24bd +PKG_SOURCE_DATE:=2021-07-26 +PKG_SOURCE_VERSION:=440eb0647708274cc8d7d9e7c2bb0cfdfba90023 +PKG_MIRROR_HASH:=eed957036ab608fdc49bdf801fc5b4405fcd2a3a5e5d3343ec39898e156c10e9 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:= -PKG_BUILD_FLAGS:=lto +PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk @@ -32,7 +32,10 @@ endef TARGET_CFLAGS += \ -I$(STAGING_DIR)/usr/include/libnl-tiny \ - -I$(STAGING_DIR)/usr/include + -I$(STAGING_DIR)/usr/include \ + -flto + +TARGET_LDFLAGS += -flto -fuse-linker-plugin CMAKE_OPTIONS += \ -DLIBNL_LIBS=-lnl-tiny \ diff --git a/netifd/files/usr/libexec/network/packet-steering.sh b/netifd/files/etc/hotplug.d/net/20-smp-packet-steering old mode 100755 new mode 100644 similarity index 92% rename from netifd/files/usr/libexec/network/packet-steering.sh rename to netifd/files/etc/hotplug.d/net/20-smp-packet-steering index 799c08080..8a86bf75f --- a/netifd/files/usr/libexec/network/packet-steering.sh +++ b/netifd/files/etc/hotplug.d/net/20-smp-packet-steering @@ -1,4 +1,6 @@ #!/bin/sh +[ "$ACTION" = add ] || exit + NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)" [ "$NPROCS" -gt 1 ] || exit @@ -38,11 +40,6 @@ packet_steering="$(uci get "network.@globals[0].packet_steering")" exec 512>/var/lock/smp_tune.lock flock 512 || exit 1 -[ -e "/usr/libexec/platform/packet-steering.sh" ] && { - /usr/libexec/platform/packet-steering.sh - exit 0 -} - for dev in /sys/class/net/*; do [ -d "$dev" ] || continue diff --git a/netifd/files/etc/init.d/packet_steering b/netifd/files/etc/init.d/packet_steering deleted file mode 100755 index 9d8f791e2..000000000 --- a/netifd/files/etc/init.d/packet_steering +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=25 -USE_PROCD=1 - -start_service() { - reload_service -} - -service_triggers() { - procd_add_reload_trigger "network" - procd_add_reload_trigger "firewall" - procd_add_raw_trigger "interface.*" 1000 /etc/init.d/packet_steering reload -} - -reload_service() { - /usr/libexec/network/packet-steering.sh -} diff --git a/netifd/files/lib/netifd/dhcp.script b/netifd/files/lib/netifd/dhcp.script index 6fcf139be..c857c9fc0 100755 --- a/netifd/files/lib/netifd/dhcp.script +++ b/netifd/files/lib/netifd/dhcp.script @@ -13,7 +13,7 @@ set_classless_routes() { done } -setup_interface () { +setup_interface() { proto_init_update "*" 1 proto_add_ipv4_address "$ip" "${subnet:-255.255.255.0}" # TODO: apply $broadcast @@ -27,6 +27,7 @@ setup_interface () { eval "$(ipcalc.sh "$i/$mask")";gw_net="$NETWORK" [ "$ip_net" != "$gw_net" ] && proto_add_ipv4_route "$i" 32 "" "$ip" + #[ "$DEFAULTROUTE" = 0 ] || proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip" proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip" local r @@ -60,7 +61,6 @@ setup_interface () { [ -n "$message" ] && json_add_string message "$message" [ -n "$timezone" ] && json_add_int timezone "$timezone" [ -n "$lease" ] && json_add_int leasetime "$lease" - [ -n "$serverid" ] && json_add_string dhcpserver "$serverid" proto_close_data proto_send_update "$INTERFACE" diff --git a/netifd/files/lib/netifd/proto/dhcp.sh b/netifd/files/lib/netifd/proto/dhcp.sh index 636b4654f..8db848260 100755 --- a/netifd/files/lib/netifd/proto/dhcp.sh +++ b/netifd/files/lib/netifd/proto/dhcp.sh @@ -1,6 +1,6 @@ #!/bin/sh -[ -x /sbin/udhcpc ] || exit 0 +[ -L /sbin/udhcpc ] || exit 0 . /lib/functions.sh . ../netifd-proto.sh @@ -35,8 +35,8 @@ proto_dhcp_setup() { local config="$1" local iface="$2" - local ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes classlessroute - json_get_vars ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd delegate zone6rd zone mtu6rd customroutes classlessroute + local ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes classlessroute defaultroute + json_get_vars ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd delegate zone6rd zone mtu6rd customroutes classlessroute defaultroute local opt dhcpopts for opt in $reqopts; do @@ -58,6 +58,7 @@ proto_dhcp_setup() { [ -n "$zone" ] && proto_export "ZONE=$zone" [ -n "$mtu6rd" ] && proto_export "MTU6RD=$mtu6rd" [ -n "$customroutes" ] && proto_export "CUSTOMROUTES=$customroutes" + [ -n "$defaultroute" ] && proto_export "DEFAULTROUTE=$defaultroute" [ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0" # Request classless route option (see RFC 3442) by default [ "$classlessroute" = "0" ] || append dhcpopts "-O 121" @@ -67,7 +68,7 @@ proto_dhcp_setup() { -p /var/run/udhcpc-$iface.pid \ -s /lib/netifd/dhcp.script \ -f -t 0 -i "$iface" \ - ${ipaddr:+-r ${ipaddr/\/*/}} \ + ${ipaddr:+-r $ipaddr} \ ${hostname:+-x "hostname:$hostname"} \ ${vendorid:+-V "$vendorid"} \ $clientid $defaultreqopts $broadcast $norelease $dhcpopts From b3d17da339cea6306c83dc25a28d1de3f6d14744 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 08:47:44 +0800 Subject: [PATCH 21/73] fixx --- 6in4/Makefile | 5 +- 6in4/files/6in4.sh | 32 +- ipcalc/Makefile | 0 net-tools/Makefile | 14 +- net-tools/patches/mptcp-support.patch | 338 ++++++++++++++++++ omr-6in4/Makefile | 0 protobuf/Makefile | 8 +- protobuf/patches/010-rpath.patch | 24 -- serdisplib/Makefile | 83 ++--- .../patches/002-allow-1bpp-framebuffer.patch | 21 -- serdisplib/patches/010-cross-compile.patch | 101 ------ speedtestc/Makefile | 0 speedtestcpp/Makefile | 72 ++-- tsping/Makefile | 0 14 files changed, 417 insertions(+), 281 deletions(-) mode change 100755 => 100644 ipcalc/Makefile create mode 100644 net-tools/patches/mptcp-support.patch mode change 100755 => 100644 omr-6in4/Makefile delete mode 100644 protobuf/patches/010-rpath.patch delete mode 100644 serdisplib/patches/002-allow-1bpp-framebuffer.patch delete mode 100644 serdisplib/patches/010-cross-compile.patch mode change 100755 => 100644 speedtestc/Makefile mode change 100755 => 100644 tsping/Makefile diff --git a/6in4/Makefile b/6in4/Makefile index edbb7d71a..d0f2ad30c 100644 --- a/6in4/Makefile +++ b/6in4/Makefile @@ -1,5 +1,7 @@ # # Copyright (C) 2010-2015 OpenWrt.org +# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) +# - Added gateway setting # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -8,7 +10,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=6in4 -PKG_RELEASE:=28 +PKG_VERSION:=270 +PKG_RELEASE:=2 PKG_LICENSE:=GPL-2.0 include $(INCLUDE_DIR)/package.mk diff --git a/6in4/files/6in4.sh b/6in4/files/6in4.sh index 5b5c7b36a..cf17c86d8 100755 --- a/6in4/files/6in4.sh +++ b/6in4/files/6in4.sh @@ -9,20 +9,6 @@ init_proto "$@" } -# Function taken from 6to4 package (6to4.sh), flipped returns -test_6in4_rfc1918() -{ - local oIFS="$IFS"; IFS="."; set -- $1; IFS="$oIFS" - [ $1 -eq 10 ] && return 1 - [ $1 -eq 192 ] && [ $2 -eq 168 ] && return 1 - [ $1 -eq 172 ] && [ $2 -ge 16 ] && [ $2 -le 31 ] && return 1 - - # RFC 6598 - [ $1 -eq 100 ] && [ $2 -ge 64 ] && [ $2 -le 127 ] && return 1 - - return 0 -} - proto_6in4_update() { sh -c ' timeout=5 @@ -45,8 +31,8 @@ proto_6in4_setup() { local iface="$2" local link="6in4-$cfg" - local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix ip6prefixes tunlink tunnelid username password updatekey - json_get_vars mtu ttl tos ipaddr peeraddr ip6addr tunlink tunnelid username password updatekey + local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix ip6prefixes tunlink tunnelid username password updatekey gateway + json_get_vars mtu ttl tos ipaddr peeraddr ip6addr tunlink tunnelid username password updatekey gateway json_for_each_item proto_6in4_add_prefix ip6prefix ip6prefixes [ -z "$peeraddr" ] && { @@ -55,7 +41,7 @@ proto_6in4_setup() { return } - ( proto_add_host_dependency "$cfg" "$peeraddr" "$tunlink" ) + [ -n "$tunlink" ] && ( proto_add_host_dependency "$cfg" "$peeraddr" "$tunlink" ) [ -z "$ipaddr" ] && { local wanif="$tunlink" @@ -75,11 +61,15 @@ proto_6in4_setup() { [ -n "$ip6addr" ] && { local local6="${ip6addr%%/*}" local mask6="${ip6addr##*/}" - [ "$local6" = "$mask6" ] && mask6= + [[ "$local6" = "$mask6" ]] && mask6= proto_add_ipv6_address "$local6" "$mask6" proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6" } + [ -n "$gateway" ] && { + proto_add_ipv6_route "::" 0 "$gateway" + } + for ip6prefix in $ip6prefixes; do proto_add_ipv6_prefix "$ip6prefix" proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix" @@ -111,11 +101,6 @@ proto_6in4_setup() { } local url="$http://ipv4.tunnelbroker.net/nic/update?hostname=$tunnelid" - - test_6in4_rfc1918 "$ipaddr" && { - local url="${url}&myip=${ipaddr}" - } - local try=0 local max=3 @@ -153,6 +138,7 @@ proto_6in4_init_config() { proto_config_add_string "username" proto_config_add_string "password" proto_config_add_string "updatekey" + proto_config_add_string "gateway" proto_config_add_int "mtu" proto_config_add_int "ttl" proto_config_add_string "tos" diff --git a/ipcalc/Makefile b/ipcalc/Makefile old mode 100755 new mode 100644 diff --git a/net-tools/Makefile b/net-tools/Makefile index e620d4e2a..6336c57e5 100644 --- a/net-tools/Makefile +++ b/net-tools/Makefile @@ -1,6 +1,7 @@ # # Copyright (C) 2006-2010 OpenWrt.org # Copyright (C) 2016 Stijn Segers +# Copyright (C) 2020 Ycarus (Yannick Chabanois) for OpenMPTCProuter # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,14 +10,15 @@ include $(TOPDIR)/rules.mk PKG_NAME:=net-tools -PKG_VERSION:=2.10 -PKG_RELEASE:=1 +PKG_SOURCE_DATE:=2018-11-03 +PKG_SOURCE_VERSION:=0eebece8c964e3cfa8a018f42b2e7e751a7009a0 +PKG_RELEASE:=2 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=https://sourceforge.net/projects/net-tools/files/ -PKG_HASH:=b262435a5241e89bfa51c3cabd5133753952f7a7b7b93f32e08cb9d96f580d69 +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://git.code.sf.net/p/net-tools/code +PKG_MIRROR_HASH:=9d978b9f8ccae4af623a299155c62d9b3d31213182c785f925bf8704d48a04c9 -PKG_MAINTAINER:=Stijn Segers +PKG_MAINTAINER:=Yannick Chabanois PKG_LICENSE:=GPL-2.0-or-later PKG_LICENSE_FILES:=COPYING diff --git a/net-tools/patches/mptcp-support.patch b/net-tools/patches/mptcp-support.patch new file mode 100644 index 000000000..b9f69d0f8 --- /dev/null +++ b/net-tools/patches/mptcp-support.patch @@ -0,0 +1,338 @@ +diff -aurN net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/lib/pathnames.h net-tools-mptcp_v0.95/lib/pathnames.h +--- net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/lib/pathnames.h 2018-11-03 14:23:32.000000000 +0100 ++++ net-tools-mptcp_v0.95/lib/pathnames.h 2019-06-22 22:52:42.000000000 +0200 +@@ -14,6 +14,7 @@ + #define _PATH_PROCNET_IGMP6 "/proc/net/igmp6" + #define _PATH_PROCNET_TCP "/proc/net/tcp" + #define _PATH_PROCNET_TCP6 "/proc/net/tcp6" ++#define _PATH_PROCNET_MPTCP "/proc/net/mptcp_net/mptcp" + #define _PATH_PROCNET_UDP "/proc/net/udp" + #define _PATH_PROCNET_UDP6 "/proc/net/udp6" + #define _PATH_PROCNET_UDPLITE "/proc/net/udplite" +diff -aurN net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/netstat.c net-tools-mptcp_v0.95/netstat.c +--- net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/netstat.c 2018-11-03 14:23:32.000000000 +0100 ++++ net-tools-mptcp_v0.95/netstat.c 2019-06-22 22:52:42.000000000 +0200 +@@ -115,7 +115,7 @@ + #endif + + /* prototypes for statistics.c */ +-void parsesnmp(int, int, int, int); ++void parsesnmp(int, int, int, int, int); + void parsesnmp6(int, int, int); + + typedef enum { +@@ -155,6 +155,7 @@ + int flag_opt = 0; + int flag_raw = 0; + int flag_tcp = 0; ++int flag_mptcp = 0; + int flag_sctp= 0; + int flag_udp = 0; + int flag_udplite = 0; +@@ -1206,6 +1207,83 @@ + tcp_do_one, "tcp", "tcp6"); + } + ++static void mptcp_do_one(int lnr, const char *line, const char *prot) ++{ ++ int d, ipv6, num, local_port, rem_port, state, nsub; ++ unsigned long txq, rxq, local_token, remote_token, inode; ++ char rem_addr[128], local_addr[128]; ++ struct sockaddr_storage localsas, remsas; ++ struct sockaddr_in *localaddr = (struct sockaddr_in *)&localsas; ++ struct sockaddr_in *remaddr = (struct sockaddr_in *)&remsas; ++ const struct aftype *ap; ++#if HAVE_AFINET6 ++ char addr6[INET6_ADDRSTRLEN]; ++ struct in6_addr in6; ++ extern struct aftype inet6_aftype; ++#endif ++ ++ if (lnr == 0) ++ return; ++ ++ num = sscanf(line, "%d: %lX %lX %d %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X " ++ "%X %X %lX:%lX %lu\n", &d, &local_token, &remote_token, ++ &ipv6, local_addr, &local_port, rem_addr, &rem_port, ++ &state, &nsub, &txq, &rxq, &inode); ++ ++ if (strlen(local_addr) > 8) { ++#if HAVE_AFINET6 ++ /* Demangle what the kernel gives us */ ++ sscanf(local_addr, "%08X%08X%08X%08X", ++ &in6.s6_addr32[0], &in6.s6_addr32[1], ++ &in6.s6_addr32[2], &in6.s6_addr32[3]); ++ inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6)); ++ inet6_aftype.input(1, addr6, &localsas); ++ sscanf(rem_addr, "%08X%08X%08X%08X", ++ &in6.s6_addr32[0], &in6.s6_addr32[1], ++ &in6.s6_addr32[2], &in6.s6_addr32[3]); ++ inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6)); ++ inet6_aftype.input(1, addr6, &remsas); ++ localsas.ss_family = AF_INET6; ++ remsas.ss_family = AF_INET6; ++#endif ++ } else { ++ sscanf(local_addr, "%X", ++ &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr); ++ sscanf(rem_addr, "%X", ++ &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr); ++ localsas.ss_family = AF_INET; ++ remsas.ss_family = AF_INET; ++ } ++ ++ if (num < 12) { ++ fprintf(stderr, _("warning, got bogus mptcp line.\n")); ++ return; ++ } ++ ++ if ((ap = get_afntype(localsas.ss_family)) == NULL) { ++ fprintf(stderr, _("netstat: unsupported address family %d !\n"), ++ localsas.ss_family); ++ return; ++ } ++ ++ addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localsas, local_port, "tcp"); ++ addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remsas, rem_port, "tcp"); ++ ++ printf("%-4s %6ld %6ld %-*s %-*s %-11s", ++ prot, rxq, txq, (int)netmax(23,strlen(local_addr)), local_addr, ++ (int)netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state])); ++ ++ if (flag_mptcp) ++ printf(" %-11lu %-12lu", local_token, remote_token); ++ ++ finish_this_one(0, inode, NULL); ++} ++ ++static int mptcp_info(void) ++{ ++ INFO_GUTS(_PATH_PROCNET_MPTCP, "AF INET (mptcp)", mptcp_do_one, "mptcp"); ++} ++ + static int notnull(const struct sockaddr_storage *sas) + { + const struct sockaddr_in *sin = (const struct sockaddr_in *)sas; +@@ -1994,7 +2072,7 @@ + fprintf(fp, _(" -Z, --context display SELinux security context for sockets\n")); + #endif + +- fprintf(fp, _("\n ={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}\n")); ++ fprintf(fp, _("\n ={-t|--tcp} {-m|--mptcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}\n")); + fprintf(fp, _(" {-x|--unix} --ax25 --ipx --netrom\n")); + fprintf(fp, _(" =Use '-6|-4' or '-A ' or '--'; default: %s\n"), DFLT_AF); + fprintf(fp, _(" List of possible address families (which support routing):\n")); +@@ -2019,6 +2097,7 @@ + #endif + {"protocol", 1, 0, 'A'}, + {"tcp", 0, 0, 't'}, ++ {"mptcp", 0, 0, 'm'}, + {"sctp", 0, 0, 'S'}, + {"udp", 0, 0, 'u'}, + {"udplite", 0, 0, 'U'}, +@@ -2055,7 +2134,7 @@ + getroute_init(); /* Set up AF routing support */ + + afname[0] = '\0'; +- while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStuUvVWw2fx64?Z", longopts, &lop)) != EOF) ++ while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStmuUvVWw2fx64?Z", longopts, &lop)) != EOF) + switch (i) { + case -1: + break; +@@ -2146,6 +2225,9 @@ + case 't': + flag_tcp++; + break; ++ case 'm': ++ flag_mptcp++; ++ break; + case 'S': + flag_sctp++; + break; +@@ -2194,17 +2276,17 @@ + usage(E_OPTERR); + + if ((flag_inet || flag_inet6 || flag_sta) && +- !(flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw)) +- flag_noprot = flag_tcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; ++ !(flag_tcp || flag_sctp || flag_mptcp || flag_udp || flag_udplite || flag_raw)) ++ flag_noprot = flag_tcp = flag_mptcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; + +- if ((flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw || flag_igmp) && ++ if ((flag_tcp || flag_sctp || flag_mptcp || flag_udp || flag_udplite || flag_raw || flag_igmp) && + !(flag_inet || flag_inet6)) + flag_inet = flag_inet6 = 1; + + if (flag_bluetooth && !(flag_l2cap || flag_rfcomm)) + flag_l2cap = flag_rfcomm = 1; + +- flag_arg = flag_tcp + flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx ++ flag_arg = flag_tcp + flag_mptcp +flag_sctp + flag_udplite + flag_udp + flag_raw + flag_unx + + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose + + flag_l2cap + flag_rfcomm; + +@@ -2234,7 +2316,7 @@ + + if (!strcmp(afname, "inet")) { + #if HAVE_AFINET +- parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp); ++ parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp, flag_mptcp); + #else + ENOSUPP("netstat", "AF INET"); + #endif +@@ -2284,7 +2366,7 @@ + return (i); + } + for (;;) { +- if (!flag_arg || flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw) { ++ if (!flag_arg || flag_tcp || flag_mptcp || flag_sctp || flag_udp || flag_udplite || flag_raw) { + #if HAVE_AFINET + prg_cache_load(); + printf(_("Active Internet connections ")); /* xxx */ +@@ -2298,6 +2380,8 @@ + printf(_("(w/o servers)")); + } + printf(_("\nProto Recv-Q Send-Q Local Address Foreign Address State ")); /* xxx */ ++ if (flag_mptcp) ++ printf(_(" Local Token Remote Token ")); + if (flag_exp > 1) + printf(_(" User Inode ")); + print_progname_banner(); +@@ -2318,6 +2402,12 @@ + if (i) + return (i); + } ++ ++ if (!flag_arg || flag_mptcp) { ++ i = mptcp_info(); ++ if (i) ++ return (i); ++ } + + if (!flag_arg || flag_sctp) { + i = sctp_info(); +diff -aurN net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/statistics.c net-tools-mptcp_v0.95/statistics.c +--- net-tools-code-0eebece8c964e3cfa8a018f42b2e7e751a7009a0/statistics.c 2018-11-03 14:23:32.000000000 +0100 ++++ net-tools-mptcp_v0.95/statistics.c 2019-06-22 22:52:42.000000000 +0200 +@@ -13,7 +13,7 @@ + #include "intl.h" + #include "proc.h" + +-static int print_static,f_raw,f_tcp,f_udp,f_sctp,f_unknown = 1; ++static int print_static,f_raw,f_tcp,f_udp,f_sctp,f_mptcp,f_unknown = 1; + + enum State { + number = 0, opt_number, i_forward, i_inp_icmp, i_outp_icmp, i_rto_alg, +@@ -295,6 +295,51 @@ + {"SctpShutdowns", N_("%llu Number of Graceful Terminations"), number}, + }; + ++static const struct entry Mptcptab[] = ++{ /* Keep the entries sorted! */ ++ {"AddAddrRx", N_("%llu Number of ADD_ADDRs received"), number}, ++ {"AddAddrTx", N_("%llu Number of ADD_ADDRs sent"), number}, ++ {"DSSNoMatchTCP", N_("%llu Number of DSS-mapping/TCP sequence number mismatches"), number}, ++ {"DSSNotMatching", N_("%llu Number of new mismatched mappings"), number}, ++ {"DSSPurgeOldSubSegs", N_("%llu Number of skbs removed from the rcv-queue due to missing DSS-mapping"), number}, ++ {"DSSSplitTail", N_("%llu Number of trimmed segments at the tail"), number}, ++ {"DSSTrimHead", N_("%llu Number of trimmed segments at the head"), number}, ++ {"InfiniteMapRx", N_("%llu Number of infinite mappings received"), number}, ++ {"MPCapableACKRX", N_("%llu Number of received third ACKs with MP_CAPABLE"), number}, ++ {"MPCapableFallbackACK", N_("%llu Number of server-side fallbacks during the 3-way handshake"), number}, ++ {"MPCapableFallbackSYNACK", N_("%llu Number of client-side fallbacks during the 3-way handshake"), number}, ++ {"MPCapableRetransFallback", N_("%llu Number of times the client-side stopped sending MP_CAPABLE after too many SYN-retransmissions"), ++ number}, ++ {"MPCapableSYNACKRX", N_("%llu Number of received SYN/ACKs with MP_CAPABLE"), number}, ++ {"MPCapableSYNRX", N_("%llu Number of received SYNs with MP_CAPABLE"), number}, ++ {"MPCapableSYNTX", N_("%llu Number of sent SYNs with MP_CAPABLE"), number}, ++ {"MPCsumFail", N_("%llu Number of received segments with an invalid checksum"), number}, ++ {"MPFailRX", N_("%llu Number of MP_FAILs received"), number}, ++ {"MPFallbackAckInit", N_("%llu Number of fallbacks upon ack without data-ack on initial subflow"), number}, ++ {"MPFallbackAckSub", N_("%llu Number of fallbacks upon ack without data-ack on new subflow"), number}, ++ {"MPFallbackDataInit", N_("%llu Number of fallbacks upon data without DSS at the beginning on initial subflow"), number}, ++ {"MPFallbackDataSub", N_("%llu Number of fallbacks upon data without DSS at the beginning on new subflow"), number}, ++ {"MPFastcloseRX", N_("%llu Number of FAST_CLOSEs received"), number}, ++ {"MPFastcloseTX", N_("%llu Number of FAST_CLOSEs sent"), number}, ++ {"MPJoinAckHMacFailure", N_("%llu Number of HMAC mismatches on ACK + MP_JOIN"), number}, ++ {"MPJoinAckMissing", N_("%llu Number of third ACKs on a new subflow not containing a MP_JOIN"), number}, ++ {"MPJoinAckRTO", N_("%llu Number of retransmission timeouts for third ACK + MP_JOIN"), number}, ++ {"MPJoinAckRexmit", N_("%llu Number of retransmitted ACK + MP_JOINs"), number}, ++ {"MPJoinAckRx", N_("%llu Number of ACK + MP_JOINs received"), number}, ++ {"MPJoinAlreadyFallenback", N_("%llu Number of received MP_JOINs on a session that has fallen back to reg. TCP"), number}, ++ {"MPJoinNoTokenFound", N_("%llu Number of received MP_JOINs without a token"), number}, ++ {"MPJoinSynAckHMacFailure", N_("%llu Number of received SYN/ACK + MP_JOINs with a HMAC mismatch"), number}, ++ {"MPJoinSynAckRx", N_("%llu Number of SYN/ACK + MP_JOINs received"), number}, ++ {"MPJoinSynRx", N_("%llu Number of SYN + MP_JOINs received"), number}, ++ {"MPJoinSynTx", N_("%llu Number of SYN + MP_JOINs sent"), number}, ++ {"MPRemoveAddrSubDelete", N_("%llu Number of subflows removed due to REMOVE_ADDR"), number}, ++ {"MPTCPCsumEnabled", N_("%llu Number of MPTCP connections created with DSS-checksum enabled"), number}, ++ {"MPTCPRetrans", N_("%llu Number of segments retransmitted at the MPTCP level"), number}, ++ {"NoDSSInWindow", N_("%llu Number of too many packets received without a DSS option errors"), number}, ++ {"RemAddrRx", N_("%llu Number of REMOVE_ADDRs received"), number}, ++ {"RemAddrTx", N_("%llu Number of REMOVE_ADDRs sent"), number}, ++}; ++ + struct tabtab { + const char *title; + const struct entry *tab; +@@ -310,6 +355,7 @@ + {"Udp", Udptab, sizeof(Udptab), &f_udp}, + {"Sctp", Sctptab, sizeof(Sctptab), &f_sctp}, + {"TcpExt", Tcpexttab, sizeof(Tcpexttab), &f_tcp}, ++ {"Mptcp", Mptcptab, sizeof(Mptcptab), &f_mptcp}, + {NULL} + }; + +@@ -503,13 +549,13 @@ + } + + /* Process a file with name-value lines (like /proc/net/sctp/snmp) */ +-static void process_fd2(FILE *f, const char *filename) ++static void process_fd2(FILE *f, const char *filename, const char *tablename) + { + char buf1[1024]; + char *sp; + const struct tabtab *tab; + +- tab = newtable(snmptabs, "Sctp"); ++ tab = newtable(snmptabs, tablename); + + while (fgets(buf1, sizeof buf1, f)) { + sp = buf1 + strcspn(buf1, " \t\n"); +@@ -527,11 +573,11 @@ + } + } + +-void parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp) ++void parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp, int flag_mptcp) + { + FILE *f; + +- f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; f_sctp = flag_sctp; ++ f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; f_sctp = flag_sctp; f_mptcp = flag_mptcp; + + f = proc_fopen("/proc/net/snmp"); + if (!f) { +@@ -561,12 +607,21 @@ + + f = proc_fopen("/proc/net/sctp/snmp"); + if (f) { +- process_fd2(f,"/proc/net/sctp/snmp"); ++ process_fd2(f,"/proc/net/sctp/snmp", "Sctp"); + if (ferror(f)) { + perror("/proc/net/sctp/snmp"); + fclose(f); + } + } ++ ++ f = proc_fopen("/proc/net/mptcp_net/snmp"); ++ if (f) { ++ process_fd2(f,"/proc/net/mptcp_net/snmp", "Mptcp"); ++ if (ferror(f)) { ++ perror("/proc/net/mptcp_net/snmp"); ++ fclose(f); ++ } ++ } + } + + void parsesnmp6(int flag_raw, int flag_tcp, int flag_udp) diff --git a/omr-6in4/Makefile b/omr-6in4/Makefile old mode 100755 new mode 100644 diff --git a/protobuf/Makefile b/protobuf/Makefile index de6aa5a40..cc314bbea 100644 --- a/protobuf/Makefile +++ b/protobuf/Makefile @@ -8,18 +8,20 @@ include $(TOPDIR)/rules.mk PKG_NAME:=protobuf -PKG_VERSION:=3.17.3 -PKG_RELEASE:=1 +PKG_VERSION:=3.14.0 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-cpp-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/google/protobuf/releases/download/v$(PKG_VERSION) -PKG_HASH:=51cec99f108b83422b7af1170afd7aeb2dd77d2bcbb7b6bad1f92509e9ccf8cb +PKG_HASH:=50ec5a07c0c55d4ec536dd49021f2e194a26bfdbc531d03d1e9d4d3e27175659 PKG_MAINTAINER:=Ken Keys PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=LICENSE PKG_CPE_ID:=cpe:/a:google:protobuf +HOST_BUILD_PARALLEL:=1 +PKG_BUILD_PARALLEL:=1 CMAKE_SOURCE_SUBDIR:=cmake include $(INCLUDE_DIR)/package.mk diff --git a/protobuf/patches/010-rpath.patch b/protobuf/patches/010-rpath.patch deleted file mode 100644 index ef3e98ab1..000000000 --- a/protobuf/patches/010-rpath.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/cmake/install.cmake -+++ b/cmake/install.cmake -@@ -16,8 +16,8 @@ foreach(_library ${_protobuf_libraries}) - $ - $) - if (UNIX AND NOT APPLE) -- set_property(TARGET ${_library} -- PROPERTY INSTALL_RPATH "$ORIGIN") -+# set_property(TARGET ${_library} -+# PROPERTY INSTALL_RPATH "$ORIGIN") - elseif (APPLE) - set_property(TARGET ${_library} - PROPERTY INSTALL_RPATH "@loader_path") -@@ -34,8 +34,8 @@ if (protobuf_BUILD_PROTOC_BINARIES) - BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} - COMPONENT protoc) - if (UNIX AND NOT APPLE) -- set_property(TARGET protoc -- PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") -+# set_property(TARGET protoc -+# PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") - elseif (APPLE) - set_property(TARGET protoc - PROPERTY INSTALL_RPATH "@loader_path/../lib") diff --git a/serdisplib/Makefile b/serdisplib/Makefile index 8b36a4a51..c0b2af05d 100644 --- a/serdisplib/Makefile +++ b/serdisplib/Makefile @@ -1,83 +1,58 @@ +# +# Copyright (C) 2006-2011 OpenWrt.org +# Copyright (C) 2019 Ycarus (Yannick Chabanois) +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + include $(TOPDIR)/rules.mk PKG_NAME:=serdisplib -PKG_VERSION:=2.02 -PKG_RELEASE:=2 +PKG_VERSION:=2.01 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@SF/serdisplib -PKG_HASH:=447b74007dc157b0378044245649850b26432b9185b6540ff681fcb0765c4d8b - -PKG_MAINTAINER:=Daniel Golle -PKG_LICENSE:=GPL-2.0-or-later -PLG_LICENSE_FILES:=COPYING - -PKG_FIXUP:=autoreconf -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 -PKG_BUILD_DEPENDS:=libusb-compat +PKG_MD5SUM:=4eb17cd70aa963c30a237d426ac24449 include $(INCLUDE_DIR)/package.mk define Package/serdisplib SECTION:=libs CATEGORY:=Libraries - TITLE:=serdisplib + TITLE:=A display control library URL:=http://serdisplib.sourceforge.net/ + DEPENDS:=+libusb-1.0 +libusb-compat endef define Package/serdisplib/description - serdisplib started as a library to drive serial displays with - built-in controllers. It can optionally dynamically link with - libusb-compat, libgd and libpthread, some features require having - those packages installed as well. + serdisplib is a library to drive serial and parallel displays + with built-in controllers. endef -define Package/serdisplib-tools - SECTION:=utils - CATEGORY:=Utilities - TITLE:=serdisplib tools - URL:=http://serdisplib.sourceforge.net/ - DEPENDS:=+serdisplib +libgd +CONFIGURE_ARGS+= \ + --enable-shared \ + --enable-static \ + +TARGET_CFLAGS += $(FPIC) + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + CFLAGS="$(TARGET_CFLAGS) -Wall -Wno-implicit -I../include -I.." \ + all endef -define Package/serdisplib-tools/description - serdisplib started as a library to drive serial displays with - built-in controllers. This package contains tools for serdisplib: - * l4m132c_tool - * l4m320t_tool - * multidisplay - * sdcmegtron_tool - * touchscreen_tool -endef - -CONFIGURE_VARS += \ - ac_cv_build=$(GNU_TARGET_NAME) - -CONFIGURE_ARGS += \ - --enable-dynloading \ - --disable-statictools - define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/include/serdisplib - $(CP) $(PKG_INSTALL_DIR)/usr/include/serdisplib/*.h $(1)/usr/include/serdisplib + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_BUILD_DIR)/include/serdisplib $(1)/usr/include/ $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libserdisp.{a,so*} $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/lib/libserdisp.{a,so*} $(1)/usr/lib/ endef define Package/serdisplib/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libserdisp.so* $(1)/usr/lib/ -endef - -define Package/serdisplib-tools/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/l4m132c_tool $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/l4m320t_tool $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/multidisplay $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sdcmegtron_tool $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/touchscreen_tool $(1)/usr/bin + $(CP) $(PKG_BUILD_DIR)/lib/libserdisp.so.* $(1)/usr/lib endef $(eval $(call BuildPackage,serdisplib)) -$(eval $(call BuildPackage,serdisplib-tools)) diff --git a/serdisplib/patches/002-allow-1bpp-framebuffer.patch b/serdisplib/patches/002-allow-1bpp-framebuffer.patch deleted file mode 100644 index ada4281e9..000000000 --- a/serdisplib/patches/002-allow-1bpp-framebuffer.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/src/serdisp_specific_framebuffer.c -+++ b/src/serdisp_specific_framebuffer.c -@@ -312,13 +312,15 @@ serdisp_t* serdisp_framebuffer_setup(con - - if (fb_success) { - /* check if colour mode is supported */ -- if (! (vinfo.bits_per_pixel == 16 || vinfo.bits_per_pixel == 24 || vinfo.bits_per_pixel == 32) ) { -+ if (! (vinfo.bits_per_pixel == 1 ||vinfo.bits_per_pixel == 16 || vinfo.bits_per_pixel == 24 || vinfo.bits_per_pixel == 32) ) { - sd_error(SERDISP_ERUNTIME, "unsupported colour depth (%d)", vinfo.bits_per_pixel); - fb_success = 0; - } - } -- -- dd->scrbuf_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; -+ if (vinfo.bits_per_pixel == 1) -+ dd->scrbuf_size = (vinfo.xres * vinfo.yres) / 8; -+ else -+ dd->scrbuf_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; - - if (fb_success) { - /* map framebuffer device to memory */ diff --git a/serdisplib/patches/010-cross-compile.patch b/serdisplib/patches/010-cross-compile.patch deleted file mode 100644 index 339322251..000000000 --- a/serdisplib/patches/010-cross-compile.patch +++ /dev/null @@ -1,101 +0,0 @@ ---- a/Makefile.in -+++ b/Makefile.in -@@ -44,8 +44,8 @@ all: - done && test -z "$$fail" - - install: -- $(top_srcdir)/mkinstalldirs $(libdir)/pkgconfig -- $(INSTALL_DATA) serdisplib.pc $(libdir)/pkgconfig/ -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libdir)/pkgconfig -+ $(INSTALL_DATA) serdisplib.pc $(DESTDIR)$(libdir)/pkgconfig/ - @for dir in ${subdirs}; do \ - (cd $(srcdir) && cd $$dir && $(MAKE) install) \ - || case "$(MFLAGS)" in *k*) fail=yes;; *) exit 1;; esac; \ ---- a/server/Makefile.in -+++ b/server/Makefile.in -@@ -102,9 +102,9 @@ distclean: clean - - - install: $(PROGRAMS) -- $(top_srcdir)/mkinstalldirs $(bindir) -- $(top_srcdir)/mkinstalldirs $(sbindir) -- $(top_srcdir)/mkinstalldirs $(sysconfdir) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(sbindir) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(sysconfdir) - list='$(PROGRAMS_SBIN)'; \ - for prog in $$list; do \ - $(INSTALL_PROGRAM) $$prog $(sbindir)/ ; \ ---- a/src/Makefile.in -+++ b/src/Makefile.in -@@ -28,7 +28,7 @@ includedir = @includedir@ - datarootdir = @datarootdir@ - - CC=@CC@ --AR=@AR@ -r -+AR=@AR@ - LN_S=@LN_S@ - INSTALL=@INSTALL@ - INSTALL_PROGRAM = @INSTALL_PROGRAM@ -@@ -184,14 +184,14 @@ programs: $(PROGRAMS) - $(CC) $(CFLAGS) $(DEFINES) -c $< - - $(LIB_DIR)/$(LIB_STATIC): $(LIB_OBJECTS) -- $(top_srcdir)/mkinstalldirs $(top_srcdir)/lib -- $(AR) $(LIB_DIR)/$(LIB_STATIC) $(LIB_OBJECTS) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(top_srcdir)/lib -+ $(AR) -r -- $(LIB_DIR)/$(LIB_STATIC) $(LIB_OBJECTS) - - $(LIB_DIR)/$(LIB_SHARED): $(LIB_OBJECTS) -- $(top_srcdir)/mkinstalldirs $(top_srcdir)/lib -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(top_srcdir)/lib - $(CC) -fPIC -shared $(SONAME_FLAG) -o $(LIB_DIR)/$(LIB_SHARED) $(LIB_OBJECTS) $(LDFLAGS) $(EXTRA_LIBS) -- cd $(LIB_DIR) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) -- cd $(LIB_DIR) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so -+ cd $(DESTDIR)$(LIB_DIR) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) -+ cd $(DESTDIR)$(LIB_DIR) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so - - testserdisp: $(LIB_DIR)/$(LIB_STATIC) $(OBJECTS) - $(CC) -o testserdisp $(OBJECTS) $(LIB_SERDISP) $(EXTRA_LIBS_STATIC) -@@ -204,20 +204,20 @@ distclean: clean - /bin/rm -f Makefile - - install: $(LIB_DIR)/$(LIB_SHARED) $(LIB_DIR)/$(LIB_STATIC) -- $(top_srcdir)/mkinstalldirs $(bindir) -- $(top_srcdir)/mkinstalldirs $(libdir) -- $(top_srcdir)/mkinstalldirs $(includedir) -- $(top_srcdir)/mkinstalldirs $(includedir)/serdisplib -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libdir) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(includedir) -+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(includedir)/serdisplib - -- $(INSTALL_PROGRAM) $(PROGRAMS) $(bindir)/ -- $(INSTALL_PROGRAM) $(LIB_DIR)/$(LIB_SHARED) $(libdir)/ -- $(INSTALL_DATA) $(LIB_DIR)/$(LIB_STATIC) $(libdir)/ -+ $(INSTALL_PROGRAM) $(PROGRAMS) $(DESTDIR)$(bindir)/ -+ $(INSTALL_PROGRAM) $(LIB_DIR)/$(LIB_SHARED) $(DESTDIR)$(libdir)/ -+ $(INSTALL_DATA) $(LIB_DIR)/$(LIB_STATIC) $(DESTDIR)$(libdir)/ - list='$(LIB_HEADERFILES)'; \ - for headerfile in $$list; do \ -- $(INSTALL_DATA) ../include/serdisplib/$$headerfile $(includedir)/serdisplib/ ; \ -+ $(INSTALL_DATA) ../include/serdisplib/$$headerfile $(DESTDIR)$(includedir)/serdisplib/ ; \ - done -- cd $(libdir) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) -- cd $(libdir) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so -+ cd $(DESTDIR)$(libdir) && $(LN_S) -f $(LIB_SHARED) lib$(LIB_NAME).so.$(VERSION_MAJOR) -+ cd $(DESTDIR)$(libdir) && $(LN_S) -f lib$(LIB_NAME).so.$(VERSION_MAJOR) lib$(LIB_NAME).so - - uninstall: - -/bin/rm -f $(libdir)/libserdisp* ---- a/tools/Makefile.in -+++ b/tools/Makefile.in -@@ -151,7 +151,7 @@ distclean: clean - install: $(PROGRAMS) - list='$(PROGRAMS)'; \ - for prog in $$list; do \ -- $(INSTALL_PROGRAM) $$prog $(bindir)/ ; \ -+ $(INSTALL_PROGRAM) $$prog $(DESTDIR)$(bindir)/ ; \ - done - - uninstall: $(PROGRAMS) diff --git a/speedtestc/Makefile b/speedtestc/Makefile old mode 100755 new mode 100644 diff --git a/speedtestcpp/Makefile b/speedtestcpp/Makefile index 95e8dc382..db25f5bb8 100644 --- a/speedtestcpp/Makefile +++ b/speedtestcpp/Makefile @@ -1,66 +1,42 @@ +# +# Copyright (C) 2021 Ycarus (Yannick Chabanois) for OpenMPTCProuter project +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + include $(TOPDIR)/rules.mk PKG_NAME:=speedtestcpp -PKG_VERSION:=1.20.2 -PKG_RELEASE:=1 +PKG_VERSION:=1.12 +PKG_RELEASE:=2 +PKG_SOURCE_PROTO:=git +PKG_SOURCE_VERSION:=a01ae6eb04c5d3f4847aef73bf77849275ccc6eb PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://codeload.github.com/oskarirauta/speedtestcpp/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=7d5c85f1d9a46f7d8a3ac4261ef1f92e53c511430bae096f7ec6f12a33d38904 +PKG_SOURCE_URL:=https://github.com/fmantz/SpeedTest.git -PKG_MAINTAINER:=Oskari Rauta +PKG_MAINTAINER:=Ycarus PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE +CMAKE_INSTALL:=1 + include $(INCLUDE_DIR)/package.mk - -define Package/libspeedtestcpp - SECTION:=libs - CATEGORY:=Libraries - TITLE:=library for ookla's speedtest - DEPENDS:=+libcurl +libstdcpp - URL:=https://github.com/oskarirauta/speedtestcpp -endef - -define Package/libspeedtestcpp/description - Shared library that provides support for ookla's speedtest -endef +include $(INCLUDE_DIR)/cmake.mk define Package/speedtestcpp - SECTION:=net - CATEGORY:=Network - TITLE:=SpeedTest++ - DEPENDS:=+libspeedtestcpp +libstdcpp - URL:=https://github.com/oskarirauta/speedtestcpp - PROVIDES:=speedtestpp -endef - -define Package/speedtestcpp/description - Yet another unofficial speedtest.net client cli interface - forked from taganaka's SpeedTest with few improments and - lesser depends. -endef - -TARGET_CXXFLAGS += --std=c++23 -fPIC - -define Build/Configure -endef - -define Package/libspeedtestcpp/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_BUILD_DIR)/libspeedtestcpp.so* $(1)/usr/lib/ + SECTION:=net + CATEGORY:=Network + TITLE:=Yet another unofficial speedtest.net client cli interface + URL:=https://github.com/fmantz/SpeedTest + DEPENDS:=+curl +libstdcpp +libopenssl +libxml2 endef define Package/speedtestcpp/install $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/speedtest $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/SpeedTest $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/speedtestJson $(1)/usr/bin/ endef -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include/speedtest - $(CP) $(PKG_BUILD_DIR)/libspeedtestcpp.{so*,a} $(1)/usr/lib/ - $(CP) $(PKG_BUILD_DIR)/include/speedtest/*.hpp $(1)/usr/include/speedtest/ -endef - -$(eval $(call BuildPackage,libspeedtestcpp)) -$(eval $(call BuildPackage,speedtestcpp)) +$(eval $(call BuildPackage,speedtestcpp)) \ No newline at end of file diff --git a/tsping/Makefile b/tsping/Makefile old mode 100755 new mode 100644 From 7f7ccd1afb52d91370b0bb5a9b9c2c3a5bf257cd Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 23 Jun 2023 09:42:48 +0800 Subject: [PATCH 22/73] fix --- 6in4/Makefile | 45 - 6in4/files/6in4.sh | 149 - aquantia/Makefile | 41 - bcm27xx-eeprom/Makefile | 59 - ...1-rpi-eeprom-update-OpenWrt-defaults.patch | 45 - ...m-update-change-default-include-path.patch | 26 - ...date-chmod-silent-f-is-not-supported.patch | 33 - ...om-config-change-default-text-editor.patch | 22 - cryptodev-linux/Makefile | 58 - fullconenat/Makefile | 62 - .../001-fix-init-Repeat-definition.patch | 20 - .../patches/001-linux-6.1-support.patch | 26 - fullconenat/src/Makefile | 6 - ipcalc/Makefile | 36 - lcd4linux/Config.in | 490 -- lcd4linux/Makefile | 306 -- lcd4linux/files/lcd4linux.init | 15 - .../120-remove-as-needed-linker-option.patch | 11 - lcd4linux/patches/140-no_repnop_T6963.patch | 22 - lcd4linux/patches/150-addlibmpdclient.patch | 2624 ----------- lcd4linux/patches/160-uinput_defs.patch | 24 - .../170-add-generic-spidev-driver.patch | 195 - .../patches/173-glcd2usb-bigendian-fix.patch | 20 - libell/Makefile | 44 - luci-app-packet-capture/Makefile | 14 - .../resources/view/packet_capture/tcpdump.js | 287 -- .../po/fr/packet-capture.po | 99 - .../po/templates/packet-capture.pot | 90 - .../po/zh_Hans/packet-capture.po | 99 - .../root/etc/config/packet_capture | 1 - .../root/usr/libexec/packet_capture | 64 - .../root/usr/libexec/packet_capture_start | 69 - .../root/usr/libexec/packet_capture_stop | 9 - .../luci/menu.d/luci-app-packet-capture.json | 18 - .../rpcd/acl.d/luci-app-packet-capture.json | 25 - luci-app-sysupgrade/Makefile | 11 - .../luasrc/view/sysupgrade.htm | 126 - luci-app-sysupgrade/po/fr/sysupgrade.po | 97 - luci-app-sysupgrade/po/fr/sysupgrade.po~ | 97 - luci-app-sysupgrade/po/ru/sysupgrade.po | 94 - .../po/templates/sysupgrade.pot | 81 - luci-app-sysupgrade/po/zh_Hans/sysupgrade.po | 90 - luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ | 90 - .../root/etc/init.d/sysupgrade | 20 - .../root/etc/uci-defaults/40_luci-sysupgrade | 20 - .../luci/menu.d/luci-app-sysupgrade.json | 13 - .../root/usr/share/rpcd/acl.d/sysupgrade.json | 34 - .../www/luci-static/resources/sysupgrade.js | 389 -- luci-mod-dashboard/Makefile | 18 - .../resources/view/dashboard/css/custom.css | 285 -- .../view/dashboard/icons/devices.svg | 1 - .../view/dashboard/icons/internet.svg | 1 - .../view/dashboard/icons/not-internet.svg | 1 - .../resources/view/dashboard/icons/router.svg | 1 - .../view/dashboard/icons/wireless.svg | 1 - .../view/dashboard/include/10_router.js | 324 -- .../view/dashboard/include/20_lan.js | 150 - .../view/dashboard/include/30_wifi.js | 269 -- .../resources/view/dashboard/index.js | 110 - luci-mod-dashboard/po/ar/dashboard.po | 215 - luci-mod-dashboard/po/bg/dashboard.po | 222 - luci-mod-dashboard/po/bn_BD/dashboard.po | 219 - luci-mod-dashboard/po/ca/dashboard.po | 219 - luci-mod-dashboard/po/cs/dashboard.po | 222 - luci-mod-dashboard/po/da/dashboard.po | 220 - luci-mod-dashboard/po/de/dashboard.po | 222 - luci-mod-dashboard/po/el/dashboard.po | 222 - luci-mod-dashboard/po/en/dashboard.po | 222 - luci-mod-dashboard/po/es/dashboard.po | 223 - luci-mod-dashboard/po/fi/dashboard.po | 222 - luci-mod-dashboard/po/fr/dashboard.po | 222 - luci-mod-dashboard/po/he/dashboard.po | 216 - luci-mod-dashboard/po/hi/dashboard.po | 215 - luci-mod-dashboard/po/hu/dashboard.po | 223 - luci-mod-dashboard/po/id/dashboard.po | 220 - luci-mod-dashboard/po/it/dashboard.po | 222 - luci-mod-dashboard/po/ja/dashboard.po | 222 - luci-mod-dashboard/po/ko/dashboard.po | 219 - luci-mod-dashboard/po/mr/dashboard.po | 215 - luci-mod-dashboard/po/ms/dashboard.po | 215 - luci-mod-dashboard/po/nb_NO/dashboard.po | 230 - luci-mod-dashboard/po/nl/dashboard.po | 219 - luci-mod-dashboard/po/pl/dashboard.po | 223 - luci-mod-dashboard/po/pt/dashboard.po | 222 - luci-mod-dashboard/po/pt_BR/dashboard.po | 222 - luci-mod-dashboard/po/ro/dashboard.po | 223 - luci-mod-dashboard/po/ru/dashboard.po | 223 - luci-mod-dashboard/po/sk/dashboard.po | 219 - luci-mod-dashboard/po/sv/dashboard.po | 222 - luci-mod-dashboard/po/templates/dashboard.pot | 208 - luci-mod-dashboard/po/tr/dashboard.po | 222 - luci-mod-dashboard/po/uk/dashboard.po | 223 - luci-mod-dashboard/po/vi/dashboard.po | 219 - luci-mod-dashboard/po/zh_Hans/dashboard.po | 220 - luci-mod-dashboard/po/zh_Hant/dashboard.po | 220 - .../share/luci/menu.d/luci-mod-dashboard.json | 13 - .../share/rpcd/acl.d/luci-mod-dashboard.json | 41 - luci-theme-argon/LICENSE | 201 - luci-theme-argon/Makefile | 16 - luci-theme-argon/README.md | 114 - luci-theme-argon/README_ZH.md | 110 - .../Screenshots/screenshot_pc.jpg | Bin 673706 -> 0 bytes .../Screenshots/screenshot_phone.jpg | Bin 467306 -> 0 bytes .../luci-static/argon/background/README.md | 2 - .../htdocs/luci-static/argon/css/cascade.css | 9 - .../htdocs/luci-static/argon/css/dark.css | 1 - .../htdocs/luci-static/argon/favicon.ico | Bin 15406 -> 0 bytes .../luci-static/argon/fonts/TypoGraphica.eot | Bin 33846 -> 0 bytes .../luci-static/argon/fonts/TypoGraphica.svg | 1191 ----- .../luci-static/argon/fonts/TypoGraphica.ttf | Bin 33632 -> 0 bytes .../luci-static/argon/fonts/TypoGraphica.woff | Bin 17816 -> 0 bytes .../htdocs/luci-static/argon/fonts/argon.eot | Bin 8888 -> 0 bytes .../htdocs/luci-static/argon/fonts/argon.svg | 38 - .../htdocs/luci-static/argon/fonts/argon.ttf | Bin 8732 -> 0 bytes .../htdocs/luci-static/argon/fonts/argon.woff | Bin 8808 -> 0 bytes .../argon/icon/android-icon-192x192.png | Bin 6411 -> 0 bytes .../argon/icon/apple-icon-144x144.png | Bin 5222 -> 0 bytes .../argon/icon/apple-icon-60x60.png | Bin 2561 -> 0 bytes .../argon/icon/apple-icon-72x72.png | Bin 2877 -> 0 bytes .../htdocs/luci-static/argon/icon/arrow.svg | 1 - .../luci-static/argon/icon/browserconfig.xml | 2 - .../luci-static/argon/icon/favicon-16x16.png | Bin 1019 -> 0 bytes .../luci-static/argon/icon/favicon-32x32.png | Bin 1720 -> 0 bytes .../luci-static/argon/icon/favicon-96x96.png | Bin 3650 -> 0 bytes .../luci-static/argon/icon/manifest.json | 41 - .../argon/icon/ms-icon-144x144.png | Bin 5222 -> 0 bytes .../htdocs/luci-static/argon/icon/spinner.svg | 1 - .../htdocs/luci-static/argon/img/argon.svg | 61 - .../htdocs/luci-static/argon/img/bg1.jpg | Bin 159265 -> 0 bytes .../htdocs/luci-static/argon/img/blank.png | Bin 938 -> 0 bytes .../luci-static/argon/img/volume_high.svg | 1 - .../luci-static/argon/img/volume_off.svg | 1 - .../htdocs/luci-static/argon/js/jquery.min.js | 2 - .../luci-static/argon/js/polyfill.min.js | 3 - .../luci-static/argon/less/cascade.less | 4063 ----------------- .../htdocs/luci-static/argon/less/dark.less | 830 ---- .../htdocs/luci-static/argon/less/fonts.less | 190 - .../luci-static/argon/less/pure-min.less | 12 - .../luci-static/resources/menu-argon.js | 158 - .../luasrc/view/themes/argon/footer.htm | 46 - .../luasrc/view/themes/argon/footer_login.htm | 44 - .../luasrc/view/themes/argon/header.htm | 180 - .../luasrc/view/themes/argon/header_login.htm | 119 - .../view/themes/argon/out_footer_login.htm | 27 - .../view/themes/argon/out_header_login.htm | 14 - .../luasrc/view/themes/argon/sysauth.htm | 186 - .../root/etc/uci-defaults/30_luci-theme-argon | 12 - .../root/usr/libexec/argon/bing_wallpaper | 52 - macvlan/Makefile | 45 - macvlan/files/etc/config/macvlan | 0 macvlan/files/etc/init.d/macvlan | 111 - .../etc/uci-defaults/40_luci-app-macvlan | 11 - net-tools/Makefile | 74 - net-tools/patches/mptcp-support.patch | 338 -- netifd/Makefile | 52 - netifd/files/etc/hotplug.d/iface/00-netstate | 6 - .../etc/hotplug.d/net/20-smp-packet-steering | 67 - netifd/files/etc/init.d/network | 144 - .../etc/uci-defaults/14_migrate-dhcp-release | 23 - netifd/files/etc/udhcpc.user | 1 - netifd/files/lib/netifd/dhcp.script | 120 - netifd/files/lib/netifd/proto/dhcp.sh | 89 - netifd/files/lib/network/config.sh | 76 - netifd/files/sbin/devstatus | 12 - netifd/files/sbin/ifdown | 1 - netifd/files/sbin/ifstatus | 13 - netifd/files/sbin/ifup | 77 - netifd/files/usr/share/udhcpc/default.script | 57 - pdnsd-alt/Makefile | 57 - pdnsd-alt/files/pdnsd.init | 46 - pdnsd-alt/patches/010-no-doc-and-test.patch | 42 - pdnsd-alt/patches/020-headers.patch | 66 - protobuf/Makefile | 117 - r8125/Makefile | 37 - r8125/patches/010-config.patch | 22 - r8125/patches/020-5.19-support.patch | 18 - r8125/patches/021-6.1-suppot.patch | 14 - .../030-add-LED-configuration-from-OF.patch | 43 - r8152/Makefile | 55 - r8152/patches/010-5.19-support.patch | 19 - r8152/patches/020-6.1-support.patch | 38 - .../100-add-LED-configuration-from-OF.patch | 74 - r8168/Makefile | 39 - ...-r8168-add-LED-configuration-from-OF.patch | 42 - r8168/patches/020-5.18-support.patch | 47 - r8168/patches/030-5.19-support.patch | 18 - r8168/patches/030-6.1-support.patch | 14 - serdisplib/Makefile | 58 - shortcut-fe/fast-classifier/Makefile | 109 - shortcut-fe/fast-classifier/src/Makefile | 10 - .../fast-classifier/src/fast-classifier.c | 2002 -------- .../fast-classifier/src/fast-classifier.h | 57 - .../fast-classifier/src/nl_classifier_test.c | 281 -- .../fast-classifier/src/userspace_example.c | 232 - shortcut-fe/shortcut-fe/Makefile | 92 - .../shortcut-fe/files/etc/init.d/shortcut-fe | 51 - .../shortcut-fe/files/usr/bin/sfe_dump | 35 - shortcut-fe/shortcut-fe/src/Kconfig | 14 - shortcut-fe/shortcut-fe/src/Makefile | 24 - shortcut-fe/shortcut-fe/src/sfe.h | 114 - shortcut-fe/shortcut-fe/src/sfe_backport.h | 195 - shortcut-fe/shortcut-fe/src/sfe_cm.c | 1210 ----- shortcut-fe/shortcut-fe/src/sfe_cm.h | 260 -- shortcut-fe/shortcut-fe/src/sfe_ipv4.c | 3618 --------------- shortcut-fe/shortcut-fe/src/sfe_ipv6.c | 3625 --------------- shortcut-fe/simulated-driver/Makefile | 60 - .../patches/200-nss-qdisc-support.patch | 11 - 207 files changed, 37374 deletions(-) delete mode 100644 6in4/Makefile delete mode 100755 6in4/files/6in4.sh delete mode 100755 aquantia/Makefile delete mode 100755 bcm27xx-eeprom/Makefile delete mode 100755 bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch delete mode 100755 bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch delete mode 100755 bcm27xx-eeprom/patches/0004-rpi-eeprom-update-chmod-silent-f-is-not-supported.patch delete mode 100755 bcm27xx-eeprom/patches/0005-rpi-eeprom-config-change-default-text-editor.patch delete mode 100644 cryptodev-linux/Makefile delete mode 100755 fullconenat/Makefile delete mode 100755 fullconenat/patches/001-fix-init-Repeat-definition.patch delete mode 100755 fullconenat/patches/001-linux-6.1-support.patch delete mode 100755 fullconenat/src/Makefile delete mode 100644 ipcalc/Makefile delete mode 100755 lcd4linux/Config.in delete mode 100755 lcd4linux/Makefile delete mode 100755 lcd4linux/files/lcd4linux.init delete mode 100755 lcd4linux/patches/120-remove-as-needed-linker-option.patch delete mode 100755 lcd4linux/patches/140-no_repnop_T6963.patch delete mode 100755 lcd4linux/patches/150-addlibmpdclient.patch delete mode 100755 lcd4linux/patches/160-uinput_defs.patch delete mode 100755 lcd4linux/patches/170-add-generic-spidev-driver.patch delete mode 100755 lcd4linux/patches/173-glcd2usb-bigendian-fix.patch delete mode 100755 libell/Makefile delete mode 100644 luci-app-packet-capture/Makefile delete mode 100644 luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js delete mode 100644 luci-app-packet-capture/po/fr/packet-capture.po delete mode 100644 luci-app-packet-capture/po/templates/packet-capture.pot delete mode 100644 luci-app-packet-capture/po/zh_Hans/packet-capture.po delete mode 100644 luci-app-packet-capture/root/etc/config/packet_capture delete mode 100755 luci-app-packet-capture/root/usr/libexec/packet_capture delete mode 100755 luci-app-packet-capture/root/usr/libexec/packet_capture_start delete mode 100755 luci-app-packet-capture/root/usr/libexec/packet_capture_stop delete mode 100644 luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json delete mode 100644 luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json delete mode 100644 luci-app-sysupgrade/Makefile delete mode 100644 luci-app-sysupgrade/luasrc/view/sysupgrade.htm delete mode 100644 luci-app-sysupgrade/po/fr/sysupgrade.po delete mode 100644 luci-app-sysupgrade/po/fr/sysupgrade.po~ delete mode 100644 luci-app-sysupgrade/po/ru/sysupgrade.po delete mode 100644 luci-app-sysupgrade/po/templates/sysupgrade.pot delete mode 100644 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po delete mode 100644 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ delete mode 100755 luci-app-sysupgrade/root/etc/init.d/sysupgrade delete mode 100755 luci-app-sysupgrade/root/etc/uci-defaults/40_luci-sysupgrade delete mode 100644 luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json delete mode 100644 luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json delete mode 100644 luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js delete mode 100644 luci-mod-dashboard/Makefile delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js delete mode 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js delete mode 100644 luci-mod-dashboard/po/ar/dashboard.po delete mode 100644 luci-mod-dashboard/po/bg/dashboard.po delete mode 100644 luci-mod-dashboard/po/bn_BD/dashboard.po delete mode 100644 luci-mod-dashboard/po/ca/dashboard.po delete mode 100644 luci-mod-dashboard/po/cs/dashboard.po delete mode 100644 luci-mod-dashboard/po/da/dashboard.po delete mode 100644 luci-mod-dashboard/po/de/dashboard.po delete mode 100644 luci-mod-dashboard/po/el/dashboard.po delete mode 100644 luci-mod-dashboard/po/en/dashboard.po delete mode 100644 luci-mod-dashboard/po/es/dashboard.po delete mode 100644 luci-mod-dashboard/po/fi/dashboard.po delete mode 100644 luci-mod-dashboard/po/fr/dashboard.po delete mode 100644 luci-mod-dashboard/po/he/dashboard.po delete mode 100644 luci-mod-dashboard/po/hi/dashboard.po delete mode 100644 luci-mod-dashboard/po/hu/dashboard.po delete mode 100644 luci-mod-dashboard/po/id/dashboard.po delete mode 100644 luci-mod-dashboard/po/it/dashboard.po delete mode 100644 luci-mod-dashboard/po/ja/dashboard.po delete mode 100644 luci-mod-dashboard/po/ko/dashboard.po delete mode 100644 luci-mod-dashboard/po/mr/dashboard.po delete mode 100644 luci-mod-dashboard/po/ms/dashboard.po delete mode 100644 luci-mod-dashboard/po/nb_NO/dashboard.po delete mode 100644 luci-mod-dashboard/po/nl/dashboard.po delete mode 100644 luci-mod-dashboard/po/pl/dashboard.po delete mode 100644 luci-mod-dashboard/po/pt/dashboard.po delete mode 100644 luci-mod-dashboard/po/pt_BR/dashboard.po delete mode 100644 luci-mod-dashboard/po/ro/dashboard.po delete mode 100644 luci-mod-dashboard/po/ru/dashboard.po delete mode 100644 luci-mod-dashboard/po/sk/dashboard.po delete mode 100644 luci-mod-dashboard/po/sv/dashboard.po delete mode 100644 luci-mod-dashboard/po/templates/dashboard.pot delete mode 100644 luci-mod-dashboard/po/tr/dashboard.po delete mode 100644 luci-mod-dashboard/po/uk/dashboard.po delete mode 100644 luci-mod-dashboard/po/vi/dashboard.po delete mode 100644 luci-mod-dashboard/po/zh_Hans/dashboard.po delete mode 100644 luci-mod-dashboard/po/zh_Hant/dashboard.po delete mode 100644 luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json delete mode 100644 luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json delete mode 100644 luci-theme-argon/LICENSE delete mode 100644 luci-theme-argon/Makefile delete mode 100644 luci-theme-argon/README.md delete mode 100644 luci-theme-argon/README_ZH.md delete mode 100644 luci-theme-argon/Screenshots/screenshot_pc.jpg delete mode 100644 luci-theme-argon/Screenshots/screenshot_phone.jpg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/background/README.md delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/css/cascade.css delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/css/dark.css delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/favicon.ico delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/img/argon.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/img/blank.png delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/less/cascade.less delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/less/dark.less delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/less/fonts.less delete mode 100644 luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less delete mode 100644 luci-theme-argon/htdocs/luci-static/resources/menu-argon.js delete mode 100755 luci-theme-argon/luasrc/view/themes/argon/footer.htm delete mode 100644 luci-theme-argon/luasrc/view/themes/argon/footer_login.htm delete mode 100644 luci-theme-argon/luasrc/view/themes/argon/header.htm delete mode 100644 luci-theme-argon/luasrc/view/themes/argon/header_login.htm delete mode 100644 luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm delete mode 100644 luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm delete mode 100644 luci-theme-argon/luasrc/view/themes/argon/sysauth.htm delete mode 100644 luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon delete mode 100755 luci-theme-argon/root/usr/libexec/argon/bing_wallpaper delete mode 100644 macvlan/Makefile delete mode 100644 macvlan/files/etc/config/macvlan delete mode 100755 macvlan/files/etc/init.d/macvlan delete mode 100644 macvlan/files/etc/uci-defaults/40_luci-app-macvlan delete mode 100644 net-tools/Makefile delete mode 100644 net-tools/patches/mptcp-support.patch delete mode 100644 netifd/Makefile delete mode 100644 netifd/files/etc/hotplug.d/iface/00-netstate delete mode 100644 netifd/files/etc/hotplug.d/net/20-smp-packet-steering delete mode 100755 netifd/files/etc/init.d/network delete mode 100644 netifd/files/etc/uci-defaults/14_migrate-dhcp-release delete mode 100644 netifd/files/etc/udhcpc.user delete mode 100755 netifd/files/lib/netifd/dhcp.script delete mode 100755 netifd/files/lib/netifd/proto/dhcp.sh delete mode 100755 netifd/files/lib/network/config.sh delete mode 100755 netifd/files/sbin/devstatus delete mode 120000 netifd/files/sbin/ifdown delete mode 100755 netifd/files/sbin/ifstatus delete mode 100755 netifd/files/sbin/ifup delete mode 100755 netifd/files/usr/share/udhcpc/default.script delete mode 100755 pdnsd-alt/Makefile delete mode 100755 pdnsd-alt/files/pdnsd.init delete mode 100755 pdnsd-alt/patches/010-no-doc-and-test.patch delete mode 100755 pdnsd-alt/patches/020-headers.patch delete mode 100644 protobuf/Makefile delete mode 100755 r8125/Makefile delete mode 100755 r8125/patches/010-config.patch delete mode 100755 r8125/patches/020-5.19-support.patch delete mode 100755 r8125/patches/021-6.1-suppot.patch delete mode 100755 r8125/patches/030-add-LED-configuration-from-OF.patch delete mode 100755 r8152/Makefile delete mode 100755 r8152/patches/010-5.19-support.patch delete mode 100755 r8152/patches/020-6.1-support.patch delete mode 100755 r8152/patches/100-add-LED-configuration-from-OF.patch delete mode 100755 r8168/Makefile delete mode 100755 r8168/patches/001-r8168-add-LED-configuration-from-OF.patch delete mode 100755 r8168/patches/020-5.18-support.patch delete mode 100755 r8168/patches/030-5.19-support.patch delete mode 100755 r8168/patches/030-6.1-support.patch delete mode 100644 serdisplib/Makefile delete mode 100755 shortcut-fe/fast-classifier/Makefile delete mode 100755 shortcut-fe/fast-classifier/src/Makefile delete mode 100755 shortcut-fe/fast-classifier/src/fast-classifier.c delete mode 100755 shortcut-fe/fast-classifier/src/fast-classifier.h delete mode 100755 shortcut-fe/fast-classifier/src/nl_classifier_test.c delete mode 100755 shortcut-fe/fast-classifier/src/userspace_example.c delete mode 100755 shortcut-fe/shortcut-fe/Makefile delete mode 100755 shortcut-fe/shortcut-fe/files/etc/init.d/shortcut-fe delete mode 100755 shortcut-fe/shortcut-fe/files/usr/bin/sfe_dump delete mode 100755 shortcut-fe/shortcut-fe/src/Kconfig delete mode 100755 shortcut-fe/shortcut-fe/src/Makefile delete mode 100755 shortcut-fe/shortcut-fe/src/sfe.h delete mode 100755 shortcut-fe/shortcut-fe/src/sfe_backport.h delete mode 100755 shortcut-fe/shortcut-fe/src/sfe_cm.c delete mode 100755 shortcut-fe/shortcut-fe/src/sfe_cm.h delete mode 100755 shortcut-fe/shortcut-fe/src/sfe_ipv4.c delete mode 100755 shortcut-fe/shortcut-fe/src/sfe_ipv6.c delete mode 100755 shortcut-fe/simulated-driver/Makefile delete mode 100755 shortcut-fe/simulated-driver/patches/200-nss-qdisc-support.patch diff --git a/6in4/Makefile b/6in4/Makefile deleted file mode 100644 index d0f2ad30c..000000000 --- a/6in4/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright (C) 2010-2015 OpenWrt.org -# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) -# - Added gateway setting -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=6in4 -PKG_VERSION:=270 -PKG_RELEASE:=2 -PKG_LICENSE:=GPL-2.0 - -include $(INCLUDE_DIR)/package.mk - -define Package/6in4 - SECTION:=net - CATEGORY:=Network - DEPENDS:=@IPV6 +kmod-sit +uclient-fetch - TITLE:=IPv6-in-IPv4 configuration support - MAINTAINER:=Jo-Philipp Wich - PKGARCH:=all -endef - -define Package/6in4/description -Provides support for 6in4 tunnels in /etc/config/network. -Refer to http://wiki.openwrt.org/doc/uci/network for -configuration details. -endef - -define Build/Compile -endef - -define Build/Configure -endef - -define Package/6in4/install - $(INSTALL_DIR) $(1)/lib/netifd/proto - $(INSTALL_BIN) ./files/6in4.sh $(1)/lib/netifd/proto/6in4.sh -endef - -$(eval $(call BuildPackage,6in4)) diff --git a/6in4/files/6in4.sh b/6in4/files/6in4.sh deleted file mode 100755 index cf17c86d8..000000000 --- a/6in4/files/6in4.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/sh -# 6in4.sh - IPv6-in-IPv4 tunnel backend -# Copyright (c) 2010-2015 OpenWrt.org - -[ -n "$INCLUDE_ONLY" ] || { - . /lib/functions.sh - . /lib/functions/network.sh - . ../netifd-proto.sh - init_proto "$@" -} - -proto_6in4_update() { - sh -c ' - timeout=5 - - (while [ $((timeout--)) -gt 0 ]; do - sleep 1 - kill -0 $$ || exit 0 - done; kill -9 $$) 2>/dev/null & - - exec "$@" - ' "$1" "$@" -} - -proto_6in4_add_prefix() { - append "$3" "$1" -} - -proto_6in4_setup() { - local cfg="$1" - local iface="$2" - local link="6in4-$cfg" - - local mtu ttl tos ipaddr peeraddr ip6addr ip6prefix ip6prefixes tunlink tunnelid username password updatekey gateway - json_get_vars mtu ttl tos ipaddr peeraddr ip6addr tunlink tunnelid username password updatekey gateway - json_for_each_item proto_6in4_add_prefix ip6prefix ip6prefixes - - [ -z "$peeraddr" ] && { - proto_notify_error "$cfg" "MISSING_ADDRESS" - proto_block_restart "$cfg" - return - } - - [ -n "$tunlink" ] && ( proto_add_host_dependency "$cfg" "$peeraddr" "$tunlink" ) - - [ -z "$ipaddr" ] && { - local wanif="$tunlink" - if [ -z "$wanif" ] && ! network_find_wan wanif; then - proto_notify_error "$cfg" "NO_WAN_LINK" - return - fi - - if ! network_get_ipaddr ipaddr "$wanif"; then - proto_notify_error "$cfg" "NO_WAN_LINK" - return - fi - } - - proto_init_update "$link" 1 - - [ -n "$ip6addr" ] && { - local local6="${ip6addr%%/*}" - local mask6="${ip6addr##*/}" - [[ "$local6" = "$mask6" ]] && mask6= - proto_add_ipv6_address "$local6" "$mask6" - proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6" - } - - [ -n "$gateway" ] && { - proto_add_ipv6_route "::" 0 "$gateway" - } - - for ip6prefix in $ip6prefixes; do - proto_add_ipv6_prefix "$ip6prefix" - proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix" - done - - proto_add_tunnel - json_add_string mode sit - json_add_int mtu "${mtu:-1280}" - json_add_int ttl "${ttl:-64}" - [ -n "$tos" ] && json_add_string tos "$tos" - json_add_string local "$ipaddr" - json_add_string remote "$peeraddr" - [ -n "$tunlink" ] && json_add_string link "$tunlink" - proto_close_tunnel - - proto_send_update "$cfg" - - [ -n "$tunnelid" -a -n "$username" -a \( -n "$password" -o -n "$updatekey" \) ] && { - [ -n "$updatekey" ] && password="$updatekey" - - local http="http" - local urlget="uclient-fetch" - local urlget_opts="-qO-" - local ca_path="${SSL_CERT_DIR:-/etc/ssl/certs}" - - [ -f /lib/libustream-ssl.so ] && http=https - [ "$http" = "https" -a -z "$(find $ca_path -name "*.0" 2>/dev/null)" ] && { - urlget_opts="$urlget_opts --no-check-certificate" - } - - local url="$http://ipv4.tunnelbroker.net/nic/update?hostname=$tunnelid" - local try=0 - local max=3 - - ( - set -o pipefail - while [ $((++try)) -le $max ]; do - if proto_6in4_update $urlget $urlget_opts --user="$username" --password="$password" "$url" 2>&1 | \ - sed -e 's,^Killed$,timeout,' -e "s,^,update $try/$max: ," | \ - logger -t "$link"; - then - logger -t "$link" "updated" - return 0 - fi - sleep 5 - done - logger -t "$link" "update failed" - ) - } -} - -proto_6in4_teardown() { - local cfg="$1" -} - -proto_6in4_init_config() { - no_device=1 - available=1 - - proto_config_add_string "ipaddr" - proto_config_add_string "ip6addr" - proto_config_add_array "ip6prefix" - proto_config_add_string "peeraddr" - proto_config_add_string "tunlink" - proto_config_add_string "tunnelid" - proto_config_add_string "username" - proto_config_add_string "password" - proto_config_add_string "updatekey" - proto_config_add_string "gateway" - proto_config_add_int "mtu" - proto_config_add_int "ttl" - proto_config_add_string "tos" -} - -[ -n "$INCLUDE_ONLY" ] || { - add_protocol 6in4 -} diff --git a/aquantia/Makefile b/aquantia/Makefile deleted file mode 100755 index f99bb0c90..000000000 --- a/aquantia/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=kmod-aquantia -PKG_VERSION:=1.0 -PKG_RELEASE:=1 - -include $(INCLUDE_DIR)/kernel.mk -include $(INCLUDE_DIR)/package.mk - -define KernelPackage/phy-aquantia - SUBMENU:=Network Devices - TITLE:=aQuantia device support - DEPENDS:=@PCI_SUPPORT @TARGET_x86_64 @KERNEL_5_4 +kmod-i2c-core +kmod-i2c-algo-bit +kmod-ptp +kmod-hwmon-core +kmod-libphy - KCONFIG:=CONFIG_AQUANTIA_PHY - HIDDEN:=1 - FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia.ko - AUTOLOAD:=$(call AutoProbe,aquantia) -endef - -define KernelPackage/phy-aquantia/description - Kernel modules for aQuantia Ethernet adapters. -endef - -define KernelPackage/atlantic - SUBMENU:=Network Devices - TITLE:=aQuantia AQtion(tm) Support - DEPENDS:=@PCI_SUPPORT @TARGET_x86_64 @KERNEL_5_4 +kmod-i2c-core +kmod-i2c-algo-bit +kmod-ptp +kmod-phy-aquantia - KCONFIG:=CONFIG_AQTION - FILES:=$(LINUX_DIR)/drivers/net/ethernet/aquantia/atlantic/atlantic.ko - AUTOLOAD:=$(call AutoProbe,atlantic) -endef - -define KernelPackage/atlantic/description - Kernel modules for the aQuantia AQtion(tm) Ethernet card -endef - -define Build/Compile -endef - -$(eval $(call KernelPackage,phy-aquantia)) -$(eval $(call KernelPackage,atlantic)) \ No newline at end of file diff --git a/bcm27xx-eeprom/Makefile b/bcm27xx-eeprom/Makefile deleted file mode 100755 index b114ee11a..000000000 --- a/bcm27xx-eeprom/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=bcm27xx-eeprom -PKG_VERSION:=v2022.04.26-138a1 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://codeload.github.com/raspberrypi/rpi-eeprom/tar.gz/$(PKG_VERSION)? -PKG_HASH:=7c54839e68f226c5853fb63c8a1539b729d84b2e6bac311a51766c601d10a413 - -PKG_LICENSE:=BSD-3-Clause Custom -PKG_LICENSE_FILES:=LICENSE - -PKG_MAINTAINER:=Álvaro Fernández Rojas - -include $(INCLUDE_DIR)/package.mk - -TAR_OPTIONS:=--strip-components 1 $(TAR_OPTIONS) -TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS) - -define Package/bcm27xx-eeprom - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=bcm27xx-userland +blkid +coreutils +coreutils-od +pciutils +python3-light - TITLE:=BCM27xx EEPROM tools -endef - -define Package/bcm27xx-eeprom/description - BCM27xx EEPROM tools. -endef - -define Build/Compile - true -endef - -define Package/bcm27xx-eeprom/conffiles -/etc/bcm27xx-eeprom.conf -endef - -define Package/bcm27xx-eeprom/install - $(INSTALL_DIR) $(1)/etc - $(INSTALL_CONF) $(PKG_BUILD_DIR)/rpi-eeprom-update-default $(1)/etc/bcm27xx-eeprom.conf - - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/rpi-eeprom-config $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/rpi-eeprom-digest $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/rpi-eeprom-update $(1)/usr/bin - - $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader - $(CP) $(PKG_BUILD_DIR)/firmware/release-notes.md $(1)/lib/firmware/raspberrypi/bootloader - - $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader/critical - $(CP) $(PKG_BUILD_DIR)/firmware/critical/ $(1)/lib/firmware/raspberrypi/bootloader/ - - $(INSTALL_DIR) $(1)/lib/firmware/raspberrypi/bootloader/stable - $(CP) $(PKG_BUILD_DIR)/firmware/stable/ $(1)/lib/firmware/raspberrypi/bootloader/ -endef - -$(eval $(call BuildPackage,bcm27xx-eeprom)) diff --git a/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch b/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch deleted file mode 100755 index 7fc10a8a5..000000000 --- a/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch +++ /dev/null @@ -1,45 +0,0 @@ -From da37f7b051fe6833e25e78184cc9217dd4379187 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Mon, 23 Mar 2020 10:10:55 +0100 -Subject: [PATCH] rpi-eeprom-update: OpenWrt defaults -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Álvaro Fernández Rojas ---- - rpi-eeprom-update | 6 +++--- - rpi-eeprom-update-default | 5 +++-- - 2 files changed, 6 insertions(+), 5 deletions(-) - ---- a/rpi-eeprom-update -+++ b/rpi-eeprom-update -@@ -24,12 +24,12 @@ else - fi - - # Selects the release sub-directory --FIRMWARE_RELEASE_STATUS=${FIRMWARE_RELEASE_STATUS:-default} -+FIRMWARE_RELEASE_STATUS=${FIRMWARE_RELEASE_STATUS:-stable} - FIRMWARE_IMAGE_DIR=${FIRMWARE_IMAGE_DIR:-${FIRMWARE_ROOT}/${FIRMWARE_RELEASE_STATUS}} --FIRMWARE_BACKUP_DIR=${FIRMWARE_BACKUP_DIR:-/var/lib/raspberrypi/bootloader/backup} -+FIRMWARE_BACKUP_DIR=${FIRMWARE_BACKUP_DIR:-${FIRMWARE_ROOT}/backup} - ENABLE_VL805_UPDATES=${ENABLE_VL805_UPDATES:-1} - RECOVERY_BIN=${RECOVERY_BIN:-${FIRMWARE_ROOT}/${FIRMWARE_RELEASE_STATUS}/recovery.bin} - BOOTFS=${BOOTFS:-/boot} - CM4_ENABLE_RPI_EEPROM_UPDATE=${CM4_ENABLE_RPI_EEPROM_UPDATE:-0} - RPI_EEPROM_UPDATE_CONFIG_TOOL="${RPI_EEPROM_UPDATE_CONFIG_TOOL:-raspi-config}" - ---- a/rpi-eeprom-update-default -+++ b/rpi-eeprom-update-default -@@ -1,8 +1,9 @@ - - FIRMWARE_ROOT=/lib/firmware/raspberrypi/bootloader --FIRMWARE_RELEASE_STATUS="critical" -+FIRMWARE_RELEASE_STATUS="stable" - FIRMWARE_IMAGE_DIR="${FIRMWARE_ROOT}/${FIRMWARE_RELEASE_STATUS}" --FIRMWARE_BACKUP_DIR="/var/lib/raspberrypi/bootloader/backup" -+FIRMWARE_BACKUP_DIR="${FIRMWARE_ROOT}/backup" - BOOTFS=/boot - USE_FLASHROM=0 - EEPROM_CONFIG_HOOK= -+VCMAILBOX=/usr/bin/vcmailbox diff --git a/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch b/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch deleted file mode 100755 index f24a9c3f1..000000000 --- a/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 6674d49dea0104031b3f54df4c7a356dc4307bb2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Wed, 25 Mar 2020 20:58:35 +0100 -Subject: [PATCH] rpi-eeprom-update: change default include path -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Álvaro Fernández Rojas ---- - rpi-eeprom-update | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - ---- a/rpi-eeprom-update -+++ b/rpi-eeprom-update -@@ -6,8 +6,8 @@ set -e - - script_dir=$(cd "$(dirname "$0")" && pwd) - --if [ -f /etc/default/rpi-eeprom-update ]; then -- . /etc/default/rpi-eeprom-update -+if [ -f /etc/bcm27xx-eeprom.conf ]; then -+ . /etc/bcm27xx-eeprom.conf - fi - - LOCAL_MODE=0 diff --git a/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-chmod-silent-f-is-not-supported.patch b/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-chmod-silent-f-is-not-supported.patch deleted file mode 100755 index 5872f12da..000000000 --- a/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-chmod-silent-f-is-not-supported.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 8376ac74390af0ad736c88615e128b82a75eebc0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Fri, 19 Feb 2021 10:54:23 +0100 -Subject: [PATCH] rpi-eeprom-update: chmod silent (-f) is not supported -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Álvaro Fernández Rojas ---- - rpi-eeprom-update | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/rpi-eeprom-update -+++ b/rpi-eeprom-update -@@ -200,7 +200,7 @@ applyRecoveryUpdate() - || die "Failed to copy ${TMP_EEPROM_IMAGE} to ${BOOTFS}" - - # For NFS mounts ensure that the files are readable to the TFTP user -- chmod -f go+r "${BOOTFS}/pieeprom.upd" "${BOOTFS}/pieeprom.sig" \ -+ chmod go+r "${BOOTFS}/pieeprom.upd" "${BOOTFS}/pieeprom.sig" \ - || die "Failed to set permissions on eeprom update files" - fi - -@@ -211,7 +211,7 @@ applyRecoveryUpdate() - || die "Failed to copy ${VL805_UPDATE_IMAGE} to ${BOOTFS}/vl805.bin" - - # For NFS mounts ensure that the files are readable to the TFTP user -- chmod -f go+r "${BOOTFS}/vl805.bin" "${BOOTFS}/vl805.sig" \ -+ chmod go+r "${BOOTFS}/vl805.bin" "${BOOTFS}/vl805.sig" \ - || die "Failed to set permissions on eeprom update files" - fi - diff --git a/bcm27xx-eeprom/patches/0005-rpi-eeprom-config-change-default-text-editor.patch b/bcm27xx-eeprom/patches/0005-rpi-eeprom-config-change-default-text-editor.patch deleted file mode 100755 index 6feb7602c..000000000 --- a/bcm27xx-eeprom/patches/0005-rpi-eeprom-config-change-default-text-editor.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/rpi-eeprom-config -+++ b/rpi-eeprom-config -@@ -166,8 +166,8 @@ def edit_config(eeprom=None): - """ - Implements something like 'git commit' for editing EEPROM configs. - """ -- # Default to nano if $EDITOR is not defined. -- editor = 'nano' -+ # Default to vi if $EDITOR is not defined. -+ editor = 'vi' - if 'EDITOR' in os.environ: - editor = os.environ['EDITOR'] - -@@ -428,7 +428,7 @@ Operating modes: - - To cancel the pending update run 'sudo rpi-eeprom-update -r' - -- The default text editor is nano and may be overridden by setting the 'EDITOR' -+ The default text editor is vi and may be overridden by setting the 'EDITOR' - environment variable and passing '-E' to 'sudo' to preserve the environment. - - 6. Signing the bootloader config file. diff --git a/cryptodev-linux/Makefile b/cryptodev-linux/Makefile deleted file mode 100644 index 0c1f63a60..000000000 --- a/cryptodev-linux/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright (C) 2014 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# -# $Id$ - -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=cryptodev-linux -PKG_VERSION:=1.12 -PKG_RELEASE:=1 - -PKG_SOURCE_URL:=https://codeload.github.com/$(PKG_NAME)/$(PKG_NAME)/tar.gz/$(PKG_NAME)-$(PKG_VERSION)? -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_HASH:=f51c2254749233b1b1d7ec9445158bd709f124f88e1c650fe2faac83c3a81938 -PKG_LICENSE:=GPL-2.0 -PKG_LICENSE_FILES:=COPYING - -PKG_MAINTAINER:=Ansuel Smith - -PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_NAME)-$(PKG_VERSION) - -include $(INCLUDE_DIR)/package.mk - -define KernelPackage/cryptodev - SUBMENU:=Cryptographic API modules - TITLE:=Driver for cryptographic acceleration - URL:=http://cryptodev-linux.org/ - VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE) - DEPENDS:=+kmod-crypto-authenc +kmod-crypto-hash - FILES:=$(PKG_BUILD_DIR)/cryptodev.$(LINUX_KMOD_SUFFIX) - AUTOLOAD:=$(call AutoLoad,50,cryptodev) - MODPARAMS.cryptodev:=cryptodev_verbosity=-1 -endef - -define KernelPackage/cryptodev/description - This is a driver for that allows to use the Linux kernel supported - hardware ciphers by user-space applications. -endef - -define Build/Configure -endef - -define Build/Compile - $(MAKE) -C $(PKG_BUILD_DIR) \ - $(KERNEL_MAKE_FLAGS) \ - KERNEL_DIR="$(LINUX_DIR)" -endef - -define Build/InstallDev - $(INSTALL_DIR) $(STAGING_DIR)/usr/include/crypto - $(CP) $(PKG_BUILD_DIR)/crypto/cryptodev.h $(STAGING_DIR)/usr/include/crypto/ -endef - -$(eval $(call KernelPackage,cryptodev)) diff --git a/fullconenat/Makefile b/fullconenat/Makefile deleted file mode 100755 index d49155c7e..000000000 --- a/fullconenat/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -# -# Copyright (C) 2022 Chion Tang -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=fullconenat -PKG_RELEASE:=9 - -PKG_SOURCE_DATE:=2022-02-13 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://github.com/llccd/netfilter-full-cone-nat.git -PKG_SOURCE_VERSION:=108a36cbdca17e68c9e6e7fd5e26156a88f738e8 -PKG_MIRROR_HASH:=00d749235271dee194dcd23c22e6e85207ea90192a62a110b2af0b4e4de1971f - -PKG_LICENSE:=GPL-2.0 -PKG_LICENSE_FILES:=LICENSE -PKG_MAINTAINER:=Chion Tang - -include $(INCLUDE_DIR)/kernel.mk -include $(INCLUDE_DIR)/package.mk - -define Package/iptables-mod-fullconenat - SUBMENU:=Firewall - SECTION:=net - CATEGORY:=Network - TITLE:=FULLCONENAT iptables extension - DEPENDS:=+iptables +kmod-ipt-fullconenat -endef - -define Package/iptables-mod-fullconenat/install - $(INSTALL_DIR) $(1)/usr/lib/iptables - $(INSTALL_BIN) $(PKG_BUILD_DIR)/libipt_FULLCONENAT.so $(1)/usr/lib/iptables -endef - -define KernelPackage/ipt-fullconenat - SUBMENU:=Netfilter Extensions - TITLE:=FULLCONENAT netfilter module - DEPENDS:=+kmod-nf-ipt +kmod-nf-nat - KCONFIG:= \ - CONFIG_NF_CONNTRACK_EVENTS=y \ - CONFIG_NF_CONNTRACK_CHAIN_EVENTS=y - FILES:=$(PKG_BUILD_DIR)/xt_FULLCONENAT.ko -endef - -include $(INCLUDE_DIR)/kernel-defaults.mk - -define Build/Compile - +$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \ - CROSS_COMPILE="$(TARGET_CROSS)" \ - ARCH="$(LINUX_KARCH)" \ - M="$(PKG_BUILD_DIR)" \ - EXTRA_CFLAGS="$(BUILDFLAGS)" \ - modules - $(call Build/Compile/Default) -endef - -$(eval $(call KernelPackage,ipt-fullconenat)) -$(eval $(call BuildPackage,iptables-mod-fullconenat)) diff --git a/fullconenat/patches/001-fix-init-Repeat-definition.patch b/fullconenat/patches/001-fix-init-Repeat-definition.patch deleted file mode 100755 index 67c9332c8..000000000 --- a/fullconenat/patches/001-fix-init-Repeat-definition.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/libip6t_FULLCONENAT.c -+++ b/libip6t_FULLCONENAT.c -@@ -214,6 +214,7 @@ static struct xtables_target fullconenat_tg_reg = { - .x6_options = FULLCONENAT_opts, - }; - -+#define _init __attribute__((constructor)) _INIT - void _init(void) - { - xtables_register_target(&fullconenat_tg_reg); ---- a/libipt_FULLCONENAT.c -+++ b/libipt_FULLCONENAT.c -@@ -235,6 +235,7 @@ static struct xtables_target fullconenat_tg_reg = { - .x6_options = FULLCONENAT_opts, - }; - -+#define _init __attribute__((constructor)) _INIT - void _init(void) - { - xtables_register_target(&fullconenat_tg_reg); diff --git a/fullconenat/patches/001-linux-6.1-support.patch b/fullconenat/patches/001-linux-6.1-support.patch deleted file mode 100755 index 41721fb5c..000000000 --- a/fullconenat/patches/001-linux-6.1-support.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/xt_FULLCONENAT.c -+++ b/xt_FULLCONENAT.c -@@ -325,7 +325,11 @@ - /* for now we do the same thing for both --random and --random-fully */ - - /* select a random starting point */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) -+ start = (uint16_t)(get_random_u32() % (u32)range_size); -+#else - start = (uint16_t)(prandom_u32() % (u32)range_size); -+#endif - } else { - - if ((original_port >= min && original_port <= min + range_size - 1) -@@ -995,7 +999,11 @@ - /* for now we do the same thing for both --random and --random-fully */ - - /* select a random starting point */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) -+ start = (uint16_t)(get_random_u32() % (u32)range_size); -+#else - start = (uint16_t)(prandom_u32() % (u32)range_size); -+#endif - } else { - - if ((original_port >= min && original_port <= min + range_size - 1) diff --git a/fullconenat/src/Makefile b/fullconenat/src/Makefile deleted file mode 100755 index b2f88db33..000000000 --- a/fullconenat/src/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -libipt_FULLCONENAT.so: libipt_FULLCONENAT.o - $(CC) -shared -lxtables -o $@ $^; -libipt_FULLCONENAT.o: libipt_FULLCONENAT.c - $(CC) ${CFLAGS} -fPIC -D_INIT=$*_init -c -o $@ $<; - -obj-m += xt_FULLCONENAT.o diff --git a/ipcalc/Makefile b/ipcalc/Makefile deleted file mode 100644 index f2d752d59..000000000 --- a/ipcalc/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=ipcalc -PKG_RELEASE:=1 - -PKG_SOURCE_URL:=https://github.com/nmav/ipcalc.git -PKG_SOURCE_PROTO:=git -PKG_SOURCE_VERSION:=e9f88461f2585575d12fc95f5eeb9996b863f5af -PKG_MAINTAINER:=Ycarus (Yannick Chabanois) -PKG_LICENSE:=GPL-2.0 - -include $(INCLUDE_DIR)/package.mk - -MAKE_FLAGS += USE_GEOIP=no USE_MAXMIND=no - -define Package/ipcalc - SECTION:=net - CATEGORY:=Network - MAINTAINER:=Ycarus (Yannick Chabanois) - TITLE:=Modern tool to assist in network address calculations for IPv4 and IPv6. -endef - -define Package/ipcalc/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/ipcalc $(1)/usr/sbin/ipcalc -endef - - -$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/lcd4linux/Config.in b/lcd4linux/Config.in deleted file mode 100755 index 1410f2b85..000000000 --- a/lcd4linux/Config.in +++ /dev/null @@ -1,490 +0,0 @@ -if PACKAGE_lcd4linux-custom - -config LCD4LINUX_CUSTOM_NEEDS_libdbus - bool - -#config LCD4LINUX_CUSTOM_NEEDS_libftdi -# bool - -config LCD4LINUX_CUSTOM_NEEDS_libgd - bool - -config LCD4LINUX_CUSTOM_NEEDS_libiconv - bool - -config LCD4LINUX_CUSTOM_NEEDS_libjpeg - bool - -config LCD4LINUX_CUSTOM_NEEDS_libmpdclient - bool - -config LCD4LINUX_CUSTOM_NEEDS_libmysqlclient - bool - -config LCD4LINUX_CUSTOM_NEEDS_libncurses - bool - -config LCD4LINUX_CUSTOM_NEEDS_libnmeap - bool - -config LCD4LINUX_CUSTOM_NEEDS_libsqlite3 - bool - -config LCD4LINUX_CUSTOM_NEEDS_libusb - bool - -#config LCD4LINUX_CUSTOM_NEEDS_libX11 -# bool - -config LCD4LINUX_CUSTOM_NEEDS_ppp - bool - -config LCD4LINUX_CUSTOM_NEEDS_python - bool - - -comment "Drivers ---" - -config LCD4LINUX_CUSTOM_DRIVER_ASTUSB - bool - prompt "ASTUSB" - -config LCD4LINUX_CUSTOM_DRIVER_BeckmannEgle - bool - prompt "BeckmannEgle" - -config LCD4LINUX_CUSTOM_DRIVER_BWCT - bool - prompt "BWCT" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_CrystalFontz - bool - prompt "CrystalFontz" - -config LCD4LINUX_CUSTOM_DRIVER_Curses - bool - prompt "Curses" - select LCD4LINUX_CUSTOM_NEEDS_libncurses - -config LCD4LINUX_CUSTOM_DRIVER_Cwlinux - bool - prompt "Cwlinux" - -config LCD4LINUX_CUSTOM_DRIVER_D4D - bool - prompt "D4D" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_dpf - bool - prompt "dpf" - select LCD4LINUX_CUSTOM_NEEDS_libusb - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_EA232graphic - bool - prompt "EA232graphic" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_EFN - bool - prompt "EFN" - -config LCD4LINUX_CUSTOM_DRIVER_FutabaVFD - bool - prompt "FutabaVFD" - -config LCD4LINUX_CUSTOM_DRIVER_FW8888 - bool - prompt "FW8888" - -config LCD4LINUX_CUSTOM_DRIVER_G15 - bool - prompt "G15" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_GLCD2USB - bool - prompt "GLCD2USB" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_HD44780 - bool - prompt "HD44780" - depends on BROKEN - -config LCD4LINUX_CUSTOM_DRIVER_HD44780-I2C - bool - prompt "HD44780-I2C" - depends on BROKEN - -config LCD4LINUX_CUSTOM_DRIVER_IRLCD - bool - prompt "IRLCD" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_LCD2USB - bool - prompt "LCD2USB" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_LCDLinux - bool - prompt "LCDLinux" - depends on BROKEN - -config LCD4LINUX_CUSTOM_DRIVER_LCDTerm - bool - prompt "LCDTerm" - -config LCD4LINUX_CUSTOM_DRIVER_LEDMatrix - bool - prompt "LEDMatrix" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_LPH7508 - bool - prompt "LPH7508" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_LUIse - bool - prompt "LUIse" - select LCD4LINUX_CUSTOM_NEEDS_libgd - #select LCD4LINUX_CUSTOM_NEEDS_libluise - depends on BROKEN - -config LCD4LINUX_CUSTOM_DRIVER_LW_ABP - bool - prompt "LW_ABP" - -config LCD4LINUX_CUSTOM_DRIVER_M50530 - bool - prompt "M50530" - -config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbital - bool - prompt "MatrixOrbital" - -config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbitalGX - bool - prompt "MatrixOrbitalGX" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_mdm166a - bool - prompt "mdm166a" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_MilfordInstruments - bool - prompt "MilfordInstruments" - -config LCD4LINUX_CUSTOM_DRIVER_Newhaven - bool - prompt "Newhaven" - -config LCD4LINUX_CUSTOM_DRIVER_Noritake - bool - prompt "Noritake" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_NULL - bool - prompt "NULL" - default y - -config LCD4LINUX_CUSTOM_DRIVER_Pertelian - bool - prompt "Pertelian" - -config LCD4LINUX_CUSTOM_DRIVER_PHAnderson - bool - prompt "PHAnderson" - -config LCD4LINUX_CUSTOM_DRIVER_PICGraphic - bool - prompt "PICGraphic" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_picoLCD - bool - prompt "picoLCD" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_picoLCDGraphic - bool - prompt "picoLCDGraphic" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_PNG - bool - prompt "PNG" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_PPM - bool - prompt "PPM" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_RouterBoard - bool - prompt "RouterBoard" - depends on TARGET_rb532 - -config LCD4LINUX_CUSTOM_DRIVER_SamsungSPF - bool - prompt "SamsungSPF" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libjpeg - -config LCD4LINUX_CUSTOM_DRIVER_serdisplib - bool - prompt "serdisplib" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_serdisplib - -config LCD4LINUX_CUSTOM_DRIVER_ShuttleVFD - bool - prompt "ShuttleVFD" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_SimpleLCD - bool - prompt "SimpleLCD" - -config LCD4LINUX_CUSTOM_DRIVER_st2205 - bool - prompt "st2205" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_st2205tool - -config LCD4LINUX_CUSTOM_DRIVER_T6963 - bool - prompt "T6963" - select LCD4LINUX_CUSTOM_NEEDS_libgd - -config LCD4LINUX_CUSTOM_DRIVER_TeakLCM - bool - prompt "TeakLCM" - -config LCD4LINUX_CUSTOM_DRIVER_TEW673GRU - bool - select LCD4LINUX_CUSTOM_NEEDS_libgd - depends on TARGET_ar71xx - default TARGET_ar71xx - -config LCD4LINUX_CUSTOM_DRIVER_Trefon - bool - prompt "Trefon" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -#config LCD4LINUX_CUSTOM_DRIVER_ULA200 -# bool -# prompt "ULA200" -# select LCD4LINUX_CUSTOM_NEEDS_libftdi -# select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_USBHUB - bool - prompt "USBHUB" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_USBLCD - bool - prompt "USBLCD" - select LCD4LINUX_CUSTOM_NEEDS_libusb - -config LCD4LINUX_CUSTOM_DRIVER_VNC - bool - prompt "VNC" - select LCD4LINUX_CUSTOM_NEEDS_libgd - select LCD4LINUX_CUSTOM_NEEDS_libvncserver - -config LCD4LINUX_CUSTOM_DRIVER_WincorNixdorf - bool - prompt "WincorNixdorf" - -#config LCD4LINUX_CUSTOM_DRIVER_X11 -# bool -# prompt "X11" -# select LCD4LINUX_CUSTOM_NEEDS_libgd -# select LCD4LINUX_CUSTOM_NEEDS_libX11 - - -comment "Plugins ---" - -config LCD4LINUX_CUSTOM_PLUGIN_apm - bool - prompt "apm" - -config LCD4LINUX_CUSTOM_PLUGIN_asterisk - bool - prompt "asterisk" - -config LCD4LINUX_CUSTOM_PLUGIN_button_exec - bool - prompt "button_exec" - -config LCD4LINUX_CUSTOM_PLUGIN_cpuinfo - bool - prompt "cpuinfo" - default y - -config LCD4LINUX_CUSTOM_PLUGIN_dbus - bool - prompt "dbus" - select LCD4LINUX_CUSTOM_NEEDS_libdbus - -config LCD4LINUX_CUSTOM_PLUGIN_diskstats - bool - prompt "diskstats" - -config LCD4LINUX_CUSTOM_PLUGIN_dvb - bool - prompt "dvb" - -config LCD4LINUX_CUSTOM_PLUGIN_event - bool - prompt "event" - -config LCD4LINUX_CUSTOM_PLUGIN_exec - bool - prompt "exec" - -config LCD4LINUX_CUSTOM_PLUGIN_fifo - bool - prompt "fifo" - -config LCD4LINUX_CUSTOM_PLUGIN_file - bool - prompt "file" - -config LCD4LINUX_CUSTOM_PLUGIN_gps - bool - prompt "gps" - select LCD4LINUX_CUSTOM_NEEDS_libnmeap - -config LCD4LINUX_CUSTOM_PLUGIN_hddtemp - bool - prompt "hddtemp" - -config LCD4LINUX_CUSTOM_PLUGIN_huawei - bool - prompt "huawei" - -config LCD4LINUX_CUSTOM_PLUGIN_i2c_sensors - bool - prompt "i2c_sensors" - -config LCD4LINUX_CUSTOM_PLUGIN_iconv - bool - prompt "iconv" - select LCD4LINUX_CUSTOM_NEEDS_libiconv - -config LCD4LINUX_CUSTOM_PLUGIN_imon - bool - prompt "imon" - -config LCD4LINUX_CUSTOM_PLUGIN_isdn - bool - prompt "isdn" - -config LCD4LINUX_CUSTOM_PLUGIN_kvv - bool - prompt "kvv" - -config LCD4LINUX_CUSTOM_PLUGIN_loadavg - bool - prompt "loadavg" - default y - -config LCD4LINUX_CUSTOM_PLUGIN_meminfo - bool - prompt "meminfo" - default y - -config LCD4LINUX_CUSTOM_PLUGIN_mpd - bool - prompt "mpd" - select LCD4LINUX_CUSTOM_NEEDS_libmpdclient - -config LCD4LINUX_CUSTOM_PLUGIN_mpris_dbus - bool - prompt "mpris_dbus" - select LCD4LINUX_CUSTOM_NEEDS_libdbus - -config LCD4LINUX_CUSTOM_PLUGIN_mysql - bool - prompt "mysql" - select LCD4LINUX_CUSTOM_NEEDS_libmysqlclient - -config LCD4LINUX_CUSTOM_PLUGIN_netdev - bool - prompt "netdev" - -config LCD4LINUX_CUSTOM_PLUGIN_netinfo - bool - prompt "netinfo" - -config LCD4LINUX_CUSTOM_PLUGIN_pop3 - bool - prompt "pop3" - -config LCD4LINUX_CUSTOM_PLUGIN_ppp - bool - prompt "ppp" - select LCD4LINUX_CUSTOM_NEEDS_ppp - -config LCD4LINUX_CUSTOM_PLUGIN_proc_stat - bool - prompt "proc_stat" - default y - -#config LCD4LINUX_CUSTOM_PLUGIN_python -# bool -# prompt "python" -# select LCD4LINUX_CUSTOM_NEEDS_python - -config LCD4LINUX_CUSTOM_PLUGIN_qnaplog - bool - prompt "qnaplog" - select LCD4LINUX_CUSTOM_NEEDS_libsqlite3 - -config LCD4LINUX_CUSTOM_PLUGIN_seti - bool - prompt "seti" - -config LCD4LINUX_CUSTOM_PLUGIN_statfs - bool - prompt "statfs" - -config LCD4LINUX_CUSTOM_PLUGIN_uname - bool - prompt "uname" - -config LCD4LINUX_CUSTOM_PLUGIN_uptime - bool - prompt "uptime" - default y - -config LCD4LINUX_CUSTOM_PLUGIN_w1retap - bool - prompt "w1retap" - -config LCD4LINUX_CUSTOM_PLUGIN_wireless - bool - prompt "wireless" - depends on BROKEN - -config LCD4LINUX_CUSTOM_PLUGIN_xmms - bool - prompt "xmms" - -endif diff --git a/lcd4linux/Makefile b/lcd4linux/Makefile deleted file mode 100755 index 3271b359f..000000000 --- a/lcd4linux/Makefile +++ /dev/null @@ -1,306 +0,0 @@ -# -# Copyright (C) 2007-2015 OpenWrt.org -# Copyright (C) 2019 Ycarus (Yannick Chabanois) -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=lcd4linux -PKG_REV:=f13470faf00e52d1458f2a88d498716240edc272 -PKG_VERSION:=r$(PKG_REV) -PKG_RELEASE:=4 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -#PKG_SOURCE_URL:=https://ssl.bulix.org/svn/lcd4linux/trunk/ -PKG_SOURCE_URL:=https://github.com/redblue-pkt/lcd4linux.git -#PKG_SOURCE_SUBDIR:=lcd4linux-$(PKG_VERSION) -PKG_SOURCE_VERSION:=$(PKG_REV) -PKG_SOURCE_PROTO:=git - -LCD4LINUX_DRIVERS:= \ - ASTUSB \ - BeckmannEgle \ - BWCT \ - CrystalFontz \ - Curses \ - Cwlinux \ - D4D \ - DPF \ - EA232graphic \ - EFN \ - FutabaVFD \ - FW8888 \ - GLCD2USB \ - IRLCD \ - $(if $(CONFIG_BROKEN),HD44780) \ - $(if $(CONFIG_BROKEN),HD44780-I2C) \ - LCD2USB \ - $(if $(CONFIG_BROKEN),LCDLinux) \ - LCDTerm \ - LEDMatrix \ - LPH7508 \ - $(if $(CONFIG_BROKEN),LUIse) \ - LW_ABP \ - M50530 \ - MatrixOrbital \ - MatrixOrbitalGX \ - MilfordInstruments \ - Newhaven \ - Noritake \ - NULL \ - Pertelian \ - PHAnderson \ - PICGraphic \ - picoLCD \ - picoLCDGraphic \ - PNG \ - PPM \ - $(if $(CONFIG_TARGET_rb532),RouterBoard) \ - $(if $(CONFIG_BROKEN),SamsungSPF) \ - ShuttleVFD \ - SimpleLCD \ - st2205 \ - T6963 \ - TeakLCM \ - $(if $(CONFIG_TARGET_ar71xx),TEW673GRU) \ - Trefon \ - USBHUB \ - USBLCD \ - VNC \ - WincorNixdorf \ - serdisplib \ -# G15 \ -# ULA200 \ -# X11 \ - -LCD4LINUX_PLUGINS:= \ - apm \ - asterisk \ - button_exec \ - cpuinfo \ - dbus \ - diskstats \ - dvb \ - event \ - exec \ - fifo \ - file \ - gps \ - hddtemp \ - huawei \ - i2c_sensors \ - iconv \ - imon \ - isdn \ - kvv \ - loadavg \ - netdev \ - netinfo \ - meminfo \ - mpris_dbus \ - netdev \ - pop3 \ - ppp \ - proc_stat \ - qnaplog \ - seti \ - statfs \ - uname \ - uptime \ - w1retap \ - $(if $(CONFIG_BROKEN),wireless) \ - xmms \ -# mpd \ -# mysql \ -# python \ - -PKG_FIXUP:=autoreconf -PKG_INSTALL:=1 - -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION) - -PKG_BUILD_DEPENDS:= \ -# ppp \ -# libftdi \ -# libX11 \ -# python \ - -PKG_CONFIG_DEPENDS:= \ - $(patsubst %,CONFIG_LCD4LINUX_CUSTOM_DRIVER_%,$(LCD4LINUX_DRIVERS)) \ - $(patsubst %,CONFIG_LCD4LINUX_CUSTOM_PLUGIN_%,$(LCD4LINUX_PLUGINS)) \ - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk - -define Package/lcd4linux/Default - SECTION:=utils - CATEGORY:=Utilities - PKG_MAINTAINER:=Jonathan McCrohan - TITLE:=LCD display utility - URL:=http://lcd4linux.bulix.org/ -endef - -define Package/lcd4linux/Default/description - LCD4Linux is a small program that grabs information from the kernel and - some subsystems and displays it on an external liquid crystal display. -endef - - -define Package/lcd4linux-custom -$(call Package/lcd4linux/Default) - DEPENDS:= \ - +LCD4LINUX_CUSTOM_NEEDS_libdbus:libdbus \ - +LCD4LINUX_CUSTOM_NEEDS_libgd:libgd \ - $(if $(ICONV_FULL),+LCD4LINUX_CUSTOM_NEEDS_libiconv:libiconv-full) \ - +LCD4LINUX_CUSTOM_NEEDS_libjpeg:libjpeg \ - +LCD4LINUX_CUSTOM_NEEDS_libncurses:libncurses \ - +LCD4LINUX_CUSTOM_NEEDS_libsqlite3:libsqlite3 \ - +LCD4LINUX_CUSTOM_NEEDS_libusb:libusb-compat \ -# +LCD4LINUX_CUSTOM_NEEDS_libmpdclient:libmpdclient \ -# +LCD4LINUX_CUSTOM_NEEDS_libmysqlclient:libmysqlclient \ -# +LCD4LINUX_CUSTOM_NEEDS_libftdi:libftdi \ -# +LCD4LINUX_CUSTOM_NEEDS_libX11:libX11 \ -# +LCD4LINUX_CUSTOM_NEEDS_python:python - MENU:=1 - PROVIDES:=lcd4linux - VARIANT=custom -endef - -define Package/lcd4linux-custom/config - source "$(SOURCE)/Config.in" -endef - -define Package/lcd4linux-custom/description -$(call Package/lcd4linux/Default/description) - . - This package contains a customized version of LCD4Linux. -endef - - -define Package/lcd4linux-full -$(call Package/lcd4linux/Default) - DEPENDS:= \ - +libdbus \ - +libgd \ - $(if $(ICONV_FULL),+libiconv-full) \ - +libncurses \ - +libsqlite3 \ - +libusb-compat \ - +serdisplib -# +libmpdclient \ -# +libmysqlclient \ -# +libftdi \ -# +libX11 \ -# +python - PROVIDES:=lcd4linux - VARIANT=full -endef - -define Package/lcd4linux-full/description -$(call Package/lcd4linux/Default/description) - . - This package contains a version of LCD4Linux built with all supported - drivers and plugins. -endef - - -CONFIGURE_ARGS+= \ - --disable-rpath \ - -EXTRA_LDFLAGS+= -Wl,-rpath-link,$(STAGING_DIR)/usr/lib - -ifeq ($(BUILD_VARIANT),custom) - - LCD4LINUX_CUSTOM_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \ - $(if $(CONFIG_LCD4LINUX_CUSTOM_DRIVER_$(c)),$(c),) \ - )) - ifeq ($(LCD4LINUX_CUSTOM_DRIVERS),) - LCD4LINUX_CUSTOM_DRIVERS:=Sample - endif - - LCD4LINUX_CUSTOM_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \ - $(if $(CONFIG_LCD4LINUX_CUSTOM_PLUGIN_$(c)),$(c)) \ - )) - ifeq ($(LCD4LINUX_CUSTOM_PLUGINS),) - LCD4LINUX_CUSTOM_PLUGINS:=sample - endif - - CONFIGURE_ARGS+= \ - --with-drivers="$(LCD4LINUX_CUSTOM_DRIVERS)" \ - --with-plugins="$(LCD4LINUX_CUSTOM_PLUGINS)" \ - - ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libiconv),) - CONFIGURE_ARGS+= --with-libiconv-prefix="$(ICONV_PREFIX)" - else - CONFIGURE_ARGS+= --without-libiconv-prefix - endif - - ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libmysqlclient),) - EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql - endif - -# ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_python),) -# CONFIGURE_ARGS+= --with-python -# else - CONFIGURE_ARGS+= --without-python -# endif - -# ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libX11),) -# CONFIGURE_ARGS+= --with-x -# else - CONFIGURE_ARGS+= --without-x -# endif - -endif - -ifeq ($(BUILD_VARIANT),full) - - LCD4LINUX_FULL_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \ - $(c) \ - )) - - LCD4LINUX_FULL_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \ - $(c) \ - )) - - CONFIGURE_ARGS+= \ - --with-drivers="$(LCD4LINUX_FULL_DRIVERS)" \ - --with-plugins="$(LCD4LINUX_FULL_PLUGINS)" \ - --with-libiconv-prefix="$(ICONV_PREFIX)" \ - --without-python \ - --without-x \ - - EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql - -endif - - -define Package/lcd4linux/conffiles -/etc/lcd4linux.conf -endef - -define Package/lcd4linux/install - $(INSTALL_DIR) $(1)/usr/bin - $(CP) $(PKG_INSTALL_DIR)/usr/bin/lcd4linux $(1)/usr/bin/ - $(INSTALL_DIR) $(1)/etc - $(INSTALL_CONF) $(PKG_BUILD_DIR)/lcd4linux.conf.sample $(1)/etc/lcd4linux.conf - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/lcd4linux.init $(1)/etc/init.d/lcd4linux - $(SED) "s|^\(Display 'GLCD2USB'\)|#\1|g" \ - -e "s|^\(Layout 'TestLayer'\)|#\1|g" \ - -e "s|^#\(Display 'Image'\)|\1|g" \ - -e "s|^#\(Layout 'Default'\)|\1|g" \ - $(1)/etc/lcd4linux.conf -endef - -Package/lcd4linux-custom/conffiles = $(Package/lcd4linux/conffiles) -Package/lcd4linux-custom/install = $(Package/lcd4linux/install) - -Package/lcd4linux-full/conffiles = $(Package/lcd4linux/conffiles) -Package/lcd4linux-full/install = $(Package/lcd4linux/install) - -$(eval $(call BuildPackage,lcd4linux-custom)) -$(eval $(call BuildPackage,lcd4linux-full)) diff --git a/lcd4linux/files/lcd4linux.init b/lcd4linux/files/lcd4linux.init deleted file mode 100755 index 25033f382..000000000 --- a/lcd4linux/files/lcd4linux.init +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2007-2015 OpenWrt.org - -START=98 - -SERVICE_USE_PID=1 - -start() { - service_start /usr/bin/lcd4linux -o /tmp/lcd4linux.png -q -} - -stop() { - service_stop /usr/bin/lcd4linux -} - diff --git a/lcd4linux/patches/120-remove-as-needed-linker-option.patch b/lcd4linux/patches/120-remove-as-needed-linker-option.patch deleted file mode 100755 index b5e56fe7b..000000000 --- a/lcd4linux/patches/120-remove-as-needed-linker-option.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/Makefile.am -+++ b/Makefile.am -@@ -18,7 +18,7 @@ ACLOCAL_AMFLAGS=-I m4 - # use this for lots of warnings - #AM_CFLAGS = -D_GNU_SOURCE -std=c99 -m64 -Wall -W -pedantic -Wno-variadic-macros -fno-strict-aliasing - --lcd4linux_LDFLAGS ="-Wl,--as-needed" -+lcd4linux_LDFLAGS = - lcd4linux_LDADD = @DRIVERS@ @PLUGINS@ @DRVLIBS@ @PLUGINLIBS@ - lcd4linux_DEPENDENCIES = @DRIVERS@ @PLUGINS@ - diff --git a/lcd4linux/patches/140-no_repnop_T6963.patch b/lcd4linux/patches/140-no_repnop_T6963.patch deleted file mode 100755 index 85be2c376..000000000 --- a/lcd4linux/patches/140-no_repnop_T6963.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/drv_T6963.c -+++ b/drv_T6963.c -@@ -114,7 +114,9 @@ static void drv_T6_status1(void) - /* wait for STA0=1 and STA1=1 */ - n = 0; - do { -+#if 0 - rep_nop(); -+#endif - if (++n > 1000) { - debug("hang in status1"); - bug = 1; -@@ -150,7 +152,9 @@ static void drv_T6_status2(void) - /* wait for STA3=1 */ - n = 0; - do { -+#if 0 - rep_nop(); -+#endif - if (++n > 1000) { - debug("hang in status2"); - bug = 1; diff --git a/lcd4linux/patches/150-addlibmpdclient.patch b/lcd4linux/patches/150-addlibmpdclient.patch deleted file mode 100755 index 0e51f6760..000000000 --- a/lcd4linux/patches/150-addlibmpdclient.patch +++ /dev/null @@ -1,2624 +0,0 @@ ---- /dev/null -+++ b/libmpdclient.c -@@ -0,0 +1,1957 @@ -+/* libmpdclient -+ (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com) -+ This project's homepage is: http://www.musicpd.org -+ -+ Redistribution and use in source and binary forms, with or without -+ modification, are permitted provided that the following conditions -+ are met: -+ -+ - Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ -+ - Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ -+ - Neither the name of the Music Player Daemon nor the names of its -+ contributors may be used to endorse or promote products derived from -+ this software without specific prior written permission. -+ -+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR -+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+*/ -+ -+#include "libmpdclient.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifdef WIN32 -+# include -+# include -+#else -+# include -+# include -+# include -+# include -+#endif -+ -+/* (bits+1)/3 (plus the sign character) */ -+#define INTLEN ((sizeof(int) * CHAR_BIT + 1) / 3 + 1) -+#define LONGLONGLEN ((sizeof(long long) * CHAR_BIT + 1) / 3 + 1) -+ -+#define COMMAND_LIST 1 -+#define COMMAND_LIST_OK 2 -+ -+#ifndef MPD_NO_GAI -+# ifdef AI_ADDRCONFIG -+# define MPD_HAVE_GAI -+# endif -+#endif -+ -+#ifndef MSG_DONTWAIT -+# define MSG_DONTWAIT 0 -+#endif -+ -+#ifdef WIN32 -+# define SELECT_ERRNO_IGNORE (errno == WSAEINTR || errno == WSAEINPROGRESS) -+# define SENDRECV_ERRNO_IGNORE SELECT_ERRNO_IGNORE -+#else -+# define SELECT_ERRNO_IGNORE (errno == EINTR) -+# define SENDRECV_ERRNO_IGNORE (errno == EINTR || errno == EAGAIN) -+# define winsock_dll_error(c) 0 -+# define closesocket(s) close(s) -+# define WSACleanup() do { /* nothing */ } while (0) -+#endif -+ -+#ifdef WIN32 -+static int winsock_dll_error(mpd_Connection * connection) -+{ -+ WSADATA wsaData; -+ if ((WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0 || LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { -+ strcpy(connection->errorStr, "Could not find usable WinSock DLL."); -+ connection->error = MPD_ERROR_SYSTEM; -+ return 1; -+ } -+ return 0; -+} -+ -+static int do_connect_fail(mpd_Connection * connection, const struct sockaddr *serv_addr, int addrlen) -+{ -+ int iMode = 1; /* 0 = blocking, else non-blocking */ -+ ioctlsocket(connection->sock, FIONBIO, (u_long FAR *) & iMode); -+ return (connect(connection->sock, serv_addr, addrlen) == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK); -+} -+#else /* !WIN32 (sane operating systems) */ -+static int do_connect_fail(mpd_Connection * connection, const struct sockaddr *serv_addr, int addrlen) -+{ -+ int flags = fcntl(connection->sock, F_GETFL, 0); -+ fcntl(connection->sock, F_SETFL, flags | O_NONBLOCK); -+ return (connect(connection->sock, serv_addr, addrlen) < 0 && errno != EINPROGRESS); -+} -+#endif /* !WIN32 */ -+ -+#ifdef MPD_HAVE_GAI -+static int mpd_connect(mpd_Connection * connection, const char *host, int port, float timeout) -+{ -+ int error; -+ char service[INTLEN + 1]; -+ struct addrinfo hints; -+ struct addrinfo *res = NULL; -+ struct addrinfo *addrinfo = NULL; -+ -+ /** -+ * Setup hints -+ */ -+ hints.ai_flags = AI_ADDRCONFIG; -+ hints.ai_family = PF_UNSPEC; -+ hints.ai_socktype = SOCK_STREAM; -+ hints.ai_protocol = IPPROTO_TCP; -+ hints.ai_addrlen = 0; -+ hints.ai_addr = NULL; -+ hints.ai_canonname = NULL; -+ hints.ai_next = NULL; -+ -+ snprintf(service, sizeof(service), "%i", port); -+ -+ error = getaddrinfo(host, service, &hints, &addrinfo); -+ -+ if (error) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found: %s", host, gai_strerror(error)); -+ connection->error = MPD_ERROR_UNKHOST; -+ return -1; -+ } -+ -+ for (res = addrinfo; res; res = res->ai_next) { -+ /* create socket */ -+ connection->sock = socket(res->ai_family, SOCK_STREAM, res->ai_protocol); -+ if (connection->sock < 0) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems creating socket: %s", strerror(errno)); -+ connection->error = MPD_ERROR_SYSTEM; -+ freeaddrinfo(addrinfo); -+ return -1; -+ } -+ -+ mpd_setConnectionTimeout(connection, timeout); -+ -+ /* connect stuff */ -+ if (do_connect_fail(connection, res->ai_addr, res->ai_addrlen)) { -+ /* try the next address family */ -+ closesocket(connection->sock); -+ connection->sock = -1; -+ continue; -+ } -+ } -+ -+ freeaddrinfo(addrinfo); -+ -+ if (connection->sock < 0) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, -+ "problems connecting to \"%s\" on port %i: %s", host, port, strerror(errno)); -+ connection->error = MPD_ERROR_CONNPORT; -+ -+ return -1; -+ } -+ -+ return 0; -+} -+#else /* !MPD_HAVE_GAI */ -+static int mpd_connect(mpd_Connection * connection, const char *host, int port, float timeout) -+{ -+ struct hostent *he; -+ struct sockaddr *dest; -+ int destlen; -+ struct sockaddr_in sin; -+ -+ if (!(he = gethostbyname(host))) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found", host); -+ connection->error = MPD_ERROR_UNKHOST; -+ return -1; -+ } -+ -+ memset(&sin, 0, sizeof(struct sockaddr_in)); -+ /*dest.sin_family = he->h_addrtype; */ -+ sin.sin_family = AF_INET; -+ sin.sin_port = htons(port); -+ -+ switch (he->h_addrtype) { -+ case AF_INET: -+ memcpy((char *) &sin.sin_addr.s_addr, (char *) he->h_addr, he->h_length); -+ dest = (struct sockaddr *) &sin; -+ destlen = sizeof(struct sockaddr_in); -+ break; -+ default: -+ strcpy(connection->errorStr, "address type is not IPv4"); -+ connection->error = MPD_ERROR_SYSTEM; -+ return -1; -+ break; -+ } -+ -+ if ((connection->sock = socket(dest->sa_family, SOCK_STREAM, 0)) < 0) { -+ strcpy(connection->errorStr, "problems creating socket"); -+ connection->error = MPD_ERROR_SYSTEM; -+ return -1; -+ } -+ -+ mpd_setConnectionTimeout(connection, timeout); -+ -+ /* connect stuff */ -+ if (do_connect_fail(connection, dest, destlen)) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, -+ "problems connecting to \"%s\" on port" " %i", host, port); -+ connection->error = MPD_ERROR_CONNPORT; -+ return -1; -+ } -+ -+ return 0; -+} -+#endif /* !MPD_HAVE_GAI */ -+ -+char *mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES] = { -+ "Artist", -+ "Album", -+ "Title", -+ "Track", -+ "Name", -+ "Genre", -+ "Date", -+ "Composer", -+ "Performer", -+ "Comment", -+ "Disc", -+ "Filename", -+ "Any" -+}; -+ -+static char *mpd_sanitizeArg(const char *arg) -+{ -+ size_t i; -+ char *ret; -+ register const char *c; -+ register char *rc; -+ -+ /* instead of counting in that loop above, just -+ * use a bit more memory and half running time -+ */ -+ ret = malloc(strlen(arg) * 2 + 1); -+ -+ c = arg; -+ rc = ret; -+ for (i = strlen(arg) + 1; i != 0; --i) { -+ if (*c == '"' || *c == '\\') -+ *rc++ = '\\'; -+ *(rc++) = *(c++); -+ } -+ -+ return ret; -+} -+ -+static mpd_ReturnElement *mpd_newReturnElement(const char *name, const char *value) -+{ -+ mpd_ReturnElement *ret = malloc(sizeof(mpd_ReturnElement)); -+ -+ ret->name = strdup(name); -+ ret->value = strdup(value); -+ -+ return ret; -+} -+ -+static void mpd_freeReturnElement(mpd_ReturnElement * re) -+{ -+ free(re->name); -+ free(re->value); -+ free(re); -+} -+ -+void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout) -+{ -+ connection->timeout.tv_sec = (int) timeout; -+ connection->timeout.tv_usec = (int) (timeout * 1e6 - connection->timeout.tv_sec * 1000000 + 0.5); -+} -+ -+static int mpd_parseWelcome(mpd_Connection * connection, const char *host, int port, char *rt, char *output) -+{ -+ char *tmp; -+ char *test; -+ int i; -+ -+ if (strncmp(output, MPD_WELCOME_MESSAGE, strlen(MPD_WELCOME_MESSAGE))) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, -+ "mpd not running on port %i on host \"%s\"", port, host); -+ connection->error = MPD_ERROR_NOTMPD; -+ return 1; -+ } -+ -+ tmp = &output[strlen(MPD_WELCOME_MESSAGE)]; -+ -+ for (i = 0; i < 3; i++) { -+ if (tmp) -+ connection->version[i] = strtol(tmp, &test, 10); -+ -+ if (!tmp || (test[0] != '.' && test[0] != '\0')) { -+ snprintf(connection->errorStr, -+ MPD_ERRORSTR_MAX_LENGTH, -+ "error parsing version number at " "\"%s\"", &output[strlen(MPD_WELCOME_MESSAGE)]); -+ connection->error = MPD_ERROR_NOTMPD; -+ return 1; -+ } -+ tmp = ++test; -+ } -+ -+ return 0; -+} -+ -+mpd_Connection *mpd_newConnection(const char *host, int port, float timeout) -+{ -+ int err; -+ char *rt; -+ char *output = NULL; -+ mpd_Connection *connection = malloc(sizeof(mpd_Connection)); -+ struct timeval tv; -+ fd_set fds; -+ strcpy(connection->buffer, ""); -+ connection->buflen = 0; -+ connection->bufstart = 0; -+ strcpy(connection->errorStr, ""); -+ connection->error = 0; -+ connection->doneProcessing = 0; -+ connection->commandList = 0; -+ connection->listOks = 0; -+ connection->doneListOk = 0; -+ connection->returnElement = NULL; -+ connection->request = NULL; -+ -+ if (winsock_dll_error(connection)) -+ return connection; -+ -+ if (mpd_connect(connection, host, port, timeout) < 0) -+ return connection; -+ -+ while (!(rt = strstr(connection->buffer, "\n"))) { -+ tv.tv_sec = connection->timeout.tv_sec; -+ tv.tv_usec = connection->timeout.tv_usec; -+ FD_ZERO(&fds); -+ FD_SET(connection->sock, &fds); -+ if ((err = select(connection->sock + 1, &fds, NULL, NULL, &tv)) == 1) { -+ int readed; -+ readed = recv(connection->sock, -+ &(connection->buffer[connection->buflen]), MPD_BUFFER_MAX_LENGTH - connection->buflen, 0); -+ if (readed <= 0) { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, -+ "problems getting a response from" " \"%s\" on port %i : %s", host, port, strerror(errno)); -+ connection->error = MPD_ERROR_NORESPONSE; -+ return connection; -+ } -+ connection->buflen += readed; -+ connection->buffer[connection->buflen] = '\0'; -+ } else if (err < 0) { -+ if (SELECT_ERRNO_IGNORE) -+ continue; -+ snprintf(connection->errorStr, -+ MPD_ERRORSTR_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i", host, port); -+ connection->error = MPD_ERROR_CONNPORT; -+ return connection; -+ } else { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, -+ "timeout in attempting to get a response from" " \"%s\" on port %i", host, port); -+ connection->error = MPD_ERROR_NORESPONSE; -+ return connection; -+ } -+ } -+ -+ *rt = '\0'; -+ output = strdup(connection->buffer); -+ strcpy(connection->buffer, rt + 1); -+ connection->buflen = strlen(connection->buffer); -+ -+ if (mpd_parseWelcome(connection, host, port, rt, output) == 0) -+ connection->doneProcessing = 1; -+ -+ free(output); -+ -+ return connection; -+} -+ -+void mpd_clearError(mpd_Connection * connection) -+{ -+ connection->error = 0; -+ connection->errorStr[0] = '\0'; -+} -+ -+void mpd_closeConnection(mpd_Connection * connection) -+{ -+ closesocket(connection->sock); -+ if (connection->returnElement) -+ free(connection->returnElement); -+ if (connection->request) -+ free(connection->request); -+ free(connection); -+ WSACleanup(); -+} -+ -+static void mpd_executeCommand(mpd_Connection * connection, char *command) -+{ -+ int ret; -+ struct timeval tv; -+ fd_set fds; -+ char *commandPtr = command; -+ int commandLen = strlen(command); -+ -+ if (!connection->doneProcessing && !connection->commandList) { -+ strcpy(connection->errorStr, "not done processing current command"); -+ connection->error = 1; -+ return; -+ } -+ -+ mpd_clearError(connection); -+ -+ FD_ZERO(&fds); -+ FD_SET(connection->sock, &fds); -+ tv.tv_sec = connection->timeout.tv_sec; -+ tv.tv_usec = connection->timeout.tv_usec; -+ -+ while ((ret = select(connection->sock + 1, NULL, &fds, NULL, &tv) == 1) || (ret == -1 && SELECT_ERRNO_IGNORE)) { -+ ret = send(connection->sock, commandPtr, commandLen, MSG_DONTWAIT); -+ if (ret <= 0) { -+ if (SENDRECV_ERRNO_IGNORE) -+ continue; -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems giving command \"%s\"", command); -+ connection->error = MPD_ERROR_SENDING; -+ return; -+ } else { -+ commandPtr += ret; -+ commandLen -= ret; -+ } -+ -+ if (commandLen <= 0) -+ break; -+ } -+ -+ if (commandLen > 0) { -+ perror(""); -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "timeout sending command \"%s\"", command); -+ connection->error = MPD_ERROR_TIMEOUT; -+ return; -+ } -+ -+ if (!connection->commandList) -+ connection->doneProcessing = 0; -+ else if (connection->commandList == COMMAND_LIST_OK) { -+ connection->listOks++; -+ } -+} -+ -+static void mpd_getNextReturnElement(mpd_Connection * connection) -+{ -+ char *output = NULL; -+ char *rt = NULL; -+ char *name = NULL; -+ char *value = NULL; -+ fd_set fds; -+ struct timeval tv; -+ char *tok = NULL; -+ int readed; -+ char *bufferCheck = NULL; -+ int err; -+ int pos; -+ -+ if (connection->returnElement) -+ mpd_freeReturnElement(connection->returnElement); -+ connection->returnElement = NULL; -+ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ strcpy(connection->errorStr, "already done processing current command"); -+ connection->error = 1; -+ return; -+ } -+ -+ bufferCheck = connection->buffer + connection->bufstart; -+ while (connection->bufstart >= connection->buflen || !(rt = strchr(bufferCheck, '\n'))) { -+ if (connection->buflen >= MPD_BUFFER_MAX_LENGTH) { -+ memmove(connection->buffer, -+ connection->buffer + connection->bufstart, connection->buflen - connection->bufstart + 1); -+ connection->buflen -= connection->bufstart; -+ connection->bufstart = 0; -+ } -+ if (connection->buflen >= MPD_BUFFER_MAX_LENGTH) { -+ strcpy(connection->errorStr, "buffer overrun"); -+ connection->error = MPD_ERROR_BUFFEROVERRUN; -+ connection->doneProcessing = 1; -+ connection->doneListOk = 0; -+ return; -+ } -+ bufferCheck = connection->buffer + connection->buflen; -+ tv.tv_sec = connection->timeout.tv_sec; -+ tv.tv_usec = connection->timeout.tv_usec; -+ FD_ZERO(&fds); -+ FD_SET(connection->sock, &fds); -+ if ((err = select(connection->sock + 1, &fds, NULL, NULL, &tv) == 1)) { -+ readed = recv(connection->sock, -+ connection->buffer + connection->buflen, -+ MPD_BUFFER_MAX_LENGTH - connection->buflen, MSG_DONTWAIT); -+ if (readed < 0 && SENDRECV_ERRNO_IGNORE) { -+ continue; -+ } -+ if (readed <= 0) { -+ strcpy(connection->errorStr, "connection" " closed"); -+ connection->error = MPD_ERROR_CONNCLOSED; -+ connection->doneProcessing = 1; -+ connection->doneListOk = 0; -+ return; -+ } -+ connection->buflen += readed; -+ connection->buffer[connection->buflen] = '\0'; -+ } else if (err < 0 && SELECT_ERRNO_IGNORE) -+ continue; -+ else { -+ strcpy(connection->errorStr, "connection timeout"); -+ connection->error = MPD_ERROR_TIMEOUT; -+ connection->doneProcessing = 1; -+ connection->doneListOk = 0; -+ return; -+ } -+ } -+ -+ *rt = '\0'; -+ output = connection->buffer + connection->bufstart; -+ connection->bufstart = rt - connection->buffer + 1; -+ -+ if (strcmp(output, "OK") == 0) { -+ if (connection->listOks > 0) { -+ strcpy(connection->errorStr, "expected more list_OK's"); -+ connection->error = 1; -+ } -+ connection->listOks = 0; -+ connection->doneProcessing = 1; -+ connection->doneListOk = 0; -+ return; -+ } -+ -+ if (strcmp(output, "list_OK") == 0) { -+ if (!connection->listOks) { -+ strcpy(connection->errorStr, "got an unexpected list_OK"); -+ connection->error = 1; -+ } else { -+ connection->doneListOk = 1; -+ connection->listOks--; -+ } -+ return; -+ } -+ -+ if (strncmp(output, "ACK", strlen("ACK")) == 0) { -+ char *test; -+ char *needle; -+ int val; -+ -+ strcpy(connection->errorStr, output); -+ connection->error = MPD_ERROR_ACK; -+ connection->errorCode = MPD_ACK_ERROR_UNK; -+ connection->errorAt = MPD_ERROR_AT_UNK; -+ connection->doneProcessing = 1; -+ connection->doneListOk = 0; -+ -+ needle = strchr(output, '['); -+ if (!needle) -+ return; -+ val = strtol(needle + 1, &test, 10); -+ if (*test != '@') -+ return; -+ connection->errorCode = val; -+ val = strtol(test + 1, &test, 10); -+ if (*test != ']') -+ return; -+ connection->errorAt = val; -+ return; -+ } -+ -+ tok = strchr(output, ':'); -+ if (!tok) -+ return; -+ pos = tok - output; -+ value = ++tok; -+ name = output; -+ name[pos] = '\0'; -+ -+ if (value[0] == ' ') { -+ connection->returnElement = mpd_newReturnElement(name, &(value[1])); -+ } else { -+ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "error parsing: %s:%s", name, value); -+ connection->error = 1; -+ } -+} -+ -+void mpd_finishCommand(mpd_Connection * connection) -+{ -+ while (!connection->doneProcessing) { -+ if (connection->doneListOk) -+ connection->doneListOk = 0; -+ mpd_getNextReturnElement(connection); -+ } -+} -+ -+static void mpd_finishListOkCommand(mpd_Connection * connection) -+{ -+ while (!connection->doneProcessing && connection->listOks && !connection->doneListOk) { -+ mpd_getNextReturnElement(connection); -+ } -+} -+ -+int mpd_nextListOkCommand(mpd_Connection * connection) -+{ -+ mpd_finishListOkCommand(connection); -+ if (!connection->doneProcessing) -+ connection->doneListOk = 0; -+ if (connection->listOks == 0 || connection->doneProcessing) -+ return -1; -+ return 0; -+} -+ -+void mpd_sendStatusCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "status\n"); -+} -+ -+mpd_Status *mpd_getStatus(mpd_Connection * connection) -+{ -+ mpd_Status *status; -+ -+ /*mpd_executeCommand(connection,"status\n"); -+ -+ if(connection->error) return NULL; */ -+ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ return NULL; -+ } -+ -+ if (!connection->returnElement) -+ mpd_getNextReturnElement(connection); -+ -+ status = malloc(sizeof(mpd_Status)); -+ status->volume = -1; -+ status->repeat = 0; -+ status->random = 0; -+ status->playlist = -1; -+ status->playlistLength = -1; -+ status->state = -1; -+ status->song = 0; -+ status->songid = 0; -+ status->elapsedTime = 0; -+ status->totalTime = 0; -+ status->bitRate = 0; -+ status->sampleRate = 0; -+ status->bits = 0; -+ status->channels = 0; -+ status->crossfade = -1; -+ status->error = NULL; -+ status->updatingDb = 0; -+ -+ if (connection->error) { -+ free(status); -+ return NULL; -+ } -+ while (connection->returnElement) { -+ mpd_ReturnElement *re = connection->returnElement; -+ if (strcmp(re->name, "volume") == 0) { -+ status->volume = atoi(re->value); -+ } else if (strcmp(re->name, "repeat") == 0) { -+ status->repeat = atoi(re->value); -+ } else if (strcmp(re->name, "random") == 0) { -+ status->random = atoi(re->value); -+ } else if (strcmp(re->name, "playlist") == 0) { -+ status->playlist = strtol(re->value, NULL, 10); -+ } else if (strcmp(re->name, "playlistlength") == 0) { -+ status->playlistLength = atoi(re->value); -+ } else if (strcmp(re->name, "bitrate") == 0) { -+ status->bitRate = atoi(re->value); -+ } else if (strcmp(re->name, "state") == 0) { -+ if (strcmp(re->value, "play") == 0) { -+ status->state = MPD_STATUS_STATE_PLAY; -+ } else if (strcmp(re->value, "stop") == 0) { -+ status->state = MPD_STATUS_STATE_STOP; -+ } else if (strcmp(re->value, "pause") == 0) { -+ status->state = MPD_STATUS_STATE_PAUSE; -+ } else { -+ status->state = MPD_STATUS_STATE_UNKNOWN; -+ } -+ } else if (strcmp(re->name, "song") == 0) { -+ status->song = atoi(re->value); -+ } else if (strcmp(re->name, "songid") == 0) { -+ status->songid = atoi(re->value); -+ } else if (strcmp(re->name, "time") == 0) { -+ char *tok = strchr(re->value, ':'); -+ /* the second strchr below is a safety check */ -+ if (tok && (strchr(tok, 0) > (tok + 1))) { -+ /* atoi stops at the first non-[0-9] char: */ -+ status->elapsedTime = atoi(re->value); -+ status->totalTime = atoi(tok + 1); -+ } -+ } else if (strcmp(re->name, "error") == 0) { -+ status->error = strdup(re->value); -+ } else if (strcmp(re->name, "xfade") == 0) { -+ status->crossfade = atoi(re->value); -+ } else if (strcmp(re->name, "updating_db") == 0) { -+ status->updatingDb = atoi(re->value); -+ } else if (strcmp(re->name, "audio") == 0) { -+ char *tok = strchr(re->value, ':'); -+ if (tok && (strchr(tok, 0) > (tok + 1))) { -+ status->sampleRate = atoi(re->value); -+ status->bits = atoi(++tok); -+ tok = strchr(tok, ':'); -+ if (tok && (strchr(tok, 0) > (tok + 1))) -+ status->channels = atoi(tok + 1); -+ } -+ } -+ -+ mpd_getNextReturnElement(connection); -+ if (connection->error) { -+ free(status); -+ return NULL; -+ } -+ } -+ -+ if (connection->error) { -+ free(status); -+ return NULL; -+ } else if (status->state < 0) { -+ strcpy(connection->errorStr, "state not found"); -+ connection->error = 1; -+ free(status); -+ return NULL; -+ } -+ -+ return status; -+} -+ -+void mpd_freeStatus(mpd_Status * status) -+{ -+ if (status->error) -+ free(status->error); -+ free(status); -+} -+ -+void mpd_sendStatsCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "stats\n"); -+} -+ -+mpd_Stats *mpd_getStats(mpd_Connection * connection) -+{ -+ mpd_Stats *stats; -+ -+ /*mpd_executeCommand(connection,"stats\n"); -+ -+ if(connection->error) return NULL; */ -+ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ return NULL; -+ } -+ -+ if (!connection->returnElement) -+ mpd_getNextReturnElement(connection); -+ -+ stats = malloc(sizeof(mpd_Stats)); -+ stats->numberOfArtists = 0; -+ stats->numberOfAlbums = 0; -+ stats->numberOfSongs = 0; -+ stats->uptime = 0; -+ stats->dbUpdateTime = 0; -+ stats->playTime = 0; -+ stats->dbPlayTime = 0; -+ -+ if (connection->error) { -+ free(stats); -+ return NULL; -+ } -+ while (connection->returnElement) { -+ mpd_ReturnElement *re = connection->returnElement; -+ if (strcmp(re->name, "artists") == 0) { -+ stats->numberOfArtists = atoi(re->value); -+ } else if (strcmp(re->name, "albums") == 0) { -+ stats->numberOfAlbums = atoi(re->value); -+ } else if (strcmp(re->name, "songs") == 0) { -+ stats->numberOfSongs = atoi(re->value); -+ } else if (strcmp(re->name, "uptime") == 0) { -+ stats->uptime = strtol(re->value, NULL, 10); -+ } else if (strcmp(re->name, "db_update") == 0) { -+ stats->dbUpdateTime = strtol(re->value, NULL, 10); -+ } else if (strcmp(re->name, "playtime") == 0) { -+ stats->playTime = strtol(re->value, NULL, 10); -+ } else if (strcmp(re->name, "db_playtime") == 0) { -+ stats->dbPlayTime = strtol(re->value, NULL, 10); -+ } -+ -+ mpd_getNextReturnElement(connection); -+ if (connection->error) { -+ free(stats); -+ return NULL; -+ } -+ } -+ -+ if (connection->error) { -+ free(stats); -+ return NULL; -+ } -+ -+ return stats; -+} -+ -+void mpd_freeStats(mpd_Stats * stats) -+{ -+ free(stats); -+} -+ -+mpd_SearchStats *mpd_getSearchStats(mpd_Connection * connection) -+{ -+ mpd_SearchStats *stats; -+ mpd_ReturnElement *re; -+ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ return NULL; -+ } -+ -+ if (!connection->returnElement) -+ mpd_getNextReturnElement(connection); -+ -+ if (connection->error) -+ return NULL; -+ -+ stats = malloc(sizeof(mpd_SearchStats)); -+ stats->numberOfSongs = 0; -+ stats->playTime = 0; -+ -+ while (connection->returnElement) { -+ re = connection->returnElement; -+ -+ if (strcmp(re->name, "songs") == 0) { -+ stats->numberOfSongs = atoi(re->value); -+ } else if (strcmp(re->name, "playtime") == 0) { -+ stats->playTime = strtol(re->value, NULL, 10); -+ } -+ -+ mpd_getNextReturnElement(connection); -+ if (connection->error) { -+ free(stats); -+ return NULL; -+ } -+ } -+ -+ if (connection->error) { -+ free(stats); -+ return NULL; -+ } -+ -+ return stats; -+} -+ -+void mpd_freeSearchStats(mpd_SearchStats * stats) -+{ -+ free(stats); -+} -+ -+static void mpd_initSong(mpd_Song * song) -+{ -+ song->file = NULL; -+ song->artist = NULL; -+ song->album = NULL; -+ song->track = NULL; -+ song->title = NULL; -+ song->name = NULL; -+ song->date = NULL; -+ /* added by Qball */ -+ song->genre = NULL; -+ song->composer = NULL; -+ song->performer = NULL; -+ song->disc = NULL; -+ song->comment = NULL; -+ -+ song->time = MPD_SONG_NO_TIME; -+ song->pos = MPD_SONG_NO_NUM; -+ song->id = MPD_SONG_NO_ID; -+} -+ -+static void mpd_finishSong(mpd_Song * song) -+{ -+ if (song->file) -+ free(song->file); -+ if (song->artist) -+ free(song->artist); -+ if (song->album) -+ free(song->album); -+ if (song->title) -+ free(song->title); -+ if (song->track) -+ free(song->track); -+ if (song->name) -+ free(song->name); -+ if (song->date) -+ free(song->date); -+ if (song->genre) -+ free(song->genre); -+ if (song->composer) -+ free(song->composer); -+ if (song->disc) -+ free(song->disc); -+ if (song->comment) -+ free(song->comment); -+} -+ -+mpd_Song *mpd_newSong(void) -+{ -+ mpd_Song *ret = malloc(sizeof(mpd_Song)); -+ -+ mpd_initSong(ret); -+ -+ return ret; -+} -+ -+void mpd_freeSong(mpd_Song * song) -+{ -+ mpd_finishSong(song); -+ free(song); -+} -+ -+mpd_Song *mpd_songDup(mpd_Song * song) -+{ -+ mpd_Song *ret = mpd_newSong(); -+ -+ if (song->file) -+ ret->file = strdup(song->file); -+ if (song->artist) -+ ret->artist = strdup(song->artist); -+ if (song->album) -+ ret->album = strdup(song->album); -+ if (song->title) -+ ret->title = strdup(song->title); -+ if (song->track) -+ ret->track = strdup(song->track); -+ if (song->name) -+ ret->name = strdup(song->name); -+ if (song->date) -+ ret->date = strdup(song->date); -+ if (song->genre) -+ ret->genre = strdup(song->genre); -+ if (song->composer) -+ ret->composer = strdup(song->composer); -+ if (song->disc) -+ ret->disc = strdup(song->disc); -+ if (song->comment) -+ ret->comment = strdup(song->comment); -+ ret->time = song->time; -+ ret->pos = song->pos; -+ ret->id = song->id; -+ -+ return ret; -+} -+ -+static void mpd_initDirectory(mpd_Directory * directory) -+{ -+ directory->path = NULL; -+} -+ -+static void mpd_finishDirectory(mpd_Directory * directory) -+{ -+ if (directory->path) -+ free(directory->path); -+} -+ -+mpd_Directory *mpd_newDirectory(void) -+{ -+ mpd_Directory *directory = malloc(sizeof(mpd_Directory));; -+ -+ mpd_initDirectory(directory); -+ -+ return directory; -+} -+ -+void mpd_freeDirectory(mpd_Directory * directory) -+{ -+ mpd_finishDirectory(directory); -+ -+ free(directory); -+} -+ -+mpd_Directory *mpd_directoryDup(mpd_Directory * directory) -+{ -+ mpd_Directory *ret = mpd_newDirectory(); -+ -+ if (directory->path) -+ ret->path = strdup(directory->path); -+ -+ return ret; -+} -+ -+static void mpd_initPlaylistFile(mpd_PlaylistFile * playlist) -+{ -+ playlist->path = NULL; -+} -+ -+static void mpd_finishPlaylistFile(mpd_PlaylistFile * playlist) -+{ -+ if (playlist->path) -+ free(playlist->path); -+} -+ -+mpd_PlaylistFile *mpd_newPlaylistFile(void) -+{ -+ mpd_PlaylistFile *playlist = malloc(sizeof(mpd_PlaylistFile)); -+ -+ mpd_initPlaylistFile(playlist); -+ -+ return playlist; -+} -+ -+void mpd_freePlaylistFile(mpd_PlaylistFile * playlist) -+{ -+ mpd_finishPlaylistFile(playlist); -+ free(playlist); -+} -+ -+mpd_PlaylistFile *mpd_playlistFileDup(mpd_PlaylistFile * playlist) -+{ -+ mpd_PlaylistFile *ret = mpd_newPlaylistFile(); -+ -+ if (playlist->path) -+ ret->path = strdup(playlist->path); -+ -+ return ret; -+} -+ -+static void mpd_initInfoEntity(mpd_InfoEntity * entity) -+{ -+ entity->info.directory = NULL; -+} -+ -+static void mpd_finishInfoEntity(mpd_InfoEntity * entity) -+{ -+ if (entity->info.directory) { -+ if (entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { -+ mpd_freeDirectory(entity->info.directory); -+ } else if (entity->type == MPD_INFO_ENTITY_TYPE_SONG) { -+ mpd_freeSong(entity->info.song); -+ } else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { -+ mpd_freePlaylistFile(entity->info.playlistFile); -+ } -+ } -+} -+ -+mpd_InfoEntity *mpd_newInfoEntity(void) -+{ -+ mpd_InfoEntity *entity = malloc(sizeof(mpd_InfoEntity)); -+ -+ mpd_initInfoEntity(entity); -+ -+ return entity; -+} -+ -+void mpd_freeInfoEntity(mpd_InfoEntity * entity) -+{ -+ mpd_finishInfoEntity(entity); -+ free(entity); -+} -+ -+static void mpd_sendInfoCommand(mpd_Connection * connection, char *command) -+{ -+ mpd_executeCommand(connection, command); -+} -+ -+mpd_InfoEntity *mpd_getNextInfoEntity(mpd_Connection * connection) -+{ -+ mpd_InfoEntity *entity = NULL; -+ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ return NULL; -+ } -+ -+ if (!connection->returnElement) -+ mpd_getNextReturnElement(connection); -+ -+ if (connection->returnElement) { -+ if (strcmp(connection->returnElement->name, "file") == 0) { -+ entity = mpd_newInfoEntity(); -+ entity->type = MPD_INFO_ENTITY_TYPE_SONG; -+ entity->info.song = mpd_newSong(); -+ entity->info.song->file = strdup(connection->returnElement->value); -+ } else if (strcmp(connection->returnElement->name, "directory") == 0) { -+ entity = mpd_newInfoEntity(); -+ entity->type = MPD_INFO_ENTITY_TYPE_DIRECTORY; -+ entity->info.directory = mpd_newDirectory(); -+ entity->info.directory->path = strdup(connection->returnElement->value); -+ } else if (strcmp(connection->returnElement->name, "playlist") == 0) { -+ entity = mpd_newInfoEntity(); -+ entity->type = MPD_INFO_ENTITY_TYPE_PLAYLISTFILE; -+ entity->info.playlistFile = mpd_newPlaylistFile(); -+ entity->info.playlistFile->path = strdup(connection->returnElement->value); -+ } else if (strcmp(connection->returnElement->name, "cpos") == 0) { -+ entity = mpd_newInfoEntity(); -+ entity->type = MPD_INFO_ENTITY_TYPE_SONG; -+ entity->info.song = mpd_newSong(); -+ entity->info.song->pos = atoi(connection->returnElement->value); -+ } else { -+ connection->error = 1; -+ strcpy(connection->errorStr, "problem parsing song info"); -+ return NULL; -+ } -+ } else -+ return NULL; -+ -+ mpd_getNextReturnElement(connection); -+ while (connection->returnElement) { -+ mpd_ReturnElement *re = connection->returnElement; -+ -+ if (strcmp(re->name, "file") == 0) -+ return entity; -+ else if (strcmp(re->name, "directory") == 0) -+ return entity; -+ else if (strcmp(re->name, "playlist") == 0) -+ return entity; -+ else if (strcmp(re->name, "cpos") == 0) -+ return entity; -+ -+ if (entity->type == MPD_INFO_ENTITY_TYPE_SONG && strlen(re->value)) { -+ if (!entity->info.song->artist && strcmp(re->name, "Artist") == 0) { -+ entity->info.song->artist = strdup(re->value); -+ } else if (!entity->info.song->album && strcmp(re->name, "Album") == 0) { -+ entity->info.song->album = strdup(re->value); -+ } else if (!entity->info.song->title && strcmp(re->name, "Title") == 0) { -+ entity->info.song->title = strdup(re->value); -+ } else if (!entity->info.song->track && strcmp(re->name, "Track") == 0) { -+ entity->info.song->track = strdup(re->value); -+ } else if (!entity->info.song->name && strcmp(re->name, "Name") == 0) { -+ entity->info.song->name = strdup(re->value); -+ } else if (entity->info.song->time == MPD_SONG_NO_TIME && strcmp(re->name, "Time") == 0) { -+ entity->info.song->time = atoi(re->value); -+ } else if (entity->info.song->pos == MPD_SONG_NO_NUM && strcmp(re->name, "Pos") == 0) { -+ entity->info.song->pos = atoi(re->value); -+ } else if (entity->info.song->id == MPD_SONG_NO_ID && strcmp(re->name, "Id") == 0) { -+ entity->info.song->id = atoi(re->value); -+ } else if (!entity->info.song->date && strcmp(re->name, "Date") == 0) { -+ entity->info.song->date = strdup(re->value); -+ } else if (!entity->info.song->genre && strcmp(re->name, "Genre") == 0) { -+ entity->info.song->genre = strdup(re->value); -+ } else if (!entity->info.song->composer && strcmp(re->name, "Composer") == 0) { -+ entity->info.song->composer = strdup(re->value); -+ } else if (!entity->info.song->performer && strcmp(re->name, "Performer") == 0) { -+ entity->info.song->performer = strdup(re->value); -+ } else if (!entity->info.song->disc && strcmp(re->name, "Disc") == 0) { -+ entity->info.song->disc = strdup(re->value); -+ } else if (!entity->info.song->comment && strcmp(re->name, "Comment") == 0) { -+ entity->info.song->comment = strdup(re->value); -+ } -+ } else if (entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { -+ } else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { -+ } -+ -+ mpd_getNextReturnElement(connection); -+ } -+ -+ return entity; -+} -+ -+static char *mpd_getNextReturnElementNamed(mpd_Connection * connection, const char *name) -+{ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ return NULL; -+ } -+ -+ mpd_getNextReturnElement(connection); -+ while (connection->returnElement) { -+ mpd_ReturnElement *re = connection->returnElement; -+ -+ if (strcmp(re->name, name) == 0) -+ return strdup(re->value); -+ mpd_getNextReturnElement(connection); -+ } -+ -+ return NULL; -+} -+ -+char *mpd_getNextTag(mpd_Connection * connection, int type) -+{ -+ if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES || type == MPD_TAG_ITEM_ANY) -+ return NULL; -+ if (type == MPD_TAG_ITEM_FILENAME) -+ return mpd_getNextReturnElementNamed(connection, "file"); -+ return mpd_getNextReturnElementNamed(connection, mpdTagItemKeys[type]); -+} -+ -+char *mpd_getNextArtist(mpd_Connection * connection) -+{ -+ return mpd_getNextReturnElementNamed(connection, "Artist"); -+} -+ -+char *mpd_getNextAlbum(mpd_Connection * connection) -+{ -+ return mpd_getNextReturnElementNamed(connection, "Album"); -+} -+ -+void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songPos) -+{ -+ int len = strlen("playlistinfo") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playlistinfo \"%i\"\n", songPos); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int id) -+{ -+ int len = strlen("playlistid") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playlistid \"%i\"\n", id); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist) -+{ -+ int len = strlen("plchanges") + 2 + LONGLONGLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "plchanges \"%lld\"\n", playlist); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist) -+{ -+ int len = strlen("plchangesposid") + 2 + LONGLONGLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "plchangesposid \"%lld\"\n", playlist); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendListallCommand(mpd_Connection * connection, const char *dir) -+{ -+ char *sDir = mpd_sanitizeArg(dir); -+ int len = strlen("listall") + 2 + strlen(sDir) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "listall \"%s\"\n", sDir); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+ free(sDir); -+} -+ -+void mpd_sendListallInfoCommand(mpd_Connection * connection, const char *dir) -+{ -+ char *sDir = mpd_sanitizeArg(dir); -+ int len = strlen("listallinfo") + 2 + strlen(sDir) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "listallinfo \"%s\"\n", sDir); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+ free(sDir); -+} -+ -+void mpd_sendLsInfoCommand(mpd_Connection * connection, const char *dir) -+{ -+ char *sDir = mpd_sanitizeArg(dir); -+ int len = strlen("lsinfo") + 2 + strlen(sDir) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "lsinfo \"%s\"\n", sDir); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+ free(sDir); -+} -+ -+void mpd_sendCurrentSongCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "currentsong\n"); -+} -+ -+void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char *str) -+{ -+ mpd_startSearch(connection, 0); -+ mpd_addConstraintSearch(connection, table, str); -+ mpd_commitSearch(connection); -+} -+ -+void mpd_sendFindCommand(mpd_Connection * connection, int table, const char *str) -+{ -+ mpd_startSearch(connection, 1); -+ mpd_addConstraintSearch(connection, table, str); -+ mpd_commitSearch(connection); -+} -+ -+void mpd_sendListCommand(mpd_Connection * connection, int table, const char *arg1) -+{ -+ char st[10]; -+ int len; -+ char *string; -+ if (table == MPD_TABLE_ARTIST) -+ strcpy(st, "artist"); -+ else if (table == MPD_TABLE_ALBUM) -+ strcpy(st, "album"); -+ else { -+ connection->error = 1; -+ strcpy(connection->errorStr, "unknown table for list"); -+ return; -+ } -+ if (arg1) { -+ char *sanitArg1 = mpd_sanitizeArg(arg1); -+ len = strlen("list") + 1 + strlen(sanitArg1) + 2 + strlen(st) + 3; -+ string = malloc(len); -+ snprintf(string, len, "list %s \"%s\"\n", st, sanitArg1); -+ free(sanitArg1); -+ } else { -+ len = strlen("list") + 1 + strlen(st) + 2; -+ string = malloc(len); -+ snprintf(string, len, "list %s\n", st); -+ } -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendAddCommand(mpd_Connection * connection, const char *file) -+{ -+ char *sFile = mpd_sanitizeArg(file); -+ int len = strlen("add") + 2 + strlen(sFile) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "add \"%s\"\n", sFile); -+ mpd_executeCommand(connection, string); -+ free(string); -+ free(sFile); -+} -+ -+int mpd_sendAddIdCommand(mpd_Connection * connection, const char *file) -+{ -+ int retval = -1; -+ char *sFile = mpd_sanitizeArg(file); -+ int len = strlen("addid") + 2 + strlen(sFile) + 3; -+ char *string = malloc(len); -+ -+ snprintf(string, len, "addid \"%s\"\n", sFile); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+ free(sFile); -+ -+ string = mpd_getNextReturnElementNamed(connection, "Id"); -+ if (string) { -+ retval = atoi(string); -+ free(string); -+ } -+ -+ return retval; -+} -+ -+void mpd_sendDeleteCommand(mpd_Connection * connection, int songPos) -+{ -+ int len = strlen("delete") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "delete \"%i\"\n", songPos); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendDeleteIdCommand(mpd_Connection * connection, int id) -+{ -+ int len = strlen("deleteid") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "deleteid \"%i\"\n", id); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendSaveCommand(mpd_Connection * connection, const char *name) -+{ -+ char *sName = mpd_sanitizeArg(name); -+ int len = strlen("save") + 2 + strlen(sName) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "save \"%s\"\n", sName); -+ mpd_executeCommand(connection, string); -+ free(string); -+ free(sName); -+} -+ -+void mpd_sendLoadCommand(mpd_Connection * connection, const char *name) -+{ -+ char *sName = mpd_sanitizeArg(name); -+ int len = strlen("load") + 2 + strlen(sName) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "load \"%s\"\n", sName); -+ mpd_executeCommand(connection, string); -+ free(string); -+ free(sName); -+} -+ -+void mpd_sendRmCommand(mpd_Connection * connection, const char *name) -+{ -+ char *sName = mpd_sanitizeArg(name); -+ int len = strlen("rm") + 2 + strlen(sName) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "rm \"%s\"\n", sName); -+ mpd_executeCommand(connection, string); -+ free(string); -+ free(sName); -+} -+ -+void mpd_sendRenameCommand(mpd_Connection * connection, const char *from, const char *to) -+{ -+ char *sFrom = mpd_sanitizeArg(from); -+ char *sTo = mpd_sanitizeArg(to); -+ int len = strlen("rename") + 2 + strlen(sFrom) + 3 + strlen(sTo) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "rename \"%s\" \"%s\"\n", sFrom, sTo); -+ mpd_executeCommand(connection, string); -+ free(string); -+ free(sFrom); -+ free(sTo); -+} -+ -+void mpd_sendShuffleCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "shuffle\n"); -+} -+ -+void mpd_sendClearCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "clear\n"); -+} -+ -+void mpd_sendPlayCommand(mpd_Connection * connection, int songPos) -+{ -+ int len = strlen("play") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "play \"%i\"\n", songPos); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendPlayIdCommand(mpd_Connection * connection, int id) -+{ -+ int len = strlen("playid") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playid \"%i\"\n", id); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendStopCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "stop\n"); -+} -+ -+void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode) -+{ -+ int len = strlen("pause") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "pause \"%i\"\n", pauseMode); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendNextCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "next\n"); -+} -+ -+void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to) -+{ -+ int len = strlen("move") + 2 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "move \"%i\" \"%i\"\n", from, to); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendMoveIdCommand(mpd_Connection * connection, int id, int to) -+{ -+ int len = strlen("moveid") + 2 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "moveid \"%i\" \"%i\"\n", id, to); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2) -+{ -+ int len = strlen("swap") + 2 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "swap \"%i\" \"%i\"\n", song1, song2); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendSwapIdCommand(mpd_Connection * connection, int id1, int id2) -+{ -+ int len = strlen("swapid") + 2 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "swapid \"%i\" \"%i\"\n", id1, id2); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time) -+{ -+ int len = strlen("seek") + 2 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "seek \"%i\" \"%i\"\n", song, time); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendSeekIdCommand(mpd_Connection * connection, int id, int time) -+{ -+ int len = strlen("seekid") + 2 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "seekid \"%i\" \"%i\"\n", id, time); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendUpdateCommand(mpd_Connection * connection, char *path) -+{ -+ char *sPath = mpd_sanitizeArg(path); -+ int len = strlen("update") + 2 + strlen(sPath) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "update \"%s\"\n", sPath); -+ mpd_sendInfoCommand(connection, string); -+ free(string); -+ free(sPath); -+} -+ -+int mpd_getUpdateId(mpd_Connection * connection) -+{ -+ char *jobid; -+ int ret = 0; -+ -+ jobid = mpd_getNextReturnElementNamed(connection, "updating_db"); -+ if (jobid) { -+ ret = atoi(jobid); -+ free(jobid); -+ } -+ -+ return ret; -+} -+ -+void mpd_sendPrevCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "previous\n"); -+} -+ -+void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode) -+{ -+ int len = strlen("repeat") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "repeat \"%i\"\n", repeatMode); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode) -+{ -+ int len = strlen("random") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "random \"%i\"\n", randomMode); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange) -+{ -+ int len = strlen("setvol") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "setvol \"%i\"\n", volumeChange); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange) -+{ -+ int len = strlen("volume") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "volume \"%i\"\n", volumeChange); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds) -+{ -+ int len = strlen("crossfade") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "crossfade \"%i\"\n", seconds); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendPasswordCommand(mpd_Connection * connection, const char *pass) -+{ -+ char *sPass = mpd_sanitizeArg(pass); -+ int len = strlen("password") + 2 + strlen(sPass) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "password \"%s\"\n", sPass); -+ mpd_executeCommand(connection, string); -+ free(string); -+ free(sPass); -+} -+ -+void mpd_sendCommandListBegin(mpd_Connection * connection) -+{ -+ if (connection->commandList) { -+ strcpy(connection->errorStr, "already in command list mode"); -+ connection->error = 1; -+ return; -+ } -+ connection->commandList = COMMAND_LIST; -+ mpd_executeCommand(connection, "command_list_begin\n"); -+} -+ -+void mpd_sendCommandListOkBegin(mpd_Connection * connection) -+{ -+ if (connection->commandList) { -+ strcpy(connection->errorStr, "already in command list mode"); -+ connection->error = 1; -+ return; -+ } -+ connection->commandList = COMMAND_LIST_OK; -+ mpd_executeCommand(connection, "command_list_ok_begin\n"); -+ connection->listOks = 0; -+} -+ -+void mpd_sendCommandListEnd(mpd_Connection * connection) -+{ -+ if (!connection->commandList) { -+ strcpy(connection->errorStr, "not in command list mode"); -+ connection->error = 1; -+ return; -+ } -+ connection->commandList = 0; -+ mpd_executeCommand(connection, "command_list_end\n"); -+} -+ -+void mpd_sendOutputsCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "outputs\n"); -+} -+ -+mpd_OutputEntity *mpd_getNextOutput(mpd_Connection * connection) -+{ -+ mpd_OutputEntity *output = NULL; -+ -+ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) { -+ return NULL; -+ } -+ -+ if (connection->error) -+ return NULL; -+ -+ output = malloc(sizeof(mpd_OutputEntity)); -+ output->id = -10; -+ output->name = NULL; -+ output->enabled = 0; -+ -+ if (!connection->returnElement) -+ mpd_getNextReturnElement(connection); -+ -+ while (connection->returnElement) { -+ mpd_ReturnElement *re = connection->returnElement; -+ if (strcmp(re->name, "outputid") == 0) { -+ if (output != NULL && output->id >= 0) -+ return output; -+ output->id = atoi(re->value); -+ } else if (strcmp(re->name, "outputname") == 0) { -+ output->name = strdup(re->value); -+ } else if (strcmp(re->name, "outputenabled") == 0) { -+ output->enabled = atoi(re->value); -+ } -+ -+ mpd_getNextReturnElement(connection); -+ if (connection->error) { -+ free(output); -+ return NULL; -+ } -+ -+ } -+ -+ return output; -+} -+ -+void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId) -+{ -+ int len = strlen("enableoutput") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "enableoutput \"%i\"\n", outputId); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId) -+{ -+ int len = strlen("disableoutput") + 2 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "disableoutput \"%i\"\n", outputId); -+ mpd_executeCommand(connection, string); -+ free(string); -+} -+ -+void mpd_freeOutputElement(mpd_OutputEntity * output) -+{ -+ free(output->name); -+ free(output); -+} -+ -+/** -+ * mpd_sendNotCommandsCommand -+ * odd naming, but it gets the not allowed commands -+ */ -+ -+void mpd_sendNotCommandsCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "notcommands\n"); -+} -+ -+/** -+ * mpd_sendCommandsCommand -+ * odd naming, but it gets the allowed commands -+ */ -+void mpd_sendCommandsCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "commands\n"); -+} -+ -+/** -+ * Get the next returned command -+ */ -+char *mpd_getNextCommand(mpd_Connection * connection) -+{ -+ return mpd_getNextReturnElementNamed(connection, "command"); -+} -+ -+void mpd_sendUrlHandlersCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "urlhandlers\n"); -+} -+ -+char *mpd_getNextHandler(mpd_Connection * connection) -+{ -+ return mpd_getNextReturnElementNamed(connection, "handler"); -+} -+ -+void mpd_sendTagTypesCommand(mpd_Connection * connection) -+{ -+ mpd_executeCommand(connection, "tagtypes\n"); -+} -+ -+char *mpd_getNextTagType(mpd_Connection * connection) -+{ -+ return mpd_getNextReturnElementNamed(connection, "tagtype"); -+} -+ -+void mpd_startSearch(mpd_Connection * connection, int exact) -+{ -+ if (connection->request) { -+ strcpy(connection->errorStr, "search already in progress"); -+ connection->error = 1; -+ return; -+ } -+ -+ if (exact) -+ connection->request = strdup("find"); -+ else -+ connection->request = strdup("search"); -+} -+ -+void mpd_startStatsSearch(mpd_Connection * connection) -+{ -+ if (connection->request) { -+ strcpy(connection->errorStr, "search already in progress"); -+ connection->error = 1; -+ return; -+ } -+ -+ connection->request = strdup("count"); -+} -+ -+void mpd_startPlaylistSearch(mpd_Connection * connection, int exact) -+{ -+ if (connection->request) { -+ strcpy(connection->errorStr, "search already in progress"); -+ connection->error = 1; -+ return; -+ } -+ -+ if (exact) -+ connection->request = strdup("playlistfind"); -+ else -+ connection->request = strdup("playlistsearch"); -+} -+ -+void mpd_startFieldSearch(mpd_Connection * connection, int type) -+{ -+ char *strtype; -+ int len; -+ -+ if (connection->request) { -+ strcpy(connection->errorStr, "search already in progress"); -+ connection->error = 1; -+ return; -+ } -+ -+ if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) { -+ strcpy(connection->errorStr, "invalid type specified"); -+ connection->error = 1; -+ return; -+ } -+ -+ strtype = mpdTagItemKeys[type]; -+ -+ len = 5 + strlen(strtype) + 1; -+ connection->request = malloc(len); -+ -+ snprintf(connection->request, len, "list %c%s", tolower(strtype[0]), strtype + 1); -+} -+ -+void mpd_addConstraintSearch(mpd_Connection * connection, int type, const char *name) -+{ -+ char *strtype; -+ char *arg; -+ int len; -+ char *string; -+ -+ if (!connection->request) { -+ strcpy(connection->errorStr, "no search in progress"); -+ connection->error = 1; -+ return; -+ } -+ -+ if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) { -+ strcpy(connection->errorStr, "invalid type specified"); -+ connection->error = 1; -+ return; -+ } -+ -+ if (name == NULL) { -+ strcpy(connection->errorStr, "no name specified"); -+ connection->error = 1; -+ return; -+ } -+ -+ string = strdup(connection->request); -+ strtype = mpdTagItemKeys[type]; -+ arg = mpd_sanitizeArg(name); -+ -+ len = strlen(string) + 1 + strlen(strtype) + 2 + strlen(arg) + 2; -+ connection->request = realloc(connection->request, len); -+ snprintf(connection->request, len, "%s %c%s \"%s\"", string, tolower(strtype[0]), strtype + 1, arg); -+ -+ free(string); -+ free(arg); -+} -+ -+void mpd_commitSearch(mpd_Connection * connection) -+{ -+ int len; -+ -+ if (!connection->request) { -+ strcpy(connection->errorStr, "no search in progress"); -+ connection->error = 1; -+ return; -+ } -+ -+ len = strlen(connection->request) + 2; -+ connection->request = realloc(connection->request, len); -+ connection->request[len - 2] = '\n'; -+ connection->request[len - 1] = '\0'; -+ mpd_sendInfoCommand(connection, connection->request); -+ -+ free(connection->request); -+ connection->request = NULL; -+} -+ -+/** -+ * @param connection a MpdConnection -+ * @param path the path to the playlist. -+ * -+ * List the content, with full metadata, of a stored playlist. -+ * -+ */ -+void mpd_sendListPlaylistInfoCommand(mpd_Connection * connection, char *path) -+{ -+ char *arg = mpd_sanitizeArg(path); -+ int len = strlen("listplaylistinfo") + 2 + strlen(arg) + 3; -+ char *query = malloc(len); -+ snprintf(query, len, "listplaylistinfo \"%s\"\n", arg); -+ mpd_sendInfoCommand(connection, query); -+ free(arg); -+ free(query); -+} -+ -+/** -+ * @param connection a MpdConnection -+ * @param path the path to the playlist. -+ * -+ * List the content of a stored playlist. -+ * -+ */ -+void mpd_sendListPlaylistCommand(mpd_Connection * connection, char *path) -+{ -+ char *arg = mpd_sanitizeArg(path); -+ int len = strlen("listplaylist") + 2 + strlen(arg) + 3; -+ char *query = malloc(len); -+ snprintf(query, len, "listplaylist \"%s\"\n", arg); -+ mpd_sendInfoCommand(connection, query); -+ free(arg); -+ free(query); -+} -+ -+void mpd_sendPlaylistClearCommand(mpd_Connection * connection, char *path) -+{ -+ char *sPath = mpd_sanitizeArg(path); -+ int len = strlen("playlistclear") + 2 + strlen(sPath) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playlistclear \"%s\"\n", sPath); -+ mpd_executeCommand(connection, string); -+ free(sPath); -+ free(string); -+} -+ -+void mpd_sendPlaylistAddCommand(mpd_Connection * connection, char *playlist, char *path) -+{ -+ char *sPlaylist = mpd_sanitizeArg(playlist); -+ char *sPath = mpd_sanitizeArg(path); -+ int len = strlen("playlistadd") + 2 + strlen(sPlaylist) + 3 + strlen(sPath) + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playlistadd \"%s\" \"%s\"\n", sPlaylist, sPath); -+ mpd_executeCommand(connection, string); -+ free(sPlaylist); -+ free(sPath); -+ free(string); -+} -+ -+void mpd_sendPlaylistMoveCommand(mpd_Connection * connection, char *playlist, int from, int to) -+{ -+ char *sPlaylist = mpd_sanitizeArg(playlist); -+ int len = strlen("playlistmove") + 2 + strlen(sPlaylist) + 3 + INTLEN + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playlistmove \"%s\" \"%i\" \"%i\"\n", sPlaylist, from, to); -+ mpd_executeCommand(connection, string); -+ free(sPlaylist); -+ free(string); -+} -+ -+void mpd_sendPlaylistDeleteCommand(mpd_Connection * connection, char *playlist, int pos) -+{ -+ char *sPlaylist = mpd_sanitizeArg(playlist); -+ int len = strlen("playlistdelete") + 2 + strlen(sPlaylist) + 3 + INTLEN + 3; -+ char *string = malloc(len); -+ snprintf(string, len, "playlistdelete \"%s\" \"%i\"\n", sPlaylist, pos); -+ mpd_executeCommand(connection, string); -+ free(sPlaylist); -+ free(string); -+} ---- /dev/null -+++ b/libmpdclient.h -@@ -0,0 +1,661 @@ -+/* libmpdclient -+ (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com) -+ This project's homepage is: http://www.musicpd.org -+ -+ Redistribution and use in source and binary forms, with or without -+ modification, are permitted provided that the following conditions -+ are met: -+ -+ - Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ -+ - Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ -+ - Neither the name of the Music Player Daemon nor the names of its -+ contributors may be used to endorse or promote products derived from -+ this software without specific prior written permission. -+ -+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR -+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+*/ -+ -+#ifndef LIBMPDCLIENT_H -+#define LIBMPDCLIENT_H -+ -+#ifdef WIN32 -+# define __W32API_USE_DLLIMPORT__ 1 -+#endif -+ -+#include -+#include -+#define MPD_BUFFER_MAX_LENGTH 50000 -+#define MPD_ERRORSTR_MAX_LENGTH 1000 -+#define MPD_WELCOME_MESSAGE "OK MPD " -+ -+#define MPD_ERROR_TIMEOUT 10 /* timeout trying to talk to mpd */ -+#define MPD_ERROR_SYSTEM 11 /* system error */ -+#define MPD_ERROR_UNKHOST 12 /* unknown host */ -+#define MPD_ERROR_CONNPORT 13 /* problems connecting to port on host */ -+#define MPD_ERROR_NOTMPD 14 /* mpd not running on port at host */ -+#define MPD_ERROR_NORESPONSE 15 /* no response on attempting to connect */ -+#define MPD_ERROR_SENDING 16 /* error sending command */ -+#define MPD_ERROR_CONNCLOSED 17 /* connection closed by mpd */ -+#define MPD_ERROR_ACK 18 /* ACK returned! */ -+#define MPD_ERROR_BUFFEROVERRUN 19 /* Buffer was overrun! */ -+ -+#define MPD_ACK_ERROR_UNK -1 -+#define MPD_ERROR_AT_UNK -1 -+ -+#define MPD_ACK_ERROR_NOT_LIST 1 -+#define MPD_ACK_ERROR_ARG 2 -+#define MPD_ACK_ERROR_PASSWORD 3 -+#define MPD_ACK_ERROR_PERMISSION 4 -+#define MPD_ACK_ERROR_UNKNOWN_CMD 5 -+ -+#define MPD_ACK_ERROR_NO_EXIST 50 -+#define MPD_ACK_ERROR_PLAYLIST_MAX 51 -+#define MPD_ACK_ERROR_SYSTEM 52 -+#define MPD_ACK_ERROR_PLAYLIST_LOAD 53 -+#define MPD_ACK_ERROR_UPDATE_ALREADY 54 -+#define MPD_ACK_ERROR_PLAYER_SYNC 55 -+#define MPD_ACK_ERROR_EXIST 56 -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+ typedef enum mpd_TagItems { -+ MPD_TAG_ITEM_ARTIST, -+ MPD_TAG_ITEM_ALBUM, -+ MPD_TAG_ITEM_TITLE, -+ MPD_TAG_ITEM_TRACK, -+ MPD_TAG_ITEM_NAME, -+ MPD_TAG_ITEM_GENRE, -+ MPD_TAG_ITEM_DATE, -+ MPD_TAG_ITEM_COMPOSER, -+ MPD_TAG_ITEM_PERFORMER, -+ MPD_TAG_ITEM_COMMENT, -+ MPD_TAG_ITEM_DISC, -+ MPD_TAG_ITEM_FILENAME, -+ MPD_TAG_ITEM_ANY, -+ MPD_TAG_NUM_OF_ITEM_TYPES -+ } mpd_TagItems; -+ -+ extern char *mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES]; -+ -+/* internal stuff don't touch this struct */ -+ typedef struct _mpd_ReturnElement { -+ char *name; -+ char *value; -+ } mpd_ReturnElement; -+ -+/* mpd_Connection -+ * holds info about connection to mpd -+ * use error, and errorStr to detect errors -+ */ -+ typedef struct _mpd_Connection { -+ /* use this to check the version of mpd */ -+ int version[3]; -+ /* IMPORTANT, you want to get the error messages from here */ -+ char errorStr[MPD_ERRORSTR_MAX_LENGTH + 1]; -+ int errorCode; -+ int errorAt; -+ /* this will be set to MPD_ERROR_* if there is an error, 0 if not */ -+ int error; -+ /* DON'T TOUCH any of the rest of this stuff */ -+ int sock; -+ char buffer[MPD_BUFFER_MAX_LENGTH + 1]; -+ int buflen; -+ int bufstart; -+ int doneProcessing; -+ int listOks; -+ int doneListOk; -+ int commandList; -+ mpd_ReturnElement *returnElement; -+ struct timeval timeout; -+ char *request; -+ } mpd_Connection; -+ -+/* mpd_newConnection -+ * use this to open a new connection -+ * you should use mpd_closeConnection, when your done with the connection, -+ * even if an error has occurred -+ * _timeout_ is the connection timeout period in seconds -+ */ -+ mpd_Connection *mpd_newConnection(const char *host, int port, float timeout); -+ -+ void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout); -+ -+/* mpd_closeConnection -+ * use this to close a connection and free'ing subsequent memory -+ */ -+ void mpd_closeConnection(mpd_Connection * connection); -+ -+/* mpd_clearError -+ * clears error -+ */ -+ void mpd_clearError(mpd_Connection * connection); -+ -+/* STATUS STUFF */ -+ -+/* use these with status.state to determine what state the player is in */ -+#define MPD_STATUS_STATE_UNKNOWN 0 -+#define MPD_STATUS_STATE_STOP 1 -+#define MPD_STATUS_STATE_PLAY 2 -+#define MPD_STATUS_STATE_PAUSE 3 -+ -+/* us this with status.volume to determine if mpd has volume support */ -+#define MPD_STATUS_NO_VOLUME -1 -+ -+/* mpd_Status -+ * holds info return from status command -+ */ -+ typedef struct mpd_Status { -+ /* 0-100, or MPD_STATUS_NO_VOLUME when there is no volume support */ -+ int volume; -+ /* 1 if repeat is on, 0 otherwise */ -+ int repeat; -+ /* 1 if random is on, 0 otherwise */ -+ int random; -+ /* playlist length */ -+ int playlistLength; -+ /* playlist, use this to determine when the playlist has changed */ -+ long long playlist; -+ /* use with MPD_STATUS_STATE_* to determine state of player */ -+ int state; -+ /* crossfade setting in seconds */ -+ int crossfade; -+ /* if a song is currently selected (always the case when state is -+ * PLAY or PAUSE), this is the position of the currently -+ * playing song in the playlist, beginning with 0 -+ */ -+ int song; -+ /* Song ID of the currently selected song */ -+ int songid; -+ /* time in seconds that have elapsed in the currently playing/paused -+ * song -+ */ -+ int elapsedTime; -+ /* length in seconds of the currently playing/paused song */ -+ int totalTime; -+ /* current bit rate in kbs */ -+ int bitRate; -+ /* audio sample rate */ -+ unsigned int sampleRate; -+ /* audio bits */ -+ int bits; -+ /* audio channels */ -+ int channels; -+ /* 1 if mpd is updating, 0 otherwise */ -+ int updatingDb; -+ /* error */ -+ char *error; -+ } mpd_Status; -+ -+ void mpd_sendStatusCommand(mpd_Connection * connection); -+ -+/* mpd_getStatus -+ * returns status info, be sure to free it with mpd_freeStatus() -+ * call this after mpd_sendStatusCommand() -+ */ -+ mpd_Status *mpd_getStatus(mpd_Connection * connection); -+ -+/* mpd_freeStatus -+ * free's status info malloc'd and returned by mpd_getStatus -+ */ -+ void mpd_freeStatus(mpd_Status * status); -+ -+ typedef struct _mpd_Stats { -+ int numberOfArtists; -+ int numberOfAlbums; -+ int numberOfSongs; -+ unsigned long uptime; -+ unsigned long dbUpdateTime; -+ unsigned long playTime; -+ unsigned long dbPlayTime; -+ } mpd_Stats; -+ -+ typedef struct _mpd_SearchStats { -+ int numberOfSongs; -+ unsigned long playTime; -+ } mpd_SearchStats; -+ -+ void mpd_sendStatsCommand(mpd_Connection * connection); -+ -+ mpd_Stats *mpd_getStats(mpd_Connection * connection); -+ -+ void mpd_freeStats(mpd_Stats * stats); -+ -+ mpd_SearchStats *mpd_getSearchStats(mpd_Connection * connection); -+ -+ void mpd_freeSearchStats(mpd_SearchStats * stats); -+ -+/* SONG STUFF */ -+ -+#define MPD_SONG_NO_TIME -1 -+#define MPD_SONG_NO_NUM -1 -+#define MPD_SONG_NO_ID -1 -+ -+/* mpd_Song -+ * for storing song info returned by mpd -+ */ -+ typedef struct _mpd_Song { -+ /* filename of song */ -+ char *file; -+ /* artist, maybe NULL if there is no tag */ -+ char *artist; -+ /* title, maybe NULL if there is no tag */ -+ char *title; -+ /* album, maybe NULL if there is no tag */ -+ char *album; -+ /* track, maybe NULL if there is no tag */ -+ char *track; -+ /* name, maybe NULL if there is no tag; it's the name of the current -+ * song, f.e. the icyName of the stream */ -+ char *name; -+ /* date */ -+ char *date; -+ -+ /* added by qball */ -+ /* Genre */ -+ char *genre; -+ /* Composer */ -+ char *composer; -+ /* Performer */ -+ char *performer; -+ /* Disc */ -+ char *disc; -+ /* Comment */ -+ char *comment; -+ -+ /* length of song in seconds, check that it is not MPD_SONG_NO_TIME */ -+ int time; -+ /* if plchanges/playlistinfo/playlistid used, is the position of the -+ * song in the playlist */ -+ int pos; -+ /* song id for a song in the playlist */ -+ int id; -+ } mpd_Song; -+ -+/* mpd_newSong -+ * use to allocate memory for a new mpd_Song -+ * file, artist, etc all initialized to NULL -+ * if your going to assign values to file, artist, etc -+ * be sure to malloc or strdup the memory -+ * use mpd_freeSong to free the memory for the mpd_Song, it will also -+ * free memory for file, artist, etc, so don't do it yourself -+ */ -+ mpd_Song *mpd_newSong(void); -+ -+/* mpd_freeSong -+ * use to free memory allocated by mpd_newSong -+ * also it will free memory pointed to by file, artist, etc, so be careful -+ */ -+ void mpd_freeSong(mpd_Song * song); -+ -+/* mpd_songDup -+ * works like strDup, but for a mpd_Song -+ */ -+ mpd_Song *mpd_songDup(mpd_Song * song); -+ -+/* DIRECTORY STUFF */ -+ -+/* mpd_Directory -+ * used to store info fro directory (right now that just the path) -+ */ -+ typedef struct _mpd_Directory { -+ char *path; -+ } mpd_Directory; -+ -+/* mpd_newDirectory -+ * allocates memory for a new directory -+ * use mpd_freeDirectory to free this memory -+ */ -+ mpd_Directory *mpd_newDirectory(void); -+ -+/* mpd_freeDirectory -+ * used to free memory allocated with mpd_newDirectory, and it frees -+ * path of mpd_Directory, so be careful -+ */ -+ void mpd_freeDirectory(mpd_Directory * directory); -+ -+/* mpd_directoryDup -+ * works like strdup, but for mpd_Directory -+ */ -+ mpd_Directory *mpd_directoryDup(mpd_Directory * directory); -+ -+/* PLAYLISTFILE STUFF */ -+ -+/* mpd_PlaylistFile -+ * stores info about playlist file returned by lsinfo -+ */ -+ typedef struct _mpd_PlaylistFile { -+ char *path; -+ } mpd_PlaylistFile; -+ -+/* mpd_newPlaylistFile -+ * allocates memory for new mpd_PlaylistFile, path is set to NULL -+ * free this memory with mpd_freePlaylistFile -+ */ -+ mpd_PlaylistFile *mpd_newPlaylistFile(void); -+ -+/* mpd_freePlaylist -+ * free memory allocated for freePlaylistFile, will also free -+ * path, so be careful -+ */ -+ void mpd_freePlaylistFile(mpd_PlaylistFile * playlist); -+ -+/* mpd_playlistFileDup -+ * works like strdup, but for mpd_PlaylistFile -+ */ -+ mpd_PlaylistFile *mpd_playlistFileDup(mpd_PlaylistFile * playlist); -+ -+/* INFO ENTITY STUFF */ -+ -+/* the type of entity returned from one of the commands that generates info -+ * use in conjunction with mpd_InfoEntity.type -+ */ -+#define MPD_INFO_ENTITY_TYPE_DIRECTORY 0 -+#define MPD_INFO_ENTITY_TYPE_SONG 1 -+#define MPD_INFO_ENTITY_TYPE_PLAYLISTFILE 2 -+ -+/* mpd_InfoEntity -+ * stores info on stuff returned info commands -+ */ -+ typedef struct mpd_InfoEntity { -+ /* the type of entity, use with MPD_INFO_ENTITY_TYPE_* to determine -+ * what this entity is (song, directory, etc...) -+ */ -+ int type; -+ /* the actual data you want, mpd_Song, mpd_Directory, etc */ -+ union { -+ mpd_Directory *directory; -+ mpd_Song *song; -+ mpd_PlaylistFile *playlistFile; -+ } info; -+ } mpd_InfoEntity; -+ -+ mpd_InfoEntity *mpd_newInfoEntity(void); -+ -+ void mpd_freeInfoEntity(mpd_InfoEntity * entity); -+ -+/* INFO COMMANDS AND STUFF */ -+ -+/* use this function to loop over after calling Info/Listall functions */ -+ mpd_InfoEntity *mpd_getNextInfoEntity(mpd_Connection * connection); -+ -+/* fetches the currently seeletect song (the song referenced by status->song -+ * and status->songid*/ -+ void mpd_sendCurrentSongCommand(mpd_Connection * connection); -+ -+/* songNum of -1, means to display the whole list */ -+ void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songNum); -+ -+/* songId of -1, means to display the whole list */ -+ void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int songId); -+ -+/* use this to get the changes in the playlist since version _playlist_ */ -+ void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist); -+ -+/** -+ * @param connection: A valid and connected mpd_Connection. -+ * @param playlist: The playlist version you want the diff with. -+ * A more bandwidth efficient version of the mpd_sendPlChangesCommand. -+ * It only returns the pos+id of the changes song. -+ */ -+ void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist); -+ -+/* recursivel fetches all songs/dir/playlists in "dir* (no metadata is -+ * returned) */ -+ void mpd_sendListallCommand(mpd_Connection * connection, const char *dir); -+ -+/* same as sendListallCommand, but also metadata is returned */ -+ void mpd_sendListallInfoCommand(mpd_Connection * connection, const char *dir); -+ -+/* non-recursive version of ListallInfo */ -+ void mpd_sendLsInfoCommand(mpd_Connection * connection, const char *dir); -+ -+#define MPD_TABLE_ARTIST MPD_TAG_ITEM_ARTIST -+#define MPD_TABLE_ALBUM MPD_TAG_ITEM_ALBUM -+#define MPD_TABLE_TITLE MPD_TAG_ITEM_TITLE -+#define MPD_TABLE_FILENAME MPD_TAG_ITEM_FILENAME -+ -+ void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char *str); -+ -+ void mpd_sendFindCommand(mpd_Connection * connection, int table, const char *str); -+ -+/* LIST TAG COMMANDS */ -+ -+/* use this function fetch next artist entry, be sure to free the returned -+ * string. NULL means there are no more. Best used with sendListArtists -+ */ -+ char *mpd_getNextArtist(mpd_Connection * connection); -+ -+ char *mpd_getNextAlbum(mpd_Connection * connection); -+ -+ char *mpd_getNextTag(mpd_Connection * connection, int type); -+ -+/* list artist or albums by artist, arg1 should be set to the artist if -+ * listing albums by a artist, otherwise NULL for listing all artists or albums -+ */ -+ void mpd_sendListCommand(mpd_Connection * connection, int table, const char *arg1); -+ -+/* SIMPLE COMMANDS */ -+ -+ void mpd_sendAddCommand(mpd_Connection * connection, const char *file); -+ -+ int mpd_sendAddIdCommand(mpd_Connection * connection, const char *file); -+ -+ void mpd_sendDeleteCommand(mpd_Connection * connection, int songNum); -+ -+ void mpd_sendDeleteIdCommand(mpd_Connection * connection, int songNum); -+ -+ void mpd_sendSaveCommand(mpd_Connection * connection, const char *name); -+ -+ void mpd_sendLoadCommand(mpd_Connection * connection, const char *name); -+ -+ void mpd_sendRmCommand(mpd_Connection * connection, const char *name); -+ -+ void mpd_sendRenameCommand(mpd_Connection * connection, const char *from, const char *to); -+ -+ void mpd_sendShuffleCommand(mpd_Connection * connection); -+ -+ void mpd_sendClearCommand(mpd_Connection * connection); -+ -+/* use this to start playing at the beginning, useful when in random mode */ -+#define MPD_PLAY_AT_BEGINNING -1 -+ -+ void mpd_sendPlayCommand(mpd_Connection * connection, int songNum); -+ -+ void mpd_sendPlayIdCommand(mpd_Connection * connection, int songNum); -+ -+ void mpd_sendStopCommand(mpd_Connection * connection); -+ -+ void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode); -+ -+ void mpd_sendNextCommand(mpd_Connection * connection); -+ -+ void mpd_sendPrevCommand(mpd_Connection * connection); -+ -+ void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to); -+ -+ void mpd_sendMoveIdCommand(mpd_Connection * connection, int from, int to); -+ -+ void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2); -+ -+ void mpd_sendSwapIdCommand(mpd_Connection * connection, int song1, int song2); -+ -+ void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time); -+ -+ void mpd_sendSeekIdCommand(mpd_Connection * connection, int song, int time); -+ -+ void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode); -+ -+ void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode); -+ -+ void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange); -+ -+/* WARNING: don't use volume command, its depreacted */ -+ void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange); -+ -+ void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds); -+ -+ void mpd_sendUpdateCommand(mpd_Connection * connection, char *path); -+ -+/* returns the update job id, call this after a update command*/ -+ int mpd_getUpdateId(mpd_Connection * connection); -+ -+ void mpd_sendPasswordCommand(mpd_Connection * connection, const char *pass); -+ -+/* after executing a command, when your done with it to get its status -+ * (you want to check connection->error for an error) -+ */ -+ void mpd_finishCommand(mpd_Connection * connection); -+ -+/* command list stuff, use this to do things like add files very quickly */ -+ void mpd_sendCommandListBegin(mpd_Connection * connection); -+ -+ void mpd_sendCommandListOkBegin(mpd_Connection * connection); -+ -+ void mpd_sendCommandListEnd(mpd_Connection * connection); -+ -+/* advance to the next listOk -+ * returns 0 if advanced to the next list_OK, -+ * returns -1 if it advanced to an OK or ACK */ -+ int mpd_nextListOkCommand(mpd_Connection * connection); -+ -+ typedef struct _mpd_OutputEntity { -+ int id; -+ char *name; -+ int enabled; -+ } mpd_OutputEntity; -+ -+ void mpd_sendOutputsCommand(mpd_Connection * connection); -+ -+ mpd_OutputEntity *mpd_getNextOutput(mpd_Connection * connection); -+ -+ void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId); -+ -+ void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId); -+ -+ void mpd_freeOutputElement(mpd_OutputEntity * output); -+ -+/** -+ * @param connection a #mpd_Connection -+ * -+ * Queries mpd for the allowed commands -+ */ -+ void mpd_sendCommandsCommand(mpd_Connection * connection); -+ -+/** -+ * @param connection a #mpd_Connection -+ * -+ * Queries mpd for the not allowed commands -+ */ -+ void mpd_sendNotCommandsCommand(mpd_Connection * connection); -+ -+/** -+ * @param connection a #mpd_Connection -+ * -+ * returns the next supported command. -+ * -+ * @returns a string, needs to be free'ed -+ */ -+ char *mpd_getNextCommand(mpd_Connection * connection); -+ -+ void mpd_sendUrlHandlersCommand(mpd_Connection * connection); -+ -+ char *mpd_getNextHandler(mpd_Connection * connection); -+ -+ void mpd_sendTagTypesCommand(mpd_Connection * connection); -+ -+ char *mpd_getNextTagType(mpd_Connection * connection); -+ -+/** -+ * @param connection a MpdConnection -+ * @param path the path to the playlist. -+ * -+ * List the content, with full metadata, of a stored playlist. -+ * -+ */ -+ void mpd_sendListPlaylistInfoCommand(mpd_Connection * connection, char *path); -+ -+/** -+ * @param connection a MpdConnection -+ * @param path the path to the playlist. -+ * -+ * List the content of a stored playlist. -+ * -+ */ -+ void mpd_sendListPlaylistCommand(mpd_Connection * connection, char *path); -+ -+/** -+ * @param connection a #mpd_Connection -+ * @param exact if to match exact -+ * -+ * starts a search, use mpd_addConstraintSearch to add -+ * a constraint to the search, and mpd_commitSearch to do the actual search -+ */ -+ void mpd_startSearch(mpd_Connection * connection, int exact); -+ -+/** -+ * @param connection a #mpd_Connection -+ * @param type -+ * @param name -+ */ -+ void mpd_addConstraintSearch(mpd_Connection * connection, int type, const char *name); -+ -+/** -+ * @param connection a #mpd_Connection -+ */ -+ void mpd_commitSearch(mpd_Connection * connection); -+ -+/** -+ * @param connection a #mpd_Connection -+ * @param type The type to search for -+ * -+ * starts a search for fields... f.e. get a list of artists would be: -+ * @code -+ * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST); -+ * mpd_commitSearch(connection); -+ * @endcode -+ * -+ * or get a list of artist in genre "jazz" would be: -+ * @code -+ * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST); -+ * mpd_addConstraintSearch(connection, MPD_TAG_ITEM_GENRE, "jazz") -+ * mpd_commitSearch(connection); -+ * @endcode -+ * -+ * mpd_startSearch will return a list of songs (and you need mpd_getNextInfoEntity) -+ * this one will return a list of only one field (the one specified with type) and you need -+ * mpd_getNextTag to get the results -+ */ -+ void mpd_startFieldSearch(mpd_Connection * connection, int type); -+ -+ void mpd_startPlaylistSearch(mpd_Connection * connection, int exact); -+ -+ void mpd_startStatsSearch(mpd_Connection * connection); -+ -+ void mpd_sendPlaylistClearCommand(mpd_Connection * connection, char *path); -+ -+ void mpd_sendPlaylistAddCommand(mpd_Connection * connection, char *playlist, char *path); -+ -+ void mpd_sendPlaylistMoveCommand(mpd_Connection * connection, char *playlist, int from, int to); -+ -+ void mpd_sendPlaylistDeleteCommand(mpd_Connection * connection, char *playlist, int pos); -+#ifdef __cplusplus -+} -+#endif -+#endif diff --git a/lcd4linux/patches/160-uinput_defs.patch b/lcd4linux/patches/160-uinput_defs.patch deleted file mode 100755 index 44b24b3c8..000000000 --- a/lcd4linux/patches/160-uinput_defs.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/drv_G15.c -+++ b/drv_G15.c -@@ -42,6 +42,7 @@ - - #include - #include -+#include - #include - #include - -@@ -269,8 +270,13 @@ void drv_G15_initKeyHandling(char *devic - } - memset(&device, 0, sizeof(device)); - strncpy(device.name, "G15 Keys", UINPUT_MAX_NAME_SIZE); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - device.id.bustype = BUS_USB; - device.id.version = 4; -+#else -+ device.idbus = BUS_USB; -+ device.idversion = 4; -+#endif - - ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY); - diff --git a/lcd4linux/patches/170-add-generic-spidev-driver.patch b/lcd4linux/patches/170-add-generic-spidev-driver.patch deleted file mode 100755 index 4cd53d6a5..000000000 --- a/lcd4linux/patches/170-add-generic-spidev-driver.patch +++ /dev/null @@ -1,195 +0,0 @@ ---- a/Makefile.am -+++ b/Makefile.am -@@ -71,6 +71,8 @@ drv_generic_i2c.c \ - drv_generic_i2c.h \ - drv_generic_keypad.c \ - drv_generic_keypad.h \ -+drv_generic_spidev.c \ -+drv_generic_spidev.h \ - drv_ASTUSB.c \ - drv_BeckmannEgle.c \ - drv_BWCT.c \ ---- /dev/null -+++ b/drv_generic_spidev.c -@@ -0,0 +1,89 @@ -+/* $Id$ -+ * $URL$ -+ * -+ * generic driver helper for displays connected via SPI bus -+ * -+ * Copyright (C) 2012 Gabor Juhos -+ * -+ * This file is part of LCD4Linux. -+ * -+ * LCD4Linux is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2, or (at your option) -+ * any later version. -+ * -+ * LCD4Linux is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ */ -+ -+#include "config.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "debug.h" -+#include "qprintf.h" -+#include "cfg.h" -+#include "drv_generic_spidev.h" -+ -+static char *generic_spidev_section = ""; -+static char *generic_spidev_driver = ""; -+static int generic_spidev_fd; -+ -+int drv_generic_spidev_open(const char *section, const char *driver) -+{ -+ char *spidev; -+ -+ udelay_init(); -+ -+ generic_spidev_section = (char *) section; -+ generic_spidev_driver = (char *) driver; -+ -+ spidev = cfg_get(generic_spidev_section, "Port", NULL); -+ -+ info("%s: initializing SPI device %s", generic_spidev_driver, spidev); -+ generic_spidev_fd = open(spidev, O_WRONLY); -+ if (generic_spidev_fd < 0) { -+ error("%s: unable to open SPI device %s!\n", generic_spidev_driver, spidev); -+ goto exit_error; -+ } -+ -+ return 0; -+ -+ exit_error: -+ free(spidev); -+ return -1; -+} -+ -+int drv_generic_spidev_close(void) -+{ -+ close(generic_spidev_fd); -+ return 0; -+} -+ -+int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr) -+{ -+ int ret; -+ -+ ret = ioctl(generic_spidev_fd, SPI_IOC_MESSAGE(count), tr); -+ if (ret < count) { -+ error("%s: can't send SPI message! (%s)\n", -+ generic_spidev_driver, strerror(errno)); -+ return -1; -+ } -+ -+ return 0; -+} ---- /dev/null -+++ b/drv_generic_spidev.h -@@ -0,0 +1,54 @@ -+/* $Id$ -+ * $URL$ -+ * -+ * generic driver helper for displays connected via SPI bus -+ * -+ * Copyright (C) 2012 Gabor Juhos -+ * Copyright (C) 2012 The LCD4Linux Team -+ * -+ * This file is part of LCD4Linux. -+ * -+ * LCD4Linux is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2, or (at your option) -+ * any later version. -+ * -+ * LCD4Linux is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ */ -+ -+/* -+ * -+ * exported fuctions: -+ * -+ * int drv_generic_spidev_open (const char *section, const char *driver) -+ * reads 'Port' entry from config and opens -+ * the SPI device -+ * returns 0 if ok, -1 on failure -+ * -+ * int drv_generic_spidev_close (void) -+ * closes SPI device -+ * returns 0 if ok, -1 on failure -+ * -+ * void drv_generic_spidev_transfer (int count, struct spi_ioc_transfer *tr) -+ * transfer data to/from the SPI device -+ * -+ */ -+ -+#ifndef _DRV_GENERIC_SPIDEV_H_ -+#define _DRV_GENERIC_SPIDEV_H_ -+ -+#include -+ -+int drv_generic_spidev_open(const char *section, const char *driver); -+int drv_generic_spidev_close(void); -+int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr); -+ -+#endif /* _DRV_GENERIC_SPIDEV_H_ */ ---- a/drivers.m4 -+++ b/drivers.m4 -@@ -301,6 +301,7 @@ PARPORT="no" - SERIAL="no" - I2C="no" - KEYPAD="no" -+SPIDEV="no" - - # generic libraries - LIBUSB="no" -@@ -936,6 +937,12 @@ if test "$LIBJPEG" = "yes"; then - DRVLIBS="$DRVLIBS -ljpeg" - fi - -+# generic spidev driver -+if test "$SPIDEV" = "yes"; then -+ DRIVERS="$DRIVERS drv_generic_spidev.o" -+ AC_DEFINE(WITH_SPIDEV, 1, [SPIDEV driver]) -+fi -+ - # libusb - if test "$LIBUSB" = "yes"; then - DRVLIBS="$DRVLIBS -lusb" ---- a/configure.ac -+++ b/configure.ac -@@ -115,6 +115,9 @@ AC_ARG_WITH(outb, - - AC_CHECK_HEADERS([asm/io.h] [linux/parport.h linux/ppdev.h], [has_parport="true"], [has_parport="false"]) - -+# check for spidev -+AC_CHECK_HEADERS([linux/spi/spidev.h], [has_spidev="true"], [has_spidev="false"]) -+ - # drivers - sinclude(drivers.m4) - diff --git a/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch b/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch deleted file mode 100755 index 97e03c748..000000000 --- a/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/drv_GLCD2USB.c -+++ b/drv_GLCD2USB.c -@@ -48,6 +48,7 @@ - #include - #include - #include -+#include - - #include "debug.h" - #include "cfg.h" -@@ -487,6 +488,9 @@ static int drv_GLCD2USB_start(const char - return -1; - } - -+ buffer.display_info.width = le16toh(buffer.display_info.width); -+ buffer.display_info.height = le16toh(buffer.display_info.height); -+ - info("%s: display name = %s", Name, buffer.display_info.name); - info("%s: display resolution = %d * %d", Name, buffer.display_info.width, buffer.display_info.height); - info("%s: display flags: %x", Name, buffer.display_info.flags); diff --git a/libell/Makefile b/libell/Makefile deleted file mode 100755 index 8b12f4b51..000000000 --- a/libell/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -# -# Copyright (C) 2020-2021 Ycarus (Yannick Chabanois) -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=ell -PKG_VERSION:=0.41 -PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_HASH:=4e8dba6c53cf152dbd0fd1dc3d4c7b04abf79e20a948895f85943e586870505c -PKG_SOURCE_URL:=@KERNEL/linux/libs/ell -PKG_LICENSE:=GPL-2.0 -PKG_LICENSE_FILES:=GPL -PKG_INSTALL:=1 -PKG_MAINTAINER:=Ycarus - -include $(INCLUDE_DIR)/package.mk - -define Package/libell - SECTION:=libs - CATEGORY:=Libraries - TITLE:=Embedded Linux library - URL:=https://git.kernel.org/pub/scm/libs/ell/ell.git -endef - -define Package/libell/description - Embeded Linux library -endef - -define Package/libell/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libell*.so* $(1)/usr/lib -endef - -define Build/InstallDev - $(INSTALL_DIR) $(1) - $(CP) $(PKG_INSTALL_DIR)/* $(1)/ -endef - -$(eval $(call BuildPackage,libell)) diff --git a/luci-app-packet-capture/Makefile b/luci-app-packet-capture/Makefile deleted file mode 100644 index ef6370df3..000000000 --- a/luci-app-packet-capture/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2020 Wojciech Jowsa (wojciech.jowsa@gmail.com) -# This is free software, licensed under the Apache License, Version 2.0 - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Packet capture application -LUCI_DEPENDS:=+luci-mod-admin-full +tcpdump +uhttpd-mod-ubus +coreutils +coreutils-timeout - -PKG_MAINTAINER:=Wojciech Jowsa -PKG_LICENSE:=Apache-2.0 - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signatureet diff --git a/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js b/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js deleted file mode 100644 index 6bf42cc3f..000000000 --- a/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js +++ /dev/null @@ -1,287 +0,0 @@ -'use strict'; -'require rpc'; -'require uci'; -'require ui'; -'require fs'; -'require form'; -'require network'; -'require tools.widgets as widgets'; - -var eventSource, - captureFilePoll, - hostName; - -function stopTcpdump() { - fs.exec("/usr/libexec/packet_capture_stop").then(function(replay) { - if (eventSource) - eventSource.close(); - }.bind(this)).catch(function(error) { - console.log(error); - }); -} - -window.addEventListener('beforeunload', stopTcpdump); - -var callLuciProcessList = rpc.declare({ - object: 'luci', - method: 'getProcessList', - expect: { result: [] } -}); - -var callInitAction = rpc.declare({ - object: 'luci', - method: 'setInitAction', - params: [ 'name', 'action' ], - expect: { result: false } -}); - -function addOutput() { - var tcpdumpOut = document.querySelectorAll('[id$="tcpdump_out"]')[0]; - if (tcpdumpOut) - return; - - var frameEl = E('div', {'class': 'cbi-value'}); - - frameEl.appendChild(E('textarea', { - 'id': 'tcpdump_out', - 'class': 'cbi-input-textarea', - 'readonly': '', - 'style': 'width:100%', - 'rows': 30, - })); - - frameEl.firstElementChild.style.fontFamily = 'monospace'; - - var downloadBtn = document.querySelectorAll('[id$="download_file"]')[0]; - if (downloadBtn) - downloadBtn.parentNode.insertBefore(frameEl, downloadBtn.nextSibling); -} - -var downloadCaptureFile = function(ev) { - var form = E('form', { - method: 'post', - action: '/cgi-bin/cgi-download', - enctype: 'application/x-www-form-urlencoded' - }, E('input', { type: 'hidden', name: 'sessionid', value: rpc.getSessionID()}, - E('input', { type: 'hidden', name: 'path', value: "/tmp/capture.pcap"}, - E('input', { type: 'hidden', name: 'filename', value: hostName + "-" + Date.now() + ".pcap"}, - E('input', { type: 'hidden', name: 'mimetype', value: 'application/vnd.tcpdump.pcap'} - ))))); - - ev.currentTarget.parentNode.appendChild(form); - form.submit(); - form.parentNode.removeChild(form); -} - -function subscribeTcpdump() { - if (eventSource) - eventSource.close(); - - eventSource = new EventSource('/ubus/subscribe/tcpdump' + '?' + rpc.getSessionID()); - eventSource.onerror = function(event) { - eventSource.close(); - console.log(event); - }; - - addOutput(); - var textOut = document.querySelectorAll('[id$="tcpdump_out"]')[0]; - textOut.value = ""; - eventSource.addEventListener("tcpdump.data", function(event) { - textOut.value = textOut.value + "\n" + JSON.parse(event.data).data; - }); -} - -function updateButtons() { - var tasks = []; - tasks.push(fs.stat("/var/run/packet_capture.pid").then(L.bind(function(res) { - var downloadBtn = document.querySelectorAll('[id$="download_file"]')[0]; - if (!downloadBtn) - return; - if (!eventSource || eventSource.readyState == 2) - subscribeTcpdump(); - var textOut = document.querySelectorAll('[id$="tcpdump_out"]')[0]; - if (textOut) - textOut.style.borderColor = "green"; - var startBtn = document.querySelectorAll('[id$="start_tcpdump"]')[0]; - if (startBtn) - startBtn.hidden = true; - var stopBtn = document.querySelectorAll('[id$="stop_tcpdump"]')[0]; - if (stopBtn) - stopBtn.hidden = false; - return; - })).catch(function(error) { - var textOut = document.querySelectorAll('[id$="tcpdump_out"]')[0]; - if (textOut) - textOut.style.borderColor = "red"; - var startBtn = document.querySelectorAll('[id$="start_tcpdump"]')[0]; - if (startBtn) - startBtn.hidden = false; - var stopBtn = document.querySelectorAll('[id$="stop_tcpdump"]')[0]; - if (stopBtn) - stopBtn.hidden = true; - if (eventSource) - eventSource.close(); - })); - - return Promise.all(tasks); -} - -function updatePollCheckCaptureFileExists() { - checkCaptureFileExists(); - L.Poll.remove(captureFilePoll); - L.Poll.add(L.bind(checkCaptureFileExists, m),5); -} - -function checkCaptureFileExists() { - var tasks = []; - tasks.push(fs.stat("/tmp/capture.pcap").then(L.bind(function(res) { - var downloadBtn = document.querySelector('[data-action="download"]'); - if (!downloadBtn) - return; - var downloadCheckBox = document.querySelectorAll('[data-widget-id$="file"]')[0].checked; - if (!downloadCheckBox) { - fs.remove("/tmp/capture.pcap").then(function(replay) { - downloadBtn.disabled = true;; - }.bind(this)).catch(function(error) { - console.log(error); - }); - } else { - downloadBtn.disabled = false; - } - })).catch(function(error) { - var downloadBtn = document.querySelector('[data-action="download"]'); - if (downloadBtn) - downloadBtn.disabled = true; - })); - - return Promise.all(tasks); -} - -return L.view.extend({ - - load: function() { - return Promise.all([ - uci.load('system') - ]); - }, - - handleDownload: function(ev) { - downloadCaptureFile(ev); - }, - - render: function(processes) { - var m, s, o; - - hostName = uci.get('system', '@system[0]', 'hostname'); - - m = new form.Map('packet_capture', _('Packet Capture - Tcpdump'), _('Capture packets with tcpdump.')); - s = m.section(form.TypedSection, 'tcpdump'); - s.anonymous = 1; - - o = s.option(widgets.DeviceSelect, 'interface', _('Interface'), _('')); - o.noaliases = true; - o.modalonly = true; - o.rmempty = false; - o.filter = function(section_id, value) { - return true; - } - - o = s.option(form.Value, 'filter', _('Filter'), _('Tcpdump filter like protocol, port etc.')); - o.modalonly = false; - o.datatype = 'and(minlength(1),maxlength(1024))'; - - o = s.option(form.Value, 'duration', _('Duration'), _('Duration of packet capturing in seconds.')); - o.modalonly = false; - o.datatype = 'range(1,4294967296)'; - - o = s.option(form.Value, 'packets', _('Packets'), _('Number of packets to be captured.')); - o.modalonly = false; - o.datatype = 'range(1,4294967296)'; - - o = s.option(form.Flag, 'domains', _('Resolve domains'), _("Convert host addresses to names.")); - - o = s.option(form.Flag, 'verbose', _('Verbose output'), _("Print the link-level header on each dump line.")); - - o = s.option(form.Flag, 'file', _('Save to file'), _("Save capture to pcap file.")); - - o = s.option(form.Button, 'start_tcpdump', _('Start tcpdump'), _('')); - o.inputstyle = 'apply'; - o.onclick = ui.createHandlerFn(this, function(section_id, ev) { - var downloadBtn = document.querySelector('[data-action="download"]'); - if (!downloadBtn) - return; - fs.remove("/tmp/capture.pcap").then(function(replay) { - downloadBtn.disabled = true;; - }.bind(this)).catch(function(error) { - console.log(error); - }); - - var iface = document.querySelectorAll('[id$="interface"]')[1].value, - filter = document.querySelectorAll('[id$="filter"]')[2].value, - packets = document.querySelectorAll('[id$="packets"]')[2].value, - duration = document.querySelectorAll('[id$="duration"]')[2].value, - verbose = document.querySelectorAll('[data-widget-id$="verbose"]')[0].checked, - domains = document.querySelectorAll('[data-widget-id$="domains"]')[0].checked, - file = document.querySelectorAll('[data-widget-id$="file"]')[0].checked - - var args = { - "interface": iface, - "filter": filter, - "packets": packets, - "duration": duration, - "verbose": verbose, - "domains": domains, - "file": file - } - - return fs.exec_direct('/usr/libexec/packet_capture_start', [JSON.stringify(args)]).then(function(replay) { - var error_position = replay.search("error:"); - if (error_position != -1){ - ui.showModal(_(replay.substring(error_position + 6, replay.length)), [ - E('div', { 'class': 'right' }, [ - E('button', { - 'class': 'cbi-button cbi-button-negative important', - 'click': function(ev) { - ui.hideModal(); - } - }, _('Close')), - ]) - ]); - return; - } - rpc.list.apply(rpc).then(function(res) { - for (var k in res) { - if (res[k] == "tcpdump" ) - subscribeTcpdump() - } - }.bind(this)); - }.bind(this)).catch(function(error) { - console.log(error); - }); - }); - - o = s.option(form.Button, 'stop_tcpdump', _('Stop tcpdump'), _('')); - o.inputstyle = 'apply'; - o.onclick = ui.createHandlerFn(this, function(section_id, ev) { - if (!eventSource) - return; - return fs.exec("/usr/libexec/packet_capture_stop").then(function(replay) { - eventSource.close(); - }.bind(this)).catch(function(error) { - console.log(error); - }); - }); - - o = s.option(form.Button, 'download_file', _('Download capture file')); - o.inputstyle = 'action important'; - o.inputtitle = _('Download'); - o.data_action = 'download' - o.onclick = this.handleDownload; - - L.Poll.add(L.bind(updateButtons, m),1); - captureFilePoll = L.bind(updatePollCheckCaptureFileExists, m); - L.Poll.add(captureFilePoll,1); - - return m.render(); - }, -}); diff --git a/luci-app-packet-capture/po/fr/packet-capture.po b/luci-app-packet-capture/po/fr/packet-capture.po deleted file mode 100644 index f2169d1f7..000000000 --- a/luci-app-packet-capture/po/fr/packet-capture.po +++ /dev/null @@ -1,99 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-03-31 15:07+0000\n" -"Last-Translator: Weblate Admin \n" -"Language-Team: French \n" -"Language: fr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5.2\n" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:177 -msgid "Capture packets with tcpdump." -msgstr "Capturez des paquets avec tcpdump." - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:247 -msgid "Close" -msgstr "Fermer" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:201 -msgid "Convert host addresses to names." -msgstr "Convertissez les adresses d'hôte en noms." - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:277 -msgid "Download" -msgstr "Téléchargement" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:275 -msgid "Download capture file" -msgstr "Télécharger le fichier de capture" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:193 -msgid "Duration" -msgstr "Durée" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:193 -msgid "Duration of packet capturing in seconds." -msgstr "Durée de la capture des paquets en secondes." - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:189 -msgid "Filter" -msgstr "Filtre" - -#: luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json:3 -msgid "Grant access to tcpdump ubus object" -msgstr "Accorder l'accès à l'objet ubus tcpdump" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:181 -msgid "Interface" -msgstr "Interface" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:197 -msgid "Number of packets to be captured." -msgstr "Nombre de paquets à capturer." - -#: luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json:3 -msgid "Packet Capture" -msgstr "Capture de paquets" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:177 -msgid "Packet Capture - Tcpdump" -msgstr "Capture de paquets - Tcpdump" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:197 -msgid "Packets" -msgstr "Paquets" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:203 -msgid "Print the link-level header on each dump line." -msgstr "Imprimez l'en-tête du lien sur chaque ligne de capture." - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:201 -msgid "Resolve domains" -msgstr "Résoudre les domaines" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:205 -msgid "Save capture to pcap file." -msgstr "Enregistrez la capture dans le fichier pcap." - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:205 -msgid "Save to file" -msgstr "Enregistrer dans un fichier" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:207 -msgid "Start tcpdump" -msgstr "Démarrez tcpdump" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:263 -msgid "Stop tcpdump" -msgstr "Arrêter tcpdump" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:189 -msgid "Tcpdump filter like protocol, port etc." -msgstr "Filtre pour tcpdump comme le protocole, le port, etc." - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:203 -msgid "Verbose output" -msgstr "Sortie verbeuse" diff --git a/luci-app-packet-capture/po/templates/packet-capture.pot b/luci-app-packet-capture/po/templates/packet-capture.pot deleted file mode 100644 index 4a2659477..000000000 --- a/luci-app-packet-capture/po/templates/packet-capture.pot +++ /dev/null @@ -1,90 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:177 -msgid "Capture packets with tcpdump." -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:247 -msgid "Close" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:201 -msgid "Convert host addresses to names." -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:277 -msgid "Download" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:275 -msgid "Download capture file" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:193 -msgid "Duration" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:193 -msgid "Duration of packet capturing in seconds." -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:189 -msgid "Filter" -msgstr "" - -#: luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json:3 -msgid "Grant access to tcpdump ubus object" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:181 -msgid "Interface" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:197 -msgid "Number of packets to be captured." -msgstr "" - -#: luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json:3 -msgid "Packet Capture" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:177 -msgid "Packet Capture - Tcpdump" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:197 -msgid "Packets" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:203 -msgid "Print the link-level header on each dump line." -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:201 -msgid "Resolve domains" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:205 -msgid "Save capture to pcap file." -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:205 -msgid "Save to file" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:207 -msgid "Start tcpdump" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:263 -msgid "Stop tcpdump" -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:189 -msgid "Tcpdump filter like protocol, port etc." -msgstr "" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:203 -msgid "Verbose output" -msgstr "" diff --git a/luci-app-packet-capture/po/zh_Hans/packet-capture.po b/luci-app-packet-capture/po/zh_Hans/packet-capture.po deleted file mode 100644 index c8704a7f9..000000000 --- a/luci-app-packet-capture/po/zh_Hans/packet-capture.po +++ /dev/null @@ -1,99 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-04-30 16:03+0000\n" -"Last-Translator: niergouge <1150108426@qq.com>\n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.2\n" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:177 -msgid "Capture packets with tcpdump." -msgstr "使用tcpdump捕获数据包。" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:247 -msgid "Close" -msgstr "关闭" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:201 -msgid "Convert host addresses to names." -msgstr "将主机地址转换为名称。" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:277 -msgid "Download" -msgstr "下载" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:275 -msgid "Download capture file" -msgstr "下载抓包文件" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:193 -msgid "Duration" -msgstr "持续时间" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:193 -msgid "Duration of packet capturing in seconds." -msgstr "抓包时间(以秒为单位)。" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:189 -msgid "Filter" -msgstr "过滤器" - -#: luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json:3 -msgid "Grant access to tcpdump ubus object" -msgstr "授权访问tcpdump ubus对象" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:181 -msgid "Interface" -msgstr "接口" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:197 -msgid "Number of packets to be captured." -msgstr "需要抓包的个数。" - -#: luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json:3 -msgid "Packet Capture" -msgstr "数据包捕获" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:177 -msgid "Packet Capture - Tcpdump" -msgstr "Tcpdump抓包" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:197 -msgid "Packets" -msgstr "包" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:203 -msgid "Print the link-level header on each dump line." -msgstr "打印每个转储行上的链接标题。" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:201 -msgid "Resolve domains" -msgstr "解决域" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:205 -msgid "Save capture to pcap file." -msgstr "保存捕获到pcap文件。" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:205 -msgid "Save to file" -msgstr "保存到文件" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:207 -msgid "Start tcpdump" -msgstr "开始tcp转存" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:263 -msgid "Stop tcpdump" -msgstr "停止tcp转存" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:189 -msgid "Tcpdump filter like protocol, port etc." -msgstr "Tcp转存过滤协议,端口等。" - -#: luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js:203 -msgid "Verbose output" -msgstr "详细输出" diff --git a/luci-app-packet-capture/root/etc/config/packet_capture b/luci-app-packet-capture/root/etc/config/packet_capture deleted file mode 100644 index 105a0dc30..000000000 --- a/luci-app-packet-capture/root/etc/config/packet_capture +++ /dev/null @@ -1 +0,0 @@ -config tcpdump \ No newline at end of file diff --git a/luci-app-packet-capture/root/usr/libexec/packet_capture b/luci-app-packet-capture/root/usr/libexec/packet_capture deleted file mode 100755 index e1ecf23f7..000000000 --- a/luci-app-packet-capture/root/usr/libexec/packet_capture +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env lua - -local ubus = require "ubus" -local fs = require "nixio.fs" - -local conn = ubus.connect() -if not conn then - error("Failed to connect to ubus") - return -end - -local args = "-n" -local duration = "" - -if arg[1] ~= nil then - args = arg[1] - if arg[2] ~= "" then - duration = arg[2] - end -end - -local filter = fs.stat("/tmp/tcpdump_filter") -if filter then - args = args .. " -F /tmp/tcpdump_filter" -end - -local ubus_objects = { - tcpdump = { - } -} - -conn:add( ubus_objects ) - -os.execute("sleep 1") - -local command = "tcpdump -l " .. args .. " 2>&1" - -if duration ~= "" then - command = "timeout " .. duration .. " " .. command -end - -local pipe = io.popen(command) - -for line in pipe:lines() do - local params = { - data = line - } - conn:notify(ubus_objects.tcpdump.__ubusobj, "tcpdump.data", params) -end - -local pcap = fs.stat("/tmp/capture.pcap0") -if pcap then - fs.move("/tmp/capture.pcap0","/tmp/capture.pcap") - fs.remove("/tmp/capture.pcap1") -end - -if filter then - fs.remove("/tmp/tcpdump_filter") -end - -conn:close() -pipe:close() - -fs.remove("/var/run/packet_capture.pid") diff --git a/luci-app-packet-capture/root/usr/libexec/packet_capture_start b/luci-app-packet-capture/root/usr/libexec/packet_capture_start deleted file mode 100755 index acdf89152..000000000 --- a/luci-app-packet-capture/root/usr/libexec/packet_capture_start +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -. /usr/share/libubox/jshn.sh - -PIDFILE="/var/run/packet_capture.pid" - -if [ -f "$PIDFILE"];then - echo "error: Packet capture is running" - exit 1 -fi - -json_load "$1" -json_get_var interface interface -json_get_var filter filter -json_get_var duration duration -json_get_var packets packets -json_get_var verbose verbose -json_get_var domains domains -json_get_var file file - -args="-n" - -if [ "$domains" == "1" ];then - args="" -fi - -if [ -n "$interface" ];then - ip a show "$interface" > /dev/null 2>&1 - if [ "$?" == "1" ]; then - echo "error: Incorrect format of an interface" - exit 1 - fi - - args="$args -i $interface" -fi - -if [ -n "$packets" ];then - echo "$packets" | egrep '^[0-9]*$' - if [ "$?" -eq 0 ];then - args="$args -c $packets" - else - echo "error: Incorrect packets argument" - exit 1 - fi -fi - -if [ "$verbose" == "1" ];then - args="$args -e" -fi - -if [ "$file" == "1" ];then - mem=$(awk '/MemTotal/ {print $2}' /proc/meminfo) - args="$args -W 2 -C $((mem/(1024 * 10))) -w /tmp/capture.pcap -z /usr/libexec/packet_capture_stop" -fi - -if [ -n "$filter" ];then - tcpdump -i lo -d "$filter" >/dev/null 2>/dev/null - if [ $? -eq 1 ];then - echo "error: Incorrect filter argument" - exit 1 - fi - echo "$filter" > /tmp/tcpdump_filter -fi - -(/usr/libexec/packet_capture "$args" "$duration")& - -echo $! > /var/run/packet_capture.pid - -exit 0 diff --git a/luci-app-packet-capture/root/usr/libexec/packet_capture_stop b/luci-app-packet-capture/root/usr/libexec/packet_capture_stop deleted file mode 100755 index bce650346..000000000 --- a/luci-app-packet-capture/root/usr/libexec/packet_capture_stop +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -pid=$(cat /var/run/packet_capture.pid) -if [ -n "$pid" ] && grep -sq packet_capture "/proc/$pid/cmdline"; then - ppid=$(pgrep -P $pid) - kill -TERM $ppid -fi - -exit 0 diff --git a/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json deleted file mode 100644 index 304fe5431..000000000 --- a/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "admin/services/packet_capture": { - "title": "Packet Capture", - "order": 90, - "action": { - "type": "view", - "path": "packet_capture/tcpdump" - }, - "depends" : { - "acl": [ "luci-app-packet-capture" ], - "uci": { "packet_capture": true }, - "fs": { "/usr/libexec/packet_capture": "executable", - "/usr/libexec/packet_capture_start": "executable", - "/usr/libexec/packet_capture_stop": "executable" - } - } - } -} diff --git a/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json deleted file mode 100644 index f59d4060b..000000000 --- a/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "luci-app-packet-capture": { - "description": "Grant access to tcpdump ubus object", - "read": { - "cgi-io": [ "download", "exec" ], - "ubus": { - "tcpdump": [ "*" ], - "luci": [ "getProcessList" ] - }, - "uci": [ "packet_capture", "system" ], - "file": { - "/tmp/capture.pcap": [ "read" ] - } - }, - "write": { - "uci": [ "packet_capture" ], - "file": { - "/usr/libexec/packet_capture_start": [ "exec" ], - "/usr/libexec/packet_capture_stop": [ "exec" ], - "/usr/libexec/packet_capture": [ "exec" ], - "/tmp/capture.pcap": [ "write" ] - } - } - } -} diff --git a/luci-app-sysupgrade/Makefile b/luci-app-sysupgrade/Makefile deleted file mode 100644 index 3b5ccc6dc..000000000 --- a/luci-app-sysupgrade/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# See /LICENSE for more information. -# This is free software, licensed under the GNU General Public License v2. - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI support for sysupgrades -LUCI_DEPENDS:=+luci-base +uhttpd-mod-ubus +rpcd +rpcd-mod-rpcsys +cgi-io - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-app-sysupgrade/luasrc/view/sysupgrade.htm b/luci-app-sysupgrade/luasrc/view/sysupgrade.htm deleted file mode 100644 index a7706bc79..000000000 --- a/luci-app-sysupgrade/luasrc/view/sysupgrade.htm +++ /dev/null @@ -1,126 +0,0 @@ -<% --- all lua code provided by https://github.com/jow-/ --- thank you very much! - - function apply_acls(filename, session) - local json = require "luci.jsonc" - local util = require "luci.util" - local fs = require "nixio.fs" - - local grants = { } - - local acl = json.parse(fs.readfile(filename)) - if type(acl) ~= "table" then - return - end - - local group, perms - for group, perms in pairs(acl) do - local perm, scopes - for perm, scopes in pairs(perms) do - if type(scopes) == "table" then - local scope, objects - for scope, objects in pairs(scopes) do - if type(objects) == "table" then - if not grants[scope] then - grants[scope] = { } - end - - if next(objects) == 1 then - local _, object - for _, object in ipairs(objects) do - if not grants[scope][object] then - grants[scope][object] = { } - end - table.insert(grants[scope][object], perm) - end - else - local object, funcs - for object, funcs in pairs(objects) do - if type(funcs) == "table" then - local _, func - for _, func in ipairs(funcs) do - if not grants[scope][object] then - grants[scope][object] = { } - end - table.insert(grants[scope][object], func) - end - end - end - end - end - end - end - end - end - - local _, scope, object, func - for scope, _ in pairs(grants) do - local objects = { } - for object, _ in pairs(_) do - for _, func in ipairs(_) do - table.insert(objects, { object, func }) - end - end - - util.ubus("session", "grant", { - ubus_rpc_session = session, - scope = scope, objects = objects - }) - end - end - - apply_acls("/usr/share/rpcd/acl.d/sysupgrade.json", luci.dispatcher.context.authsession) -%> -<%+header%> -

<%:Sysupgrade%>

-
- <%:Easily search and install new releases and package upgrades.%> -
- - -

- -

-
-
-
- - - - -
-
- -
-
-
-
-
- - -<%+footer%> diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po b/luci-app-sysupgrade/po/fr/sysupgrade.po deleted file mode 100644 index 8195816c5..000000000 --- a/luci-app-sysupgrade/po/fr/sysupgrade.po +++ /dev/null @@ -1,97 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-03-31 15:07+0000\n" -"Last-Translator: Weblate Admin \n" -"Language-Team: French \n" -"Language: fr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5.2\n" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:90 -msgid "Check \"Keep settings\" to retain the current configuration." -msgstr "" -"Cochez \"Conserver les paramètres\" pour conserver la configuration actuelle." - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:344 -msgid "Downloading firmware to web browser memory" -msgstr "Téléchargement du micrologiciel dans la mémoire du navigateur Web" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:78 -msgid "Easily search and install new releases and package upgrades." -msgstr "" -"Recherchez et installez facilement les nouvelles versions et les mises à " -"niveau des paquets." - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:99 -msgid "Edit installed packages" -msgstr "Modifier les packages installés" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:269 -msgid "Flashing firmware. Don't unpower device" -msgstr "Mise à jour du micrologiciel. Ne débranchez pas l'appareil" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:192 -msgid "Installed version:" -msgstr "Version installée :" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:92 -msgid "Keep settings:" -msgstr "Conserver les paramètres :" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:215 -msgid "No upgrades available" -msgstr "Pas de mise à jour disponible" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:285 -msgid "Rebooting device - please wait!" -msgstr "Redémarrage de l'appareil - veuillez patienter !" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:209 -msgid "Request firmware" -msgstr "Demander le micrologiciel" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:113 -msgid "Search for upgrades" -msgstr "Rechercher des mises à jour" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:165 -msgid "Searching for upgrades" -msgstr "Recherche des mises à jour" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:104 -msgid "Server:" -msgstr "Serveur :" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:289 -msgid "Success! Please reload web interface" -msgstr "Succès ! Veuillez recharger l'interface Web" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76 -#: luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json:3 -msgid "Sysupgrade" -msgstr "Mise à jour système" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:320 -msgid "Upload of firmware failed, please retry by reloading web interface" -msgstr "" -"Le téléchargement du micrologiciel a échoué, veuillez réessayer en " -"rechargeant l'interface Web" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:305 -msgid "Uploading firmware to device" -msgstr "Téléchargement du micrologiciel sur l'appareil" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:299 -msgid "" -"Web interface could not reconnect to your device. Please reload web " -"interface or check device manually" -msgstr "" -"L'interface Web n'a pas pu se reconnecter à votre appareil. Recharger " -"l'interface" - -#: luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json:3 -msgid "sysupgrade via rpcd and luci" -msgstr "Mise à jour système via rpcd et luci" diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po~ b/luci-app-sysupgrade/po/fr/sysupgrade.po~ deleted file mode 100644 index 45f8c0ba5..000000000 --- a/luci-app-sysupgrade/po/fr/sysupgrade.po~ +++ /dev/null @@ -1,97 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-03-31 15:07+0000\n" -"Last-Translator: Weblate Admin \n" -"Language-Team: French \n" -"Language: fr\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5.2\n" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:90 -msgid "Check \"Keep settings\" to retain the current configuration." -msgstr "" -"Cochez \"Conserver les paramètres\" pour conserver la configuration actuelle." - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:344 -msgid "Downloading firmware to web browser memory" -msgstr "Téléchargement du micrologiciel dans la mémoire du navigateur Web" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:78 -msgid "Easily search and install new releases and package upgrades." -msgstr "" -"Recherchez et installez facilement les nouvelles versions et les mises à " -"niveau des paquets." - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:99 -msgid "Edit installed packages" -msgstr "Modifier les packages installés" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:269 -msgid "Flashing firmware. Don't unpower device" -msgstr "Mise à jour du micrologiciel. Ne débranchez pas l'appareil" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:192 -msgid "Installed version:" -msgstr "Version installée :" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:92 -msgid "Keep settings:" -msgstr "Conserver les paramètres :" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:215 -msgid "No upgrades available" -msgstr "Pas de mise à jour disponible" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:285 -msgid "Rebooting device - please wait!" -msgstr "Redémarrage de l'appareil - veuillez patienter !" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:209 -msgid "Request firmware" -msgstr "Demander le micrologiciel" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:110 -msgid "Search for upgrades" -msgstr "Rechercher des mises à jour" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:165 -msgid "Searching for upgrades" -msgstr "Recherche des mises à jour" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:103 -msgid "Server:" -msgstr "Serveur :" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:289 -msgid "Success! Please reload web interface" -msgstr "Succès ! Veuillez recharger l'interface Web" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76 -#: luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json:3 -msgid "Sysupgrade" -msgstr "Mise à jour système" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:320 -msgid "Upload of firmware failed, please retry by reloading web interface" -msgstr "" -"Le téléchargement du micrologiciel a échoué, veuillez réessayer en " -"rechargeant l'interface Web" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:305 -msgid "Uploading firmware to device" -msgstr "Téléchargement du micrologiciel sur l'appareil" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:299 -msgid "" -"Web interface could not reconnect to your device. Please reload web " -"interface or check device manually" -msgstr "" -"L'interface Web n'a pas pu se reconnecter à votre appareil. Recharger " -"l'interface" - -#: luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json:3 -msgid "sysupgrade via rpcd and luci" -msgstr "Mise à jour système via rpcd et luci" diff --git a/luci-app-sysupgrade/po/ru/sysupgrade.po b/luci-app-sysupgrade/po/ru/sysupgrade.po deleted file mode 100644 index 742b59652..000000000 --- a/luci-app-sysupgrade/po/ru/sysupgrade.po +++ /dev/null @@ -1,94 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-06-16 10:51+0000\n" -"Last-Translator: Dmitry Galenko \n" -"Language-Team: Russian \n" -"Language: ru\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.6.1\n" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:90 -msgid "Check \"Keep settings\" to retain the current configuration." -msgstr "" -"Поставьте \"Сохранить настройки\", чтобы сохранить текущую конфигурацию." - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:344 -msgid "Downloading firmware to web browser memory" -msgstr "Загружаем ПО в память вашего браузера" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:78 -msgid "Easily search and install new releases and package upgrades." -msgstr "Легко ищите и устанавливайте новые версии ПО и обновления пакетов." - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:99 -msgid "Edit installed packages" -msgstr "Редактировать список установленных пакетов" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:269 -msgid "Flashing firmware. Don't unpower device" -msgstr "Обновляем ПО маршрутизатора. Не выключайте питание вашего устройства" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:192 -msgid "Installed version:" -msgstr "Установленная версия:" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:92 -msgid "Keep settings:" -msgstr "Сохранить настройки:" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:215 -msgid "No upgrades available" -msgstr "Обновления не найдены" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:285 -msgid "Rebooting device - please wait!" -msgstr "Перезагружаем роутер, пожалуйста подождите!" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:209 -msgid "Request firmware" -msgstr "Загрузить ПО" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:113 -msgid "Search for upgrades" -msgstr "Поиск обновлений" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:165 -msgid "Searching for upgrades" -msgstr "Поиск обновлений" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:104 -msgid "Server:" -msgstr "Сервер:" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:289 -msgid "Success! Please reload web interface" -msgstr "Успешно! Пожалуйста обновите страницу" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76 -#: luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json:3 -msgid "Sysupgrade" -msgstr "sysupgrade" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:320 -msgid "Upload of firmware failed, please retry by reloading web interface" -msgstr "" -"Ошибка при загрузке обновлений ПО. Для продолжения, пожалуйста обновите " -"страницу" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:305 -msgid "Uploading firmware to device" -msgstr "Загружаем обновления ПО в память роутера" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:299 -msgid "" -"Web interface could not reconnect to your device. Please reload web " -"interface or check device manually" -msgstr "Проблема при подключении к роутеру. Пожалуйста обновите страницу" - -#: luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json:3 -msgid "sysupgrade via rpcd and luci" -msgstr "sysupgrade с использованием RPCd и LUCI" diff --git a/luci-app-sysupgrade/po/templates/sysupgrade.pot b/luci-app-sysupgrade/po/templates/sysupgrade.pot deleted file mode 100644 index 1ebb8dc2e..000000000 --- a/luci-app-sysupgrade/po/templates/sysupgrade.pot +++ /dev/null @@ -1,81 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:90 -msgid "Check \"Keep settings\" to retain the current configuration." -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:344 -msgid "Downloading firmware to web browser memory" -msgstr "" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:78 -msgid "Easily search and install new releases and package upgrades." -msgstr "" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:99 -msgid "Edit installed packages" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:269 -msgid "Flashing firmware. Don't unpower device" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:192 -msgid "Installed version:" -msgstr "" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:92 -msgid "Keep settings:" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:215 -msgid "No upgrades available" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:285 -msgid "Rebooting device - please wait!" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:209 -msgid "Request firmware" -msgstr "" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:113 -msgid "Search for upgrades" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:165 -msgid "Searching for upgrades" -msgstr "" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:104 -msgid "Server:" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:289 -msgid "Success! Please reload web interface" -msgstr "" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76 -#: luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json:3 -msgid "Sysupgrade" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:320 -msgid "Upload of firmware failed, please retry by reloading web interface" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:305 -msgid "Uploading firmware to device" -msgstr "" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:299 -msgid "" -"Web interface could not reconnect to your device. Please reload web " -"interface or check device manually" -msgstr "" - -#: luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json:3 -msgid "sysupgrade via rpcd and luci" -msgstr "" diff --git a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po b/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po deleted file mode 100644 index e68dec985..000000000 --- a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po +++ /dev/null @@ -1,90 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-05-03 07:27+0000\n" -"Last-Translator: niergouge <1150108426@qq.com>\n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.2\n" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:90 -msgid "Check \"Keep settings\" to retain the current configuration." -msgstr "勾选保持当前配置。" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:344 -msgid "Downloading firmware to web browser memory" -msgstr "下载固件到网页浏览器内存" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:78 -msgid "Easily search and install new releases and package upgrades." -msgstr "轻松搜索和安装新版本升级固件包。" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:99 -msgid "Edit installed packages" -msgstr "编辑安装包" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:269 -msgid "Flashing firmware. Don't unpower device" -msgstr "设备升级中。请不要断开电源" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:192 -msgid "Installed version:" -msgstr "安装的版本:" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:92 -msgid "Keep settings:" -msgstr "保持设置:" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:215 -msgid "No upgrades available" -msgstr "没有升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:285 -msgid "Rebooting device - please wait!" -msgstr "正在重启设备-请稍候!" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:209 -msgid "Request firmware" -msgstr "请求固件" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:113 -msgid "Search for upgrades" -msgstr "搜索升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:165 -msgid "Searching for upgrades" -msgstr "搜索升级" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:104 -msgid "Server:" -msgstr "服务器:" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:289 -msgid "Success! Please reload web interface" -msgstr "成功!请重新加载web界面" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76 -#: luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json:3 -msgid "Sysupgrade" -msgstr "系统升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:320 -msgid "Upload of firmware failed, please retry by reloading web interface" -msgstr "轻松搜索和安装新版本的系统进行升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:305 -msgid "Uploading firmware to device" -msgstr "上传固件到设备" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:299 -msgid "" -"Web interface could not reconnect to your device. Please reload web " -"interface or check device manually" -msgstr "网络界面无法重新连接到您的设备。请重新加载web界面或手动检查设备" - -#: luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json:3 -msgid "sysupgrade via rpcd and luci" -msgstr "通过RPCD和luci进行升级" diff --git a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ b/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ deleted file mode 100644 index 85f483866..000000000 --- a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ +++ /dev/null @@ -1,90 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-04-30 16:03+0000\n" -"Last-Translator: niergouge <1150108426@qq.com>\n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.2\n" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:90 -msgid "Check \"Keep settings\" to retain the current configuration." -msgstr "勾选保持当前配置。" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:344 -msgid "Downloading firmware to web browser memory" -msgstr "下载固件到网页浏览器内存" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:78 -msgid "Easily search and install new releases and package upgrades." -msgstr "轻松搜索和安装新版本和包升级。" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:99 -msgid "Edit installed packages" -msgstr "编辑安装包" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:269 -msgid "Flashing firmware. Don't unpower device" -msgstr "设备升级中。请不要断开电源" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:192 -msgid "Installed version:" -msgstr "安装的版本:" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:92 -msgid "Keep settings:" -msgstr "保持设置:" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:215 -msgid "No upgrades available" -msgstr "没有升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:285 -msgid "Rebooting device - please wait!" -msgstr "正在重启设备-请稍候!" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:209 -msgid "Request firmware" -msgstr "请求固件" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:110 -msgid "Search for upgrades" -msgstr "搜索升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:165 -msgid "Searching for upgrades" -msgstr "搜索升级" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:103 -msgid "Server:" -msgstr "服务器:" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:289 -msgid "Success! Please reload web interface" -msgstr "成功!请重新加载web界面" - -#: luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76 -#: luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json:3 -msgid "Sysupgrade" -msgstr "系统升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:320 -msgid "Upload of firmware failed, please retry by reloading web interface" -msgstr "轻松搜索和安装新版本的系统进行升级" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:305 -msgid "Uploading firmware to device" -msgstr "上传固件到设备" - -#: luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js:299 -msgid "" -"Web interface could not reconnect to your device. Please reload web " -"interface or check device manually" -msgstr "网络界面无法重新连接到您的设备。请重新加载web界面或手动检查设备" - -#: luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json:3 -msgid "sysupgrade via rpcd and luci" -msgstr "通过RPCD和luci进行升级" diff --git a/luci-app-sysupgrade/root/etc/init.d/sysupgrade b/luci-app-sysupgrade/root/etc/init.d/sysupgrade deleted file mode 100755 index 9ffc3c537..000000000 --- a/luci-app-sysupgrade/root/etc/init.d/sysupgrade +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2020-2021 Ycarus (Yannick Chabanois) -# Released under GPL 3. See LICENSE for the full terms. - -{ - START=99 - STOP=10 - USE_PROCD=1 -} - -start_service() -{ - if [ -f /etc/backup/installed_packages.txt ]; then - if [ "$(opkg -V0 update 2>&1)" = "" ]; then - grep "\toverlay" /etc/backup/installed_packages.txt | cut -f1 | xargs -r opkg -V0 install - rm /etc/backup/installed_packages.txt - fi - fi -} - diff --git a/luci-app-sysupgrade/root/etc/uci-defaults/40_luci-sysupgrade b/luci-app-sysupgrade/root/etc/uci-defaults/40_luci-sysupgrade deleted file mode 100755 index a5ef66fe8..000000000 --- a/luci-app-sysupgrade/root/etc/uci-defaults/40_luci-sysupgrade +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -/etc/init.d/uhttpd restart -/etc/init.d/rpcd reload - -[ -e /etc/config/sysupgrade ] && return 0 - -touch /etc/config/sysupgrade - -uci -q batch < - ubus_call("uci", "get", option, option["option"]) -} - -ubus_counter = 0; -ubus_closed = 0; - -function ubus_call(command, argument, params, variable) { - var request_data = {}; - request_data.jsonrpc = "2.0"; - request_data.id = ubus_counter; - request_data.method = "call"; - request_data.params = [data.ubus_rpc_session, command, argument, params] - var request_json = JSON.stringify(request_data) - ubus_counter++; - var request = new XMLHttpRequest(); - request.open("POST", ubus_url, true); - request.setRequestHeader("Content-type", "application/json"); - request.onload = function(event) { - if (request.status === 200) { - var response = JSON.parse(request.responseText) - if (!("error" in response) && "result" in response) { - if (response.result.length === 2) { - if (command === "uci") { - data[variable] = response.result[1].value - } else { - data[variable] = response.result[1][variable] - } - } - } else { - set_status("danger", "Ubus call failed:
Request: " + request_json + "
Response: " + JSON.stringify(response)) - } - ubus_closed++; - } - } - request.send(request_json); -} - -function set_status(type, message, loading, show_log) { - $("#status_box").className = "alert-message " + type; - var loading_image = ''; - if (loading) { - loading_image = 'Loading '; - } - if (data.buildlog_url && show_log) { - message += '

Build log

' - } - $("#status_box").innerHTML = loading_image + message; - show("#status_box") -} - -function upgrade_check() { - var current_version = data.release.version.toLowerCase(); - var current_branch = current_version.split('-')[0].split('.').slice(0, 2).join('.') - var candidates = [] - hide("#status_box"); - hide("#server_div"); - set_status("info", _("Searching for upgrades"), true); - fetch(data.url + "/api/versions?v=" + Date.now()) - .then(response => response.json()) - .then(response => { - var branches = response["branches"] - for (i in branches) { - // handle snapshots in a special way - as always - if (current_version == "snapshot" && branches[i]["latest"] == "snapshot") { - candidates.unshift(branches[i]) - break - } - - if (current_version == branches[i]["latest"]) { - break - } - if (current_branch != branches[i]["name"]) { - branches[i]["warn_branch_jump"] = true - } - candidates.unshift(branches[i]) - if (current_branch == branches[i]["name"]) { - // don't offer branches older than the current - break - } - } - - if (candidates.length > 0) { - var info_output = "

New release " + candidates[0].latest + " available

" - info_output += _('Installed version:') + " " + data.release.version - - // tell server the currently installed version - request_dict.current_version = request_dict.version; - // tell server what version to install - request_dict.version = candidates[0].latest; - // tell server to diff the requested packages with the default packages - // this allows to not automatically re-install default packages which - // where dropped in later releases - request_dict.diff_packages = true; - - set_status("success", info_output) - - if (data.advanced_mode == 1) { - show("#edit_button"); - } - var upgrade_button = $("#upgrade_button") - upgrade_button.value = _("Request firmware"); - upgrade_button.style.display = "block"; - upgrade_button.disabled = false; - upgrade_button.onclick = upgrade_request; - - } else { - set_status("success", _("No upgrades available")) - - } - }); - -} - -function upgrade_request() { - // Request firmware using the following parameters - // distro, version, target, board_name, packages - $("#upgrade_button").disabled = true; - hide("#edit_packages"); - hide("#edit_button"); - hide("#keep_container"); - - // add board info to let server determine profile - request_dict.target = data.release.target - request_dict.profile = data.board_name - request_dict.rootfs = data.format - request_dict.efi = data.efi_enabled - - if (data.edit_packages == true) { - request_dict.packages = $("#edit_packages").value.split("\n") - } else { - request_dict.packages = Object.keys(data.packages); - } - server_request() -} - -function upgrade_request_callback(response) { - var sysupgrade_file = ""; - console.log(response) - for (i in response.images) { - if (response.images[i].type == "sysupgrade") { - sysupgrade_file = response.images[i].name; - } - } - if (sysupgrade_file != "") { - data.sysupgrade_url = data.url + '/release/' + response.bin_dir + '/' + sysupgrade_file - var info_output = '

Firmware searched

File: ' + sysupgrade_file + '

' - set_status("success", info_output, false, true); - - show("#keep_container"); - var upgrade_button = $("#upgrade_button") - upgrade_button.disabled = false; - upgrade_button.style.display = "block"; - upgrade_button.value = "Flash firmware"; - upgrade_button.onclick = download_image; - } else { - set_status("danger", "Device not sysupgrade compatible!") - } -} - -function flash_image() { - // Flash image via rpc-sys upgrade_start - set_status("warning", _("Flashing firmware. Don't unpower device"), true) - ubus_call("rpc-sys", "upgrade_start", { - "keep": $("#keep").checked - }, 'message'); - ping_max = 3600; // in seconds - setTimeout(ping_ubus, 10000) -} - -function ping_ubus() { - // Tries to connect to ubus. If the connection fails the device is likely still rebooting. - // If more time than ping_max passes update may failed - if (ping_max > 0) { - ping_max--; - var request = new XMLHttpRequest(); - request.open("GET", ubus_url, true); - request.addEventListener('error', function(event) { - set_status("warning", _("Rebooting device - please wait!"), true); - setTimeout(ping_ubus, 5000) - }); - request.addEventListener('load', function(event) { - set_status("success", _("Success! Please reload web interface")); - $("#upgrade_button").value = "Reload page"; - show("#upgrade_button"); - $("#upgrade_button").disabled = false; - $("#upgrade_button").onclick = function() { - location.reload(); - } - }); - request.send(); - } else { - set_status("danger", _("Web interface could not reconnect to your device. Please reload web interface or check device manually")) - } -} - -function upload_image(blob) { - // Uploads received blob data to the server using cgi-io - set_status("info", _("Uploading firmware to device"), true); - var request = new XMLHttpRequest(); - var form_data = new FormData(); - - form_data.append("sessionid", data.ubus_rpc_session) - form_data.append("filename", "/tmp/firmware.bin") - form_data.append("filemode", 755) // insecure? - form_data.append("filedata", blob) - - request.addEventListener('load', function(event) { - request_json = JSON.parse(request.responseText) - flash_image(); - }); - - request.addEventListener('error', function(event) { - set_status("danger", _("Upload of firmware failed, please retry by reloading web interface")) - }); - - request.open('POST', origin + '/cgi-bin/cgi-upload'); - request.send(form_data); -} - - -function download_image() { - // Download image from server once the url was received by upgrade_request - hide("#keep_container"); - hide("#upgrade_button"); - var download_request = new XMLHttpRequest(); - download_request.open("GET", data.sysupgrade_url); - download_request.responseType = "arraybuffer"; - - download_request.onload = function() { - if (this.status === 200) { - var blob = new Blob([download_request.response], { - type: "application/octet-stream" - }); - upload_image(blob) - } - }; - set_status("info", _("Downloading firmware to web browser memory"), true); - download_request.send(); -} - -function server_request() { - fetch(data.url + "/api/build?v=" + Date.now(), { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(request_dict) - }) - .then(response => { - switch (response.status) { - case 200: - response.json() - .then(response => { - upgrade_request_callback(response) - }); - break; - case 202: - set_status("info", "Processing request", true); - setTimeout(function() { - server_request() - }, 5000) - break; - case 400: // bad request - case 422: // bad package - case 500: // build failed - console.log('error (' + response.status + ')'); - response.json() - .then(response => { - if (response.buildlog) { - data.buildlog_url = data.url + '/' + response.bin_dir + '/buildlog.txt'; - } - set_status("danger", response.message); - }); - break; - } - }); -} - -request_dict = {} -document.onload = setup() diff --git a/luci-mod-dashboard/Makefile b/luci-mod-dashboard/Makefile deleted file mode 100644 index 4a9aec96f..000000000 --- a/luci-mod-dashboard/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright 2019-2020 ZHANG Zhao -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=LuCI Dashboard Pages -LUCI_DEPENDS:=+luci-base +libiwinfo - -PKG_BUILD_DEPENDS:=iwinfo -PKG_LICENSE:=Apache-2.0 - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature - diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css deleted file mode 100644 index 66dd81f79..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Dashboard Principals Styles -**/ - -.Dashboard { - color: #212529!important; -} - -.Dashboard h3 { - color:#000; -} - -.Dashboard hr { - border: 0; - height: 0; - overflow: visible; - margin: 0; - box-sizing: content-box; - border-top: 1px solid rgba(0,0,0,.1); -} - -.Dashboard .box-s1 { - min-height: 466px; -} - -.Dashboard .internet-status-self .internet-status-info .title { - height: 97px; -} - -.Dashboard .dashboard-bg { - border-radius: 16px; - background-color: #e0e0e0; -} - -.Dashboard .title { - text-align: center; -} - -.Dashboard .section-content { - display: flex; - vertical-align: top; - padding: 20px 0 0 0; - align-items: flex-start; - justify-content: space-between; -} - -.Dashboard .section-content > div { - width:100%; - padding:1.5em; -} - -.Dashboard .section-content .settings-info { - padding-top:1em; -} - -.Dashboard .section-content .internet-status-info .settings-info { - display: flex; - justify-content: space-around; -} - -.Dashboard .section-content .internet-status-info .settings-info > div > p > i{ - padding: 0 0 0 5px; -} - -.Dashboard .section-content > div:nth-child(2) { - margin-left:20px; -} - -.Dashboard .devices-list .devices-info { - margin-bottom: 0; -} - -.Dashboard .devices-list .devices-info .tr .td{ - padding:0px 0 0 10px; -} - -.Dashboard .devices-list .devices-info .tr .td:first-child { - width: 33%; - word-break: break-all; -} - -.Dashboard .devices-list hr:nth-child(4) { - margin-top: 0; - margin-bottom: 8px; -} - -.Dashboard .router-status-lan .devices-list .table-titles .th:first-child { - width: 35%; -} - -.Dashboard .router-status-self .router-status-info .settings-info { - padding-left:27px; -} - -.Dashboard .router-status-self .router-status-info .title h3 { - margin-top:-2px; -} - -.Dashboard .router-status-info svg { - width: 70px; -} - -.Dashboard .internet-status-self .settings-info p:first-child span:first-child{ - font-size: 15px; - font-weight: 500; -} - -.Dashboard .internet-status-self .settings-info p:nth-child(2) span:first-child, -.Dashboard .router-status-wifi .wifi-info .settings-info p:first-child span:first-child, -.Dashboard .router-status-wifi .wifi-info .settings-info p:nth-child(2) span:first-child{ - font-weight: 700; -} - -.Dashboard .settings-info p span:first-child { - width: 35%; - font-size: 12px; - text-align: right; -} - -.Dashboard .settings-info p span:nth-child(2){ - display: inline-block; - word-break: break-all; -} - -.Dashboard .settings-info p span:nth-child(2).label { - padding: 1px 4px 1px 4px; - font-size: 9.75px; -} - -.Dashboard .router-status-info .settings-info p span:nth-child(2){ - max-width: 283px; -} - -.Dashboard .settings-info p span.ssid { - max-height: 18px; - top: 3px; -} - -.Dashboard .settings-info p span.encryption { - max-width: 82px; -} - -.Dashboard .router-status-wifi .wifi-info .settings-info, -.Dashboard .router-status-lan .lan-info .settings-info -{ - display: flex; - justify-content: space-around; -} - -.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td { - padding: 0 10px 0 10px; -} - -.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:first-child { - width: 30%; - word-break: break-all; -} - -.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:nth-child(2) { - width: 21%; - overflow: hidden; - padding-left:0; - word-break: break-all; -} - -.Dashboard .router-status-wifi .wifi-info .settings-info{ - padding:1em 0 1em 0; -} - -.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:nth-child(3) { - width: 22%; - overflow: hidden; - position: relative; - top: -3px; -} - -.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:nth-child(5) { - width: initial; -} - -.Dashboard .router-status-wifi .wifi-info > hr:last-child { - margin-bottom:0; -} - -.Dashboard .router-status-wifi .wifi-info .devices-info .device-info .progress { - padding: 0; - width: 100%; - margin: 0; -} - -.Dashboard .wifi-info .devices-info .table-titles { - border-bottom:1px solid rgba(0,0,0,.1); -} - -/** - * Responsive - **/ -@media screen and (min-width: 200px) and (max-width: 640px) { - - .Dashboard .cbi-section-1 > .section-content { - padding-top:10px; - } - - .Dashboard .section-content { - display:block; - } - - .Dashboard .section-content > div{ - padding: 1em; - } - - .Dashboard .section-content > div:first-child { - margin-bottom:10px; - } - - .Dashboard .section-content > div:nth-child(2) { - margin:0; - } - - .Dashboard .router-status-self .router-status-info .settings-info { - padding:0; - } - - .Dashboard .section-content .internet-status-info .settings-info { - display:block; - } - - .Dashboard .section-content .internet-status-info .settings-info > div:first-child { - margin-bottom: 10px; - border-bottom: 1px solid rgba(0,0,0,.1); - } - - .Dashboard .section-content .router-status-lan .devices-info .table-titles { - display:block; - } - - .Dashboard .router-status-wifi .wifi-info .settings-info > div{ - flex:1; - } - - .Dashboard .section-content .router-status-lan .devices-info .table-titles .th:last-child{ - padding-left: 70px; - } - - .Dashboard .section-content .router-status-lan .devices-info .td:first-child{ - flex: 2 2 31%; - } - - .Dashboard .section-content .router-status-lan .devices-info .td:nth-child(2){ - flex: 1 1 24%; - padding: 0; - } - - .Dashboard .section-content .router-status-lan .devices-info .td:last-child{ - word-wrap: normal; - } - - .Dashboard .router-status-wifi .wifi-info .settings-info > div p:nth-child(6) > span:last-child{ - display: inline-block; - overflow: hidden; - height: 14px; - width: 52%; - word-break: break-word; - line-height: 15px; - } - - .Dashboard .wifi-info .devices-info .table-titles { - padding: 0; - margin: 0; - display: flex; - border-radius: initial; - } - - .Dashboard .wifi-info .devices-info .table-titles .th { - flex: 2 2 24%; - } - - .Dashboard .wifi-info .devices-info .tr .td { - flex: 2 2 10%; - } - - .Dashboard .wifi-info hr:nth-child(4) { - margin-bottom: 0; - } -} diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg deleted file mode 100644 index 2ab09176b..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg deleted file mode 100644 index 8563603c9..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg deleted file mode 100644 index d66f8379f..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg deleted file mode 100644 index 1ff29ee56..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg deleted file mode 100644 index 576baafe8..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js deleted file mode 100644 index c43e2ca54..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js +++ /dev/null @@ -1,324 +0,0 @@ -'use strict'; -'require baseclass'; -'require fs'; -'require rpc'; -'require network'; - -var callSystemBoard = rpc.declare({ - object: 'system', - method: 'board' -}); - -var callSystemInfo = rpc.declare({ - object: 'system', - method: 'info' -}); - -return baseclass.extend({ - - params: [], - - load: function() { - return Promise.all([ - network.getWANNetworks(), - network.getWAN6Networks(), - L.resolveDefault(callSystemBoard(), {}), - L.resolveDefault(callSystemInfo(), {}) - ]); - }, - - renderHtml: function(data, type) { - - var icon = type; - var title = 'router' == type ? _('System') : _('Internet'); - var container_wapper = E('div', { 'class': type + '-status-self dashboard-bg box-s1'}); - var container_box = E('div', { 'class': type + '-status-info'}); - var container_item = E('div', { 'class': 'settings-info'}); - - if ('internet' == type) { - icon = (data.v4.connected.value || data.v6.connected.value) ? type : 'not-internet'; - } - - container_box.appendChild(E('div', { 'class': 'title'}, [ - E('img', { - 'src': L.resource('view/dashboard/icons/' + icon + '.svg'), - 'width': 'router' == type ? 64 : 54, - 'title': title, - 'class': 'middle' - }), - E('h3', title) - ])); - - container_box.appendChild(E('hr')); - - if ('internet' == type) { - var container_internet_v4 = E('div'); - var container_internet_v6 = E('div'); - - for(var idx in data) { - - for(var ver in data[idx]) { - var classname = ver, - suppelements = '', - visible = data[idx][ver].visible; - - if('connected' === ver) { - classname = data[idx][ver].value ? 'label label-success' : 'label label-danger'; - data[idx][ver].value = data[idx][ver].value ? _('yes') : _('no'); - } - - if ('v4' === idx) { - - if ('title' === ver) { - container_internet_v4.appendChild( - E('p', { 'class': 'mt-2'}, [ - E('span', {'class': ''}, [ data[idx].title ]), - ]) - ); - continue; - } - - if ('addrsv4' === ver) { - var addrs = data[idx][ver].value; - if(Array.isArray(addrs) && addrs.length) { - for(var ip in addrs) { - data[idx][ver].value = addrs[ip].split('/')[0]; - } - } - } - - if (visible) { - container_internet_v4.appendChild( - E('p', { 'class': 'mt-2'}, [ - E('span', {'class': ''}, [ data[idx][ver].title + ':' ]), - E('span', {'class': classname }, [ data[idx][ver].value ]), - suppelements - ]) - ); - } - - } else { - - if ('title' === ver) { - container_internet_v6.appendChild( - E('p', { 'class': 'mt-2'}, [ - E('span', {'class': ''}, [ data[idx].title ]), - ]) - ); - continue; - } - - if (visible) { - container_internet_v6.appendChild( - E('p', {'class': 'mt-2'}, [ - E('span', {'class': ''}, [data[idx][ver].title + ':']), - E('span', {'class': classname}, [data[idx][ver].value]), - suppelements - ]) - ); - } - } - } - } - - container_item.appendChild(container_internet_v4); - container_item.appendChild(container_internet_v6); - } else { - for(var idx in data) { - container_item.appendChild( - E('p', { 'class': 'mt-2'}, [ - E('span', {'class': ''}, [ data[idx].title + ':' ]), - E('span', {'class': ''}, [ data[idx].value ]) - ]) - ); - } - } - - container_box.appendChild(container_item); - container_box.appendChild(E('hr')); - container_wapper.appendChild(container_box); - return container_wapper; - }, - - renderUpdateWanData: function(data, v6) { - - for (var i = 0; i < data.length; i++) { - var ifc = data[i]; - - if (v6) { - var uptime = ifc.getUptime(); - this.params.internet.v6.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-'; - this.params.internet.v6.ipprefixv6.value = ifc.getIP6Prefix() || '-'; - this.params.internet.v6.gatewayv6.value = ifc.getGateway6Addr() || '-'; - this.params.internet.v6.protocol.value= ifc.getI18n() || E('em', _('Not connected')); - this.params.internet.v6.addrsv6.value = ifc.getIP6Addrs() || [ '-' ]; - this.params.internet.v6.dnsv6.value = ifc.getDNS6Addrs() || [ '-' ]; - this.params.internet.v6.connected.value = ifc.isUp(); - } else { - var uptime = ifc.getUptime(); - this.params.internet.v4.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-'; - this.params.internet.v4.protocol.value= ifc.getI18n() || E('em', _('Not connected')); - this.params.internet.v4.gatewayv4.value = ifc.getGatewayAddr() || '0.0.0.0'; - this.params.internet.v4.connected.value = ifc.isUp(); - this.params.internet.v4.addrsv4.value = ifc.getIPAddrs() || [ '-']; - this.params.internet.v4.dnsv4.value = ifc.getDNSAddrs() || [ '-' ]; - } - } - }, - - renderInternetBox: function(data) { - - this.params.internet = { - - v4: { - title: _('IPv4 Internet'), - - connected: { - title: _('Connected'), - visible: true, - value: false - }, - - uptime: { - title: _('Uptime'), - visible: true, - value: '-' - }, - - protocol: { - title: _('Protocol'), - visible: true, - value: '-' - }, - - addrsv4: { - title: _('IPv4'), - visible: true, - value: [ '-' ] - }, - - gatewayv4: { - title: _('GatewayV4'), - visible: true, - value: '-' - }, - - dnsv4: { - title: _('DNSv4'), - visible: true, - value: ['-'] - } - }, - - v6: { - title: _('IPv6 Internet'), - - connected: { - title: _('Connected'), - visible: true, - value: false - }, - - uptime: { - title: _('Uptime'), - visible: true, - value: '-' - }, - - protocol: { - title: _('Protocol'), - visible: true, - value: ' - ' - }, - - ipprefixv6 : { - title: _('IPv6 prefix'), - visible: true, - value: ' - ' - }, - - addrsv6: { - title: _('IPv6'), - visible: false, - value: [ '-' ] - }, - - gatewayv6: { - title: _('GatewayV6'), - visible: true, - value: '-' - }, - - dnsv6: { - title: _('DNSv6'), - visible: true, - value: [ '-' ] - } - } - }; - - this.renderUpdateWanData(data[0], false); - this.renderUpdateWanData(data[1], true); - - return this.renderHtml(this.params.internet, 'internet'); - }, - - renderRouterBox: function(data) { - - var boardinfo = data[2], - systeminfo = data[3]; - - var datestr = null; - - if (systeminfo.localtime) { - var date = new Date(systeminfo.localtime * 1000); - - datestr = '%04d-%02d-%02d %02d:%02d:%02d'.format( - date.getUTCFullYear(), - date.getUTCMonth() + 1, - date.getUTCDate(), - date.getUTCHours(), - date.getUTCMinutes(), - date.getUTCSeconds() - ); - } - - this.params.router = { - uptime: { - title: _('Uptime'), - value: systeminfo.uptime ? '%t'.format(systeminfo.uptime) : null, - }, - - localtime: { - title: _('Local Time'), - value: datestr - }, - - kernel: { - title: _('Kernel Version'), - value: boardinfo.kernel - }, - - model: { - title: _('Model'), - value: boardinfo.model - }, - - system: { - title: _('Architecture'), - value: boardinfo.system - }, - - release: { - title: _('Firmware Version'), - value: boardinfo.release.description - } - }; - - return this.renderHtml(this.params.router, 'router'); - }, - - render: function(data) { - return [this.renderInternetBox(data), this.renderRouterBox(data)]; - } -}); diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js deleted file mode 100644 index 9f4edce28..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js +++ /dev/null @@ -1,150 +0,0 @@ -'use strict'; -'require baseclass'; -'require rpc'; -'require network'; - -var callLuciDHCPLeases = rpc.declare({ - object: 'luci-rpc', - method: 'getDHCPLeases', - expect: { '': {} } -}); - -return baseclass.extend({ - title: _('DHCP Devices'), - - params: {}, - - load: function() { - return Promise.all([ - callLuciDHCPLeases(), - network.getDevices() - ]); - }, - - renderHtml: function() { - - var container_wapper = E('div', { 'class': 'router-status-lan dashboard-bg box-s1' }); - var container_box = E('div', { 'class': 'lan-info devices-list' }); - var container_devices = E('table', { 'class': 'table assoclist devices-info' }, [ - E('tr', { 'class': 'tr table-titles dashboard-bg' }, [ - E('th', { 'class': 'th nowrap' }, _('Hostname')), - E('th', { 'class': 'th' }, _('IP Address')), - E('th', { 'class': 'th' }, _('MAC')), - ]) - ]); - - var container_deviceslist = E('table', { 'class': 'table assoclist devices-info' }); - - container_box.appendChild(E('div', { 'class': 'title'}, [ - E('img', { - 'src': L.resource('view/dashboard/icons/devices.svg'), - 'width': 55, - 'title': this.title, - 'class': 'middle' - }), - E('h3', this.title) - ])); - - for(var idx in this.params.lan.devices) { - var deivce = this.params.lan.devices[idx]; - - container_deviceslist.appendChild(E('tr', { 'class': 'tr cbi-rowstyle-1'}, [ - - E('td', { 'class': 'td device-info'}, [ - E('p', {}, [ - E('span', { 'class': 'd-inline-block'}, [ deivce.hostname ]), - ]), - ]), - - E('td', { 'class': 'td device-info'}, [ - E('p', {}, [ - E('span', { 'class': 'd-inline-block'}, [ deivce.ipv4 ]), - ]), - ]), - - E('td', { 'class': 'td device-info'}, [ - E('p', {}, [ - E('span', { 'class': 'd-inline-block'}, [ deivce.macaddr ]), - ]), - ]) - ])); - } - - container_box.appendChild(E('hr')); - container_box.appendChild(container_devices); - container_box.appendChild(E('hr')); - container_box.appendChild(container_deviceslist); - container_wapper.appendChild(container_box); - - return container_wapper; - }, - - renderUpdateData: function(data, leases) { - - for(var item in data) { - if (/lan|br-lan/ig.test(data[item].ifname) && (typeof data[item].dev == 'object' && !data[item].dev.wireless)) { - var lan_device = data[item]; - var ipv4addr = lan_device.dev.ipaddrs.toString().split('/'); - - this.params.lan.ipv4 = ipv4addr[0] || '?'; - this.params.lan.ipv6 = ipv4addr[0] || '?'; - this.params.lan.macaddr = lan_device.dev.macaddr || '00:00:00:00:00:00'; - this.params.lan.rx_bytes = lan_device.dev.stats.rx_bytes ? '%.2mB'.format(lan_device.dev.stats.rx_bytes) : '-'; - this.params.lan.tx_bytes = lan_device.dev.stats.tx_bytes ? '%.2mB'.format(lan_device.dev.stats.tx_bytes) : '-'; - } - } - - var devices = []; - leases.map(function(lease) { - devices[lease.expires] = { - hostname: lease.hostname || '?', - ipv4: lease.ipaddr || '-', - macaddr: lease.macaddr || '00:00:00:00:00:00', - }; - }); - this.params.lan.devices = devices; - }, - - renderLeases: function(data) { - - var leases = Array.isArray(data[0].dhcp_leases) ? data[0].dhcp_leases : []; - - this.params.lan = { - ipv4: { - title: _('IPv4'), - value: '?' - }, - - macaddr: { - title: _('Mac'), - value: '00:00:00:00:00:00' - }, - - rx_bytes: { - title: _('Upload'), - value: '-' - }, - - tx_bytes: { - title: _('Download'), - value: '-' - }, - - devices: { - title: _('Devices'), - value: [] - } - }; - - this.renderUpdateData(data[1], leases); - - return this.renderHtml(); - }, - - render: function(data) { - if (L.hasSystemFeature('dnsmasq') || L.hasSystemFeature('odhcpd')) - return this.renderLeases(data); - - return E([]); - } -}); diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js deleted file mode 100644 index 318c3abf8..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js +++ /dev/null @@ -1,269 +0,0 @@ -'use strict'; -'require baseclass'; -'require dom'; -'require network'; -'require rpc'; - -return baseclass.extend({ - - title: _('Wireless'), - - params: [], - - load: function() { - return Promise.all([ - network.getWifiDevices(), - network.getWifiNetworks(), - network.getHostHints() - ]).then(function(radios_networks_hints) { - var tasks = []; - - for (var i = 0; i < radios_networks_hints[1].length; i++) - tasks.push(L.resolveDefault(radios_networks_hints[1][i].getAssocList(), []).then(L.bind(function(net, list) { - net.assoclist = list.sort(function(a, b) { return a.mac > b.mac }); - }, this, radios_networks_hints[1][i]))); - - return Promise.all(tasks).then(function() { - return radios_networks_hints; - }); - }); - }, - - renderHtml: function() { - - var container_wapper = E('div', { 'class': 'router-status-wifi dashboard-bg box-s1' }); - var container_box = E('div', { 'class': 'wifi-info devices-list' }); - var container_radio = E('div', { 'class': 'settings-info' }); - var container_radio_item; - - container_box.appendChild(E('div', { 'class': 'title'}, [ - E('img', { - 'src': L.resource('view/dashboard/icons/wireless.svg'), - 'width': 55, - 'title': this.title, - 'class': 'middle' - }), - E('h3', this.title) - ])); - - container_box.appendChild(E('hr')); - - for (var i =0; i < this.params.wifi.radios.length; i++) { - - container_radio_item = E('div', { 'class': 'radio-info' }) - - for(var idx in this.params.wifi.radios[i]) { - var classname = idx, - radio = this.params.wifi.radios[i]; - - if (!radio[idx].visible) { - continue; - } - - if ('actived' === idx) { - classname = radio[idx].value ? 'label label-success' : 'label label-danger'; - radio[idx].value = radio[idx].value ? _('yes') : _('no'); - } - - container_radio_item.appendChild( - E('p', {}, [ - E('span', { 'class': ''}, [ radio[idx].title + ':']), - E('span', { 'class': classname }, [ radio[idx].value ]), - ]) - ); - } - - container_radio.appendChild(container_radio_item); - } - - container_box.appendChild(container_radio); - - var container_devices = E('table', { 'class': 'table assoclist devices-info' }, [ - E('tr', { 'class': 'tr table-titles dashboard-bg' }, [ - E('th', { 'class': 'th nowrap' }, _('Hostname')), - E('th', { 'class': 'th' }, _('Wireless')), - E('th', { 'class': 'th' }, _('Signal')), - E('th', { 'class': 'th' }, '%s / %s'.format( _('Up.'), _('Down.'))) - ]) - ]); - - var container_devices_item; - var container_devices_list = E('table', { 'class': 'table assoclist devices-info' }); - - for (var i =0; i < this.params.wifi.devices.length; i++) { - container_devices_item = E('tr', { 'class': 'tr cbi-rowstyle-1' }); - - for(var idx in this.params.wifi.devices[i]) { - var device = this.params.wifi.devices[i]; - - if (!device[idx].visible) { - continue; - } - - var container_content; - - if ('progress' == idx) { - container_content = E('div', { 'class' : 'td device-info' }, [ - E('div', { 'class': 'progress' }, [ - E('div', { 'class': 'progress-bar ' + device[idx].value.style, role: 'progressbar', style: 'width:'+device[idx].value.qualite+'%', 'aria-valuenow': device[idx].value.qualite, 'aria-valuemin': 0, 'aria-valuemax': 100 }), - ]) - ]); - } else if ('rate' == idx) { - container_content = E('td', { 'class': 'td device-info' }, [ - E('p', {}, [ - E('span', { 'class': ''}, [ device[idx].value.rx ]), - E('br'), - E('span', { 'class': ''}, [ device[idx].value.tx ]) - ]) - ]); - } else { - container_content = E('td', { 'class': 'td device-info'}, [ - E('p', {}, [ - E('span', { 'class': ''}, [ device[idx].value ]), - ]) - ]); - } - - container_devices_item.appendChild(container_content); - } - - container_devices_list.appendChild(container_devices_item); - } - - container_devices.appendChild(container_devices_list); - container_box.appendChild(E('hr')); - container_box.appendChild(container_devices); - container_box.appendChild(container_devices_list); - container_wapper.appendChild(container_box); - - return container_wapper; - }, - - renderUpdateData: function(radios, networks, hosthints) { - - for (var i = 0; i < radios.sort(function(a, b) { a.getName() > b.getName() }).length; i++) { - var network_items = networks.filter(function(net) { return net.getWifiDeviceName() == radios[i].getName() }); - - for (var j = 0; j < network_items.length; j++) { - var net = network_items[j], - is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()), - chan = net.getChannel(), - freq = net.getFrequency(), - rate = net.getBitRate(); - - this.params.wifi.radios.push( - { - ssid : { - title: _('SSID'), - visible: true, - value: net.getActiveSSID() || '?' - }, - - actived : { - title: _('Active'), - visible: true, - value: !net.isDisabled() - }, - - chan : { - title: _('Channel'), - visible: true, - value: chan ? '%d (%.3f %s)'.format(chan, freq, _('GHz')) : '-' - }, - - rate : { - title: _('Bitrate'), - visible: true, - value: rate ? '%d %s'.format(rate, _('Mbit/s')) : '-' - }, - - bssid : { - title: _('BSSID'), - visible: true, - value: is_assoc ? (net.getActiveBSSID() || '-') : '-' - }, - - encryption : { - title: _('Encryption'), - visible: true, - value: is_assoc ? net.getActiveEncryption() : '-' - }, - - associations : { - title: _('Devices Connected'), - visible: true, - value: is_assoc ? (net.assoclist.length || '0') : 0 - } - } - ); - } - } - - for (var i = 0; i < networks.length; i++) { - for (var k = 0; k < networks[i].assoclist.length; k++) { - var bss = networks[i].assoclist[k], - name = hosthints.getHostnameByMACAddr(bss.mac); - - var progress_style; - var q = Math.min((bss.signal + 110) / 70 * 100, 100); - - if (q == 0 || q < 25) - progress_style = 'bg-danger'; - else if (q < 50) - progress_style = 'bg-warning'; - else if (q < 75) - progress_style = 'bg-success'; - else - progress_style = 'bg-success'; - - this.params.wifi.devices.push( - { - hostname : { - title: _('Hostname'), - visible: true, - value: name || '?' - }, - - ssid : { - title: _('SSID'), - visible: true, - value: networks[i].getActiveSSID() - }, - - progress : { - title: _('Channel'), - visible: true, - value: { - qualite: q, - style: progress_style - } - }, - - rate : { - title: _('Bitrate'), - visible: true, - value: { - rx: '%s'.format('%.2mB'.format(bss.rx.bytes)), - tx: '%s'.format('%.2mB'.format(bss.tx.bytes)), - } - } - } - ); - } - } - }, - - render: function(data) { - - this.params.wifi = { - radios: [], - devices: [] - }; - - this.renderUpdateData(data[0], data[1], data[2]); - - if (this.params.wifi.radios.length) - return this.renderHtml(); - return E([]); - } -}); diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js deleted file mode 100644 index c3e3b7027..000000000 --- a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js +++ /dev/null @@ -1,110 +0,0 @@ -'use strict'; -'require view'; -'require dom'; -'require poll'; -'require fs'; -'require network'; - -document.querySelector('head').appendChild(E('link', { - 'rel': 'stylesheet', - 'type': 'text/css', - 'href': L.resource('view/dashboard/css/custom.css') -})); - -function invokeIncludesLoad(includes) { - var tasks = [], has_load = false; - - for (var i = 0; i < includes.length; i++) { - if (typeof(includes[i].load) == 'function') { - tasks.push(includes[i].load().catch(L.bind(function() { - this.failed = true; - }, includes[i]))); - - has_load = true; - } - else { - tasks.push(null); - } - } - - return has_load ? Promise.all(tasks) : Promise.resolve(null); -} - -function startPolling(includes, containers) { - var step = function() { - return network.flushCache().then(function() { - return invokeIncludesLoad(includes); - }).then(function(results) { - for (var i = 0; i < includes.length; i++) { - var content = null; - - if (includes[i].failed) - continue; - - if (typeof(includes[i].render) == 'function') - content = includes[i].render(results ? results[i] : null); - else if (includes[i].content != null) - content = includes[i].content; - - if (content != null) { - - if (i > 1) { - dom.append(containers[1], content); - } else { - containers[i].parentNode.style.display = ''; - containers[i].parentNode.classList.add('fade-in'); - containers[i].parentNode.classList.add('Dashboard'); - dom.content(containers[i], content); - } - } - } - - var ssi = document.querySelector('div.includes'); - if (ssi) { - ssi.style.display = ''; - ssi.classList.add('fade-in'); - } - }); - }; - - return step().then(function() { - poll.add(step); - }); -} - -return view.extend({ - load: function() { - return L.resolveDefault(fs.list('/www' + L.resource('view/dashboard/include')), []).then(function(entries) { - return Promise.all(entries.filter(function(e) { - return (e.type == 'file' && e.name.match(/\.js$/)); - }).map(function(e) { - return 'view.dashboard.include.' + e.name.replace(/\.js$/, ''); - }).sort().map(function(n) { - return L.require(n); - })); - }); - }, - - render: function(includes) { - var rv = E([]), containers = []; - - for (var i = 0; i < includes.length - 1; i++) { - - var container = E('div', { 'class': 'section-content' }); - - rv.appendChild(E('div', { 'class': 'cbi-section-' + i, 'style': 'display:none' }, [ - container - ])); - - containers.push(container); - } - - return startPolling(includes, containers).then(function() { - return rv; - }); - }, - - handleSaveApply: null, - handleSave: null, - handleReset: null -}); diff --git a/luci-mod-dashboard/po/ar/dashboard.po b/luci-mod-dashboard/po/ar/dashboard.po deleted file mode 100644 index 41ecc7e3a..000000000 --- a/luci-mod-dashboard/po/ar/dashboard.po +++ /dev/null @@ -1,215 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ar\n" -"MIME-Version: 1.0\n" -"Content-Transfer-Encoding: 8bit\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/bg/dashboard.po b/luci-mod-dashboard/po/bg/dashboard.po deleted file mode 100644 index 2a7df7bb6..000000000 --- a/luci-mod-dashboard/po/bg/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-08-27 12:56+0000\n" -"Last-Translator: Iskren Mihaylov \n" -"Language-Team: Bulgarian \n" -"Language: bg\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Активен" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Архитектура" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Битрейт" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Канал" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Свързан" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP Устройства" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Табло" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Устройства" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Свързани устройства" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Долу." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Сваляне" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Криптиране" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Версия на firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "ГейтауейV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Разрешаване достъп до DHCP статус екран" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Разрешаване достъп до главен статус екран" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Разрешаване достъп до екран със системни маршрути" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Разрешаване достъп до екран с безжичен статус" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Хостнейм" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP адрес" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Интернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Интернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 префикс" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Интернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Версия на ядрото" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Местно време" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Модел" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Не е свързан" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Протокол" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Сигнал" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Система" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Горе." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Качване" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Ъптайм" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Безжичен" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "не" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "да" - -#~ msgid "Connected since" -#~ msgstr "Свързан от" diff --git a/luci-mod-dashboard/po/bn_BD/dashboard.po b/luci-mod-dashboard/po/bn_BD/dashboard.po deleted file mode 100644 index b168d00a2..000000000 --- a/luci-mod-dashboard/po/bn_BD/dashboard.po +++ /dev/null @@ -1,219 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-10-08 17:53+0000\n" -"Last-Translator: Rayhan Nabi \n" -"Language-Team: Bengali (Bangladesh) \n" -"Language: bn_BD\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "হোস্টনেম" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "আইপি এড্রেস" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "প্রোটোকল" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "সংকেত" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "সিস্টেম" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/ca/dashboard.po b/luci-mod-dashboard/po/ca/dashboard.po deleted file mode 100644 index 9f2a47c1d..000000000 --- a/luci-mod-dashboard/po/ca/dashboard.po +++ /dev/null @@ -1,219 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-03-08 10:38+0000\n" -"Last-Translator: Roger Pueyo Centelles \n" -"Language-Team: Catalan \n" -"Language: ca\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16.2-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Actiu" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arquitectura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Dispositius" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Puja" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/cs/dashboard.po b/luci-mod-dashboard/po/cs/dashboard.po deleted file mode 100644 index 1510f26db..000000000 --- a/luci-mod-dashboard/po/cs/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-01-18 00:56+0000\n" -"Last-Translator: Lukáš Wagner \n" -"Language-Team: Czech \n" -"Language: cs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.15.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktivní" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architektura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Přenosová rychlost" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanál" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Připojeno" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP zařízení" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Řídicí panel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Zařízení" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Připojená zařízení" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Šifrování" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Verze firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "Brána v4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "Brána v6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Poskytnout přístup k zobrazení stavu DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Poskytnout přístup k zobrazení stavu bezdrátové sítě" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Název počítače" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP adresa" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 prefix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Verze kernelu" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Místní čas" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Nepřipojeno" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signál" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Systém" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Doba běhu" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Bezdrátová síť" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "ne" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ano" - -#~ msgid "Connected since" -#~ msgstr "Připojeno od" diff --git a/luci-mod-dashboard/po/da/dashboard.po b/luci-mod-dashboard/po/da/dashboard.po deleted file mode 100644 index 7fe4cc1ec..000000000 --- a/luci-mod-dashboard/po/da/dashboard.po +++ /dev/null @@ -1,220 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2021-12-08 22:46+0000\n" -"Last-Translator: drax red \n" -"Language-Team: Danish \n" -"Language: da\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.10-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktiv" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arkitektur" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Tilsluttet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP-enheder" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Dashboard" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Enheder" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Enheder tilsluttet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Ned." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Download" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Kryptering" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Firmware-version" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Giver adgang til visning af DHCP-status" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Giver adgang til hovedstatusdisplayet" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Giv adgang til systemets rutestatus" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Giv adgang til trådløs statusvisning" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Værtsnavn" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP-adresse" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6-præfiks" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Kerneversion" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Lokal tid" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Ikke tilsluttet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "System" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Op." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Upload" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Oppetid" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Trådløs" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nej" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ja" - -#~ msgid "Connected since" -#~ msgstr "Tilsluttet siden" diff --git a/luci-mod-dashboard/po/de/dashboard.po b/luci-mod-dashboard/po/de/dashboard.po deleted file mode 100644 index dbcd01a92..000000000 --- a/luci-mod-dashboard/po/de/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-20 16:23+0000\n" -"Last-Translator: ssantos \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18.1\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktiv" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architektur" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Verbunden" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP-Geräte" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Übersicht" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Geräte" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Verbundene Geräte" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Runter." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Herunterladen" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Verschlüsselung" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Firmware-Version" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Zugriff auf die DHCP-Statusanzeige gewähren" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Zugriff zur Hauptstatusanzeige gewähren" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Zugriff auf den Status der Systemroute gewähren" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Zugriff auf Wireless-Statusanzeige gewähren" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Hostname" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP-Adresse" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4-Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6-Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6-Präfix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Kernel-Version" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Ortszeit" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modell" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Nicht verbunden" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokoll" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "System" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Aktiv." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Hochladen" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Laufzeit" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "WLAN" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nein" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ja" - -#~ msgid "Connected since" -#~ msgstr "Verbunden seit" diff --git a/luci-mod-dashboard/po/el/dashboard.po b/luci-mod-dashboard/po/el/dashboard.po deleted file mode 100644 index 905dc71db..000000000 --- a/luci-mod-dashboard/po/el/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-05-15 17:04+0000\n" -"Last-Translator: MarioK239 \n" -"Language-Team: Greek \n" -"Language: el\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Ενεργό" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Αρχιτεκτονική" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Ρυθμός bit" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Κανάλι" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Συνδεδεμένο" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Συσκευές DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Ταμπλό" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Συσκευές" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Συσκευές Συνδεδεμένες" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Κάτω." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Λήψη" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Κρυπτογράφηση" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Έκδοση υλικολογισμικού" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Παραχωρήστε πρόσβαση στην οθόνη κατάστασης DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Παραχωρήστε πρόσβαση στην κύρια οθόνη κατάστασης" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Παραχωρήστε πρόσβαση στην κατάσταση διαδρομής συστήματος" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Παραχωρήστε πρόσβαση στην οθόνη ασύρματης κατάστασης" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Hostname" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Διεύθυνση IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Ίντερνετ IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Ίντερνετ IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Πρόθεμα IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Διαδίκτυο" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Έκδοση kernel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Τοπική ώρα" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Μοντέλο" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Μη συνδεδεμένο" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Πρωτόκολλο" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Σήμα" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Σύστημα" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Πάνω." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Μεταφόρτωση" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Χρόνος λειτουργίας" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Ασύρματο" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "όχι" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ναί" - -#~ msgid "Connected since" -#~ msgstr "Συνδεδεμένο από" diff --git a/luci-mod-dashboard/po/en/dashboard.po b/luci-mod-dashboard/po/en/dashboard.po deleted file mode 100644 index 80f51b65f..000000000 --- a/luci-mod-dashboard/po/en/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-06-24 07:45+0000\n" -"Last-Translator: Hannu Nyman \n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Active" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architecture" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Channel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Connected" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP Devices" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Dashboard" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Devices" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Devices Connected" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Down." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Download" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Encryption" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Firmware Version" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Grant access to DHCP status display" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Grant access to main status display" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Grant access to the system route status" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Grant access to wireless status display" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Hostname" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP Address" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 prefix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Kernel Version" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Local Time" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Not connected" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "System" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Up." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Upload" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Uptime" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Wireless" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "no" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "yes" - -#~ msgid "Connected since" -#~ msgstr "Connected since" diff --git a/luci-mod-dashboard/po/es/dashboard.po b/luci-mod-dashboard/po/es/dashboard.po deleted file mode 100644 index ac5750e29..000000000 --- a/luci-mod-dashboard/po/es/dashboard.po +++ /dev/null @@ -1,223 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-04-17 08:10+0000\n" -"Last-Translator: Juan \n" -"Language-Team: Spanish \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Activo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arquitectura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Tasa de bits" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Canal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Conectado" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Dispositivos DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Tablero" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Dispositivos" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Dispositivos conectados" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Desc." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Descargar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Encriptación" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Versión del firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Otorgar acceso a la pantalla de estado de DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Otorgar acceso a la pantalla de estado principal" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -#, fuzzy -msgid "Grant access to the system route status" -msgstr "Otorgar acceso al estado de la ruta del sistema" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Otorgar acceso a la pantalla de estado de Wi-Fi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Nombre de host" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Dirección IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Prefijo IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Versión del núcleo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Hora local" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modelo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "No conectado" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocolo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Señal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Sistema" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Carga" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Cargar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Tiempo de actividad" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Wi-Fi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "no" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "sí" - -#~ msgid "Connected since" -#~ msgstr "Conectado desde" diff --git a/luci-mod-dashboard/po/fi/dashboard.po b/luci-mod-dashboard/po/fi/dashboard.po deleted file mode 100644 index 7a0e80f4f..000000000 --- a/luci-mod-dashboard/po/fi/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-03-13 23:17+0000\n" -"Last-Translator: Jiri Grönroos \n" -"Language-Team: Finnish \n" -"Language: fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktiivinen" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arkkitehtuuri" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bittinopeus" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanava" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Yhdistetty" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP-laitteet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Kojelauta" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Laitteet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Yhdisteyt laitteet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Lataus" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Lataus" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Salaus" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Laiteohjelmiston versio" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Salli pääsy DHCP-tilanäyttöön" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Salli pääsy päätilanäyttöön" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Salli pääsy järjestelmän reitin tilaan" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Salli pääsy langattoman tilan näyttöön" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Laitenimi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP-osoite" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6-etuliite" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Ytimen versio" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Paikallinen aika" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Malli" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Ei yhdistetty" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokolla" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signaali" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Järjestelmä" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Lähetys" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Lähetys" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Toiminta-aika" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Langaton" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "ei" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "kyllä" - -#~ msgid "Connected since" -#~ msgstr "Yhdistetty lähtien" diff --git a/luci-mod-dashboard/po/fr/dashboard.po b/luci-mod-dashboard/po/fr/dashboard.po deleted file mode 100644 index b394ddff8..000000000 --- a/luci-mod-dashboard/po/fr/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-11 13:51+0000\n" -"Last-Translator: Edouard Choinière \n" -"Language-Team: French \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.18-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Actif" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architecture" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Débit" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Canal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Connecté" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Appareils DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNS v6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Tableau de bord" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Appareils" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Appareils connectés" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Déconnecté." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Télécharger" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Chiffrement" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Version du micrologiciel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "Ghz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "Passerelle V4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "Passerelle V6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Permettre l'accès à l'affichage de l'état DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Permettre l'accès à l'affichage de l'état principal" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Autoriser l'accès à l'état de l'itinéraire du système" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Permettre l'accès au status WIFI" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Nom d'hôte" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Adresse IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Préfixe IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Version du noyau" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Heure locale" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modèle" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Non connecté" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocole" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Système" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Connecté." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Téléverser" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Disponibilité" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Sans fil" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "non" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "oui" - -#~ msgid "Connected since" -#~ msgstr "Connecté depuis" diff --git a/luci-mod-dashboard/po/he/dashboard.po b/luci-mod-dashboard/po/he/dashboard.po deleted file mode 100644 index 905bf7389..000000000 --- a/luci-mod-dashboard/po/he/dashboard.po +++ /dev/null @@ -1,216 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: he\n" -"MIME-Version: 1.0\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/hi/dashboard.po b/luci-mod-dashboard/po/hi/dashboard.po deleted file mode 100644 index dd6968663..000000000 --- a/luci-mod-dashboard/po/hi/dashboard.po +++ /dev/null @@ -1,215 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: hi\n" -"MIME-Version: 1.0\n" -"Content-Transfer-Encoding: 8bit\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/hu/dashboard.po b/luci-mod-dashboard/po/hu/dashboard.po deleted file mode 100644 index a1e2e9eca..000000000 --- a/luci-mod-dashboard/po/hu/dashboard.po +++ /dev/null @@ -1,223 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-08-12 12:55+0000\n" -"Last-Translator: Tudós Péter \n" -"Language-Team: Hungarian \n" -"Language: hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktív" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architektúra" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitráta" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Csatorna" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Csatlakoztatott" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP eszközök" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Kezelőfelület" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Eszközök" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Csatlakozott eszközök" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Le." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Letöltés" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Titkosítás" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Firmware verzió" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "Átjáró V4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "Átjáró V6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Gépnév" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP cím" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Kernel Verzió" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Helyi idő" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modell" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Nincs csatlakoztatva" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Jel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Rendszer" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Fel." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Feltöltés" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Futási idő" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Vezeték nélküli" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nem" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "igen" - -#, fuzzy -#~ msgid "Connected since" -#~ msgstr "Ennyi ideje csatlakoztatva" diff --git a/luci-mod-dashboard/po/id/dashboard.po b/luci-mod-dashboard/po/id/dashboard.po deleted file mode 100644 index 084d40545..000000000 --- a/luci-mod-dashboard/po/id/dashboard.po +++ /dev/null @@ -1,220 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2023-03-12 20:08+0000\n" -"Last-Translator: Biangkerok32 \n" -"Language-Team: Indonesian \n" -"Language: id\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.16.2-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktif" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arsitektur" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Terhubung" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Perangkat DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Dasbor" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Perangkat" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Perangkat Terhubung" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Turun." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Unduh" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Enkripsi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Versi Firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Berikan akses ke tampilan status DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Berikan akses ke tampilan status utama" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Berikan akses ke status rute sistem" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Berikan akses ke tampilan status wifi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Hostname" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Alamat IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 prefix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Versi Kernel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Waktu setempat" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/detik" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Tidak terhubung" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Sinyal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Sistem" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Naik." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Upload" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Waktu terkini" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Wifi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "tidak" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ya" - -#~ msgid "Connected since" -#~ msgstr "Terhubung sejak" diff --git a/luci-mod-dashboard/po/it/dashboard.po b/luci-mod-dashboard/po/it/dashboard.po deleted file mode 100644 index 7dae9b8bd..000000000 --- a/luci-mod-dashboard/po/it/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-12-26 08:48+0000\n" -"Last-Translator: Daniele Luisetto \n" -"Language-Team: Italian \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Attivo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architettura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Canale" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Connesso" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Dispositivi DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Pannello di controllo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Dispositivi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Dispositivi connessi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Disconesso." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Download" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Crittografia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Versione del Firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Consentire la visualizzazione dello stato del DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Consentire la visualizzazione dello stato generale" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Consentire l'accesso allo stato delle route di sistema" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Consentire la visualizzazione dello stato del wireless" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Nome host" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Indirizzo IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Prefisso IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Versione del Kernel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Data/ora locale" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modello" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Non connesso" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocollo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Segnale" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "SIstema" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "In funzione." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Carica" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Tempo di attività" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Wireless" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "no" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "sì" - -#~ msgid "Connected since" -#~ msgstr "Connesso da" diff --git a/luci-mod-dashboard/po/ja/dashboard.po b/luci-mod-dashboard/po/ja/dashboard.po deleted file mode 100644 index d451b876f..000000000 --- a/luci-mod-dashboard/po/ja/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-06-11 06:32+0000\n" -"Last-Translator: Satoru Yoshida \n" -"Language-Team: Japanese \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "アクティブ" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "アーキテクチャ" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "ビットレート" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "チャンネル" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "接続中" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP デバイス" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNS (v4)" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNS (v6)" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "ダッシュボード" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "デバイス" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "接続中のデバイス" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "ダウン" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "ダウンロード" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "暗号化" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "ファームウェア バージョン" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "ゲートウェイ (v4)" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "ゲートウェイ (v6)" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "DHCPステータス表示へのアクセスを許可" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "メインステータス表示へのアクセスを許可" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "システムルートステータスへのアクセスを許可" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "無線ステータス表示へのアクセスを許可" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "ホスト名" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP アドレス" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 インターネット" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 インターネット" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 プレフィックス" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "インターネット" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "カーネル バージョン" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "時刻" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbps" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "モデル" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "未接続" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "プロトコル" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "信号強度" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "システム" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "アップ" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "アップロード" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "稼働時間" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "無線" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "いいえ" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "はい" - -#~ msgid "Connected since" -#~ msgstr "接続時間" diff --git a/luci-mod-dashboard/po/ko/dashboard.po b/luci-mod-dashboard/po/ko/dashboard.po deleted file mode 100644 index 0b968c298..000000000 --- a/luci-mod-dashboard/po/ko/dashboard.po +++ /dev/null @@ -1,219 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-01-10 10:50+0000\n" -"Last-Translator: TheNoFace \n" -"Language-Team: Korean \n" -"Language: ko\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "활성화" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "아키텍처" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "비트레이트" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "채널" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "연결됨" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP 장치" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "대시보드" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "장치" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "연결된 장치" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "다운." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "다운로드" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "암호화" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "펌웨어 버전" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "게이트웨이 IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "게이트웨이 IPv6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "DHCP 상태 표시 접근을 허가합니다" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "기본 상태 표시 접근을 허가합니다" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "시스템 라우트 상태 접근을 허가합니다" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "무선 상태 표시 접근을 허가합니다" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "호스트명" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP 주소" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 인터넷" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 인터넷" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 접두사" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "인터넷" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "커널 버전" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "로컬 시간" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "모델" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "연결되지 않음" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "프로토콜" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "시그널" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "시스템" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "업." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "업로드" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "가동시간" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "무선" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "아니오" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "예" diff --git a/luci-mod-dashboard/po/mr/dashboard.po b/luci-mod-dashboard/po/mr/dashboard.po deleted file mode 100644 index 149c99b6a..000000000 --- a/luci-mod-dashboard/po/mr/dashboard.po +++ /dev/null @@ -1,215 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mr\n" -"MIME-Version: 1.0\n" -"Content-Transfer-Encoding: 8bit\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/ms/dashboard.po b/luci-mod-dashboard/po/ms/dashboard.po deleted file mode 100644 index bf5fa329a..000000000 --- a/luci-mod-dashboard/po/ms/dashboard.po +++ /dev/null @@ -1,215 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Project-Id-Version: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ms\n" -"MIME-Version: 1.0\n" -"Content-Transfer-Encoding: 8bit\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/nb_NO/dashboard.po b/luci-mod-dashboard/po/nb_NO/dashboard.po deleted file mode 100644 index 724152ae0..000000000 --- a/luci-mod-dashboard/po/nb_NO/dashboard.po +++ /dev/null @@ -1,230 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-08 00:12+0000\n" -"Last-Translator: Allan Nordhøy \n" -"Language-Team: Norwegian Bokmål \n" -"Language: nb_NO\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -#, fuzzy -msgid "Active" -msgstr "Aktiv" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arkitektur" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Tilkoblet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP-enheter" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Oversikt" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Enheter" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -#, fuzzy -msgid "Devices Connected" -msgstr "Tilkoblede enheter" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Nede." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Last ned" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Kryptering" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Fastvareversjon" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -#, fuzzy -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -#, fuzzy -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Innvilg tilgang til DHCP-statusskjerm" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Innvilg tilgang til hovedstatusskjerm" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Innvilg tilgang til systemrutestatus" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Innvilg tilgang til trådløs statusskjerm" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Vertsnavn" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP-adresse" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4-Internett" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6-Internett" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6-prefiks" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internett" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Kjerneversjon" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Lokal tid" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -#, fuzzy -msgid "Mac" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modell" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Ikke tilkoblet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokoll" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "System" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -#, fuzzy -msgid "Up." -msgstr "Oppe." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -#, fuzzy -msgid "Upload" -msgstr "Last opp" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Oppetid" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -#, fuzzy -msgid "Wireless" -msgstr "Trådløst" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nei" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ja" - -#~ msgid "Connected since" -#~ msgstr "Tilkoblet siden" diff --git a/luci-mod-dashboard/po/nl/dashboard.po b/luci-mod-dashboard/po/nl/dashboard.po deleted file mode 100644 index 6b516f9d8..000000000 --- a/luci-mod-dashboard/po/nl/dashboard.po +++ /dev/null @@ -1,219 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-11 03:31+0000\n" -"Last-Translator: xtz1983 \n" -"Language-Team: Dutch \n" -"Language: nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Actief" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architectuur" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanaal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Verbonden" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP Apparaten" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Dashboard" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Apparaten" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Verbonden Apparaten" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Uitgeschakeld." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Download" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Versleuteling" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Firmware Versie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Toegang verlenen tot weergave van DHCP-status" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Toegang verlenen tot hoofdstatusweergave" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Toegang verlenen tot de status van het systeemrouteringsproces" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Toegang verlenen tot weergave van draadloze status" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Hostnaam" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP Adres" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 prefix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Kernel Versie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Lokale tijd" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Geen verbinding" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signaal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Systeem" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Boven." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Uploaden" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Bedrijfstijd" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Draadloos" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nee" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "ja" diff --git a/luci-mod-dashboard/po/pl/dashboard.po b/luci-mod-dashboard/po/pl/dashboard.po deleted file mode 100644 index 91c205b75..000000000 --- a/luci-mod-dashboard/po/pl/dashboard.po +++ /dev/null @@ -1,223 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-03 11:51+0000\n" -"Last-Translator: Matthaiks \n" -"Language-Team: Polish \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktywny" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architektura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Szybkość transmisji" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanał" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Połączony" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Urządzenia DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Info" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Urządzenia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Podłączone urządzenia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Pobieranie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Pobierz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Szyfrowanie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Wersja firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "BramaV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "BramaV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Udziel dostępu do wyświetlania statusu DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Udziel dostępu do głównego wyświetlacza stanu" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Udziel dostępu do statusu systemowych tras" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Udziel dostępu do wyświetlania statusu sieci bezprzewodowej" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Nazwa hosta" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Adres IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Prefiks IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Wersja kernela" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Czas lokalny" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Nie podłączony" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokół" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Sygnał" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "System" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Wysyłanie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Wysyłanie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Czas pracy" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Sieć bezprzewodowa" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "tak" - -#~ msgid "Connected since" -#~ msgstr "Czas połączenia" diff --git a/luci-mod-dashboard/po/pt/dashboard.po b/luci-mod-dashboard/po/pt/dashboard.po deleted file mode 100644 index 5e473dda5..000000000 --- a/luci-mod-dashboard/po/pt/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-30 14:48+0000\n" -"Last-Translator: Gonçalo Pereira \n" -"Language-Team: Portuguese \n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Ativo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arquitectura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Taxa de bits" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Canal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Ligado" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Dispositivos DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Painel de Controlo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Dispositivos" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Dispositivos ligados" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Em Baixo." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Descarregar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Encriptação" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Versão do firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Conceder acesso à visualização do estado do DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Conceder acesso à visualização do estado principal" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Conceder acesso ao estado da rota do sistema" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Conceda acesso à visualização da condição do wireless" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Nome do equipamento" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Endereço IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Prefixo IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Versão do kernel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Hora local" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modelo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Não conectado" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocolo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Sinal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Sistema" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Ativo." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Enviar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Tempo de atividade" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Rede sem fios" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "não" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "sim" - -#~ msgid "Connected since" -#~ msgstr "Ligado desde" diff --git a/luci-mod-dashboard/po/pt_BR/dashboard.po b/luci-mod-dashboard/po/pt_BR/dashboard.po deleted file mode 100644 index 95d523512..000000000 --- a/luci-mod-dashboard/po/pt_BR/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-05 03:51+0000\n" -"Last-Translator: Wellington Terumi Uemura \n" -"Language-Team: Portuguese (Brazil) \n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.18-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Ativo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arquitetura" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Taxa de bits" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Canal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Conectado" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Dispositivos DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Painel de Controle" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Dispositivos" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Dispositivos conectados" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Baix." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Baixar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Criptografia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Versão do firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Conceda acesso à visualização da condição do DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Conceda acesso à exibição do status principal" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Conceda acesso à condição da rota do sistema" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Conceda acesso à visualização da condição do wireless" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Nome do equipamento" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Endereço IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Prefixo IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Versão do kernel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Hora local" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Modelo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Não conectado" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocolo" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Sinal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Sistema" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Envio" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Envio" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Tempo de atividade" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Rede sem fio" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "não" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "sim" - -#~ msgid "Connected since" -#~ msgstr "Conectado desde" diff --git a/luci-mod-dashboard/po/ro/dashboard.po b/luci-mod-dashboard/po/ro/dashboard.po deleted file mode 100644 index dd777daff..000000000 --- a/luci-mod-dashboard/po/ro/dashboard.po +++ /dev/null @@ -1,223 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-11-04 20:04+0000\n" -"Last-Translator: Simona Iacob \n" -"Language-Team: Romanian \n" -"Language: ro\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " -"20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Activ" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arhitectură" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Rata de biți" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Canal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Conectat" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Dispozitive DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Tabloul de bord" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Dispozitive" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Dispozitive conectate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Oprit." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Descărcați" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Criptare" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Versiunea Firmware-ului" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Acordați acces la afișarea stării DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Acordați acces la afișarea principală a stării" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Acordați accesul la starea rutei sistemului" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Acordați acces la afișarea stării wireless" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Numele gazdei ( hostname )" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Adresa IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Prefix IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Versiunea Kernel-ului" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Ora locală" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Nu este conectat" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protocol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Semnal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Sistem" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Sus." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Încărcați" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Timp de funcționare" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Fără fir" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nu" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "da" - -#~ msgid "Connected since" -#~ msgstr "Conectat de la" diff --git a/luci-mod-dashboard/po/ru/dashboard.po b/luci-mod-dashboard/po/ru/dashboard.po deleted file mode 100644 index 77e35af2e..000000000 --- a/luci-mod-dashboard/po/ru/dashboard.po +++ /dev/null @@ -1,223 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-04-16 06:28+0000\n" -"Last-Translator: st7105 \n" -"Language-Team: Russian \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.17-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Активно" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Архитектура" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Битрейт" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Канал" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Подключен" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Устройства DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Информационная панель" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Устройства" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Подключенные устройства" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Скач." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Скачать" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Шифрование" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Версия прошивки" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "ГГц" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Предоставить доступ к просмотру состояния DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Предоставить доступ к отображению основного состояния" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Предоставить доступ к состоянию системных маршрутов" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Предоставить доступ к просмотру состояния беспроводных сетей" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Имя хоста" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP-адрес" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Интернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Интернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Префикс IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Интернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Версия ядра" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Время" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Мбит/с" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Модель" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Не подключен" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Протокол" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Сигнал" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Система" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Загр." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Загрузить" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Время работы" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Беспроводная сеть" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "нет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "да" - -#~ msgid "Connected since" -#~ msgstr "Подключено с" diff --git a/luci-mod-dashboard/po/sk/dashboard.po b/luci-mod-dashboard/po/sk/dashboard.po deleted file mode 100644 index 2776d0fee..000000000 --- a/luci-mod-dashboard/po/sk/dashboard.po +++ /dev/null @@ -1,219 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-15 17:44+0000\n" -"Last-Translator: MaycoH \n" -"Language-Team: Slovak \n" -"Language: sk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.18.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Architektúra" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitová rýchlosť" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanál" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Pripojené" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Zariadenia DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Zariadenia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Pripojené zariadenia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Šifrovanie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Verzia firmvéru" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "Brána v4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "Brána v6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Udeliť prístup k zobrazeniu stavu DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Názov hostiteľa" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Adresa IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Internet IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Internet IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 prefix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Verzia jadra" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Miestny čas" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Nepripojené" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Signál" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Systém" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Doba spustenia" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Bezdrôtová sieť" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "nie" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "áno" diff --git a/luci-mod-dashboard/po/sv/dashboard.po b/luci-mod-dashboard/po/sv/dashboard.po deleted file mode 100644 index 066437213..000000000 --- a/luci-mod-dashboard/po/sv/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2022-12-04 12:08+0000\n" -"Last-Translator: Kristoffer Grundström \n" -"Language-Team: Swedish \n" -"Language: sv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Aktiv" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Arkitektur" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bithastighet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Ansluten" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP enheter" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Instrumentbräda" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Enheter" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Enheter anslutna" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Ner." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Nedladdning" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Kryptering" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Firmware Version" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Ge åtkomst till DHCP-statusvisning" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Ge åtkomst till huvudstatusvisning" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokoll" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Ladda upp" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" - -#~ msgid "Connected since" -#~ msgstr "Ansluten sedan" diff --git a/luci-mod-dashboard/po/templates/dashboard.pot b/luci-mod-dashboard/po/templates/dashboard.pot deleted file mode 100644 index 005ed4014..000000000 --- a/luci-mod-dashboard/po/templates/dashboard.pot +++ /dev/null @@ -1,208 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "" diff --git a/luci-mod-dashboard/po/tr/dashboard.po b/luci-mod-dashboard/po/tr/dashboard.po deleted file mode 100644 index d9ccc6cea..000000000 --- a/luci-mod-dashboard/po/tr/dashboard.po +++ /dev/null @@ -1,222 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-05-11 11:34+0000\n" -"Last-Translator: semih \n" -"Language-Team: Turkish \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Etkin" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Mimari" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bit hızı" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kanal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Bağlandı" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP Aygıtları" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Denetim Paneli" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Aygıtlar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Bağlı Aygıtlar" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "İnd." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "İndir" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Şifreleme" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Ürün Yazılımı Sürümü" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "DHCP durum ekranına erişim izni verin" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Ana durum ekranına erişim izni verin" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Sistem yönlendirme durumuna erişim izni verin" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Kablosuz durum ekranına erişim izni verin" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Sunucu adı" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP Adresi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 İnternet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 İnternet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 ön eki" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "İnternet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Çekirdek Sürümü" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Yerel Zaman" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Bağlı değil" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Protokol" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Sinyal" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Sistem" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Yük." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Yükleme" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Çalışma süresi" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Kablosuz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "hayır" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "evet" - -#~ msgid "Connected since" -#~ msgstr "Şu tarihten beri bağlı" diff --git a/luci-mod-dashboard/po/uk/dashboard.po b/luci-mod-dashboard/po/uk/dashboard.po deleted file mode 100644 index 891a136ed..000000000 --- a/luci-mod-dashboard/po/uk/dashboard.po +++ /dev/null @@ -1,223 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2021-11-04 17:37+0000\n" -"Last-Translator: Paul Dee \n" -"Language-Team: Ukrainian \n" -"Language: uk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Активний" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Архітектура" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Бітрейт" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Канал" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Підключений" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP-пристрої" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Панелі" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Пристрої" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Пристрої, підключені" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Вниз." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Завантажити" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Шифрування" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Версія прошивки" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "Ггц" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "Шлюз V4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "Шлюз v6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Надання доступу до відображення стану DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Надання доступу до основного відображення стану" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Надати доступ до статусу системних маршрутів" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Надати доступ до відображення статусу бездротових мереж" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Ім'я хоста" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP-адреса" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "Інтернет IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "Інтернет IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "Префікс IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Інтернет" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Версія ядра" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Місцевий час" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Мбіт/с" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Модель" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Не підключено" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Протокол" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Сигнал" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Система" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Вгору." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Завантажити" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Час безвідмовної роботи" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Бездротові мережі" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "Ні" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "так" - -#~ msgid "Connected since" -#~ msgstr "Під'єднано з" diff --git a/luci-mod-dashboard/po/vi/dashboard.po b/luci-mod-dashboard/po/vi/dashboard.po deleted file mode 100644 index 92aa950e8..000000000 --- a/luci-mod-dashboard/po/vi/dashboard.po +++ /dev/null @@ -1,219 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"PO-Revision-Date: 2023-06-20 13:52+0000\n" -"Last-Translator: Quy \n" -"Language-Team: Vietnamese \n" -"Language: vi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.18.1\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "Kích hoạt" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "Kiến trúc" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "Bitrate" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "Kênh" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "Đã kết nối" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "Thiết bị DHCP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "Màn hình chính" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "Các thiết bị" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "Thiết bị đã kết nối" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "Sập." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "Tải xuống" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "Mã hóa" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "Phiên bản firmware" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "GatewayV4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "GatewayV6" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "Cấp quyền truy cập vào màn hình trạng thái DHCP" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "Cấp quyền truy cập vào màn hình trạng thái chính" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "Cấp quyền truy cập vào trạng thái tuyến đường hệ thống" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "Cấp quyền truy cập vào hiển thị trạng thái không dây" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "Tên máy chủ (hostname)" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "Địa chỉ IP" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 prefix" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "Internet" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "Phiên bản Kernel" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "Giờ địa phương" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "Model" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "Không kết nối" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "Giao thức" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "Tín hiệu" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "Hệ thống" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "Đã mở." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "Tải lên" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "Thời gian hoạt động" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "Không dây" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "Không" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "có" diff --git a/luci-mod-dashboard/po/zh_Hans/dashboard.po b/luci-mod-dashboard/po/zh_Hans/dashboard.po deleted file mode 100644 index 983910c44..000000000 --- a/luci-mod-dashboard/po/zh_Hans/dashboard.po +++ /dev/null @@ -1,220 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-05-07 19:19+0000\n" -"Last-Translator: 王攀 <41330784@qq.com>\n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12.1\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "活跃" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "架构" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "速率" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "信道" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "已连接" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP 设备" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "概览" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "设备" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "已连接设备" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "下行." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "下载" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "加密" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "固件版本" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "IPv4 网关" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "IPv6 网关" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "授予访问 DHCP 状态展示的权限" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "授予访问主状态展示的权限" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "授予访问系统路由状态的权限" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "授予访问无线状态展示的权限" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "主机名" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP 地址" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 网络" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 网络" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6 前缀" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "互联网" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "内核版本" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "本地时间" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "型号" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "未连接" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "协议" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "信号" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "系统" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "上行" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "上传" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "运行时间" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "无线" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "否" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "是" - -#~ msgid "Connected since" -#~ msgstr "连接开始时间" diff --git a/luci-mod-dashboard/po/zh_Hant/dashboard.po b/luci-mod-dashboard/po/zh_Hant/dashboard.po deleted file mode 100644 index 3135a40d7..000000000 --- a/luci-mod-dashboard/po/zh_Hant/dashboard.po +++ /dev/null @@ -1,220 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2022-12-25 07:50+0000\n" -"Last-Translator: Hulen \n" -"Language-Team: Chinese (Traditional) \n" -"Language: zh_Hant\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:163 -msgid "Active" -msgstr "已啓用" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:308 -msgid "Architecture" -msgstr "架構" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:181 -msgid "BSSID" -msgstr "BSSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:175 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:243 -msgid "Bitrate" -msgstr "位元率" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:169 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:234 -msgid "Channel" -msgstr "頻道" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:177 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:217 -msgid "Connected" -msgstr "已連線" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:13 -msgid "DHCP Devices" -msgstr "DHCP 裝置" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:207 -msgid "DNSv4" -msgstr "DNSv4" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:253 -msgid "DNSv6" -msgstr "DNSv6" - -#: modules/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json:3 -msgid "Dashboard" -msgstr "儀表板" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:134 -msgid "Devices" -msgstr "裝置" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:193 -msgid "Devices Connected" -msgstr "已連線裝置" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Down." -msgstr "下載." - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:129 -msgid "Download" -msgstr "下載" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:187 -msgid "Encryption" -msgstr "加密(Encryption)" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:313 -msgid "Firmware Version" -msgstr "韌體版本" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:171 -msgid "GHz" -msgstr "GHz" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:201 -msgid "GatewayV4" -msgstr "IPv4 閘道" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:247 -msgid "GatewayV6" -msgstr "IPv6 閘道" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:25 -msgid "Grant access to DHCP status display" -msgstr "授予存取 DHCP 狀態顯示的權限" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:12 -msgid "Grant access to main status display" -msgstr "授予存取主要狀態顯示的權限" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:3 -msgid "Grant access to the system route status" -msgstr "授予存取系統路由狀態的權限" - -#: modules/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json:34 -msgid "Grant access to wireless status display" -msgstr "授予存取無線狀態顯示的權限" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:30 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:83 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:222 -msgid "Hostname" -msgstr "主機名稱" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:31 -msgid "IP Address" -msgstr "IP 位址" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:195 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:114 -msgid "IPv4" -msgstr "IPv4 地址" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:174 -msgid "IPv4 Internet" -msgstr "IPv4 網路" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:241 -msgid "IPv6" -msgstr "IPv6" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:214 -msgid "IPv6 Internet" -msgstr "IPv6 網路" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:235 -msgid "IPv6 prefix" -msgstr "IPv6字首" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "Internet" -msgstr "網際網路" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:298 -msgid "Kernel Version" -msgstr "核心版本" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:293 -msgid "Local Time" -msgstr "本地時間" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:32 -msgid "MAC" -msgstr "MAC" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:119 -msgid "Mac" -msgstr "Mac" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:177 -msgid "Mbit/s" -msgstr "Mbit/s" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:303 -msgid "Model" -msgstr "裝置型號" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:153 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:160 -msgid "Not connected" -msgstr "尚未連線" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:189 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:229 -msgid "Protocol" -msgstr "協定" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:157 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:228 -msgid "SSID" -msgstr "SSID" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:85 -msgid "Signal" -msgstr "訊號" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:33 -msgid "System" -msgstr "系統" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:86 -msgid "Up." -msgstr "上傳" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js:124 -msgid "Upload" -msgstr "上傳" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:183 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:223 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:288 -msgid "Uptime" -msgstr "上線時間" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:9 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:84 -msgid "Wireless" -msgstr "無線" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "no" -msgstr "否" - -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js:67 -#: modules/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js:65 -msgid "yes" -msgstr "是" - -#~ msgid "Connected since" -#~ msgstr "連線開始時間" diff --git a/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json deleted file mode 100644 index 555884674..000000000 --- a/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "admin/dashboard": { - "title": "Dashboard", - "order": 1, - "action": { - "type": "view", - "path": "dashboard/index" - }, - "depends": { - "acl": [ "luci-mod-dashboard-index" ] - } - } -} diff --git a/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json deleted file mode 100644 index 1f331e7b4..000000000 --- a/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "luci-mod-dashboard-routes": { - "description": "Grant access to the system route status", - "read": { - "ubus": { - "file": [ "exec" ] - } - } - }, - - "luci-mod-dashboard-index": { - "description": "Grant access to main status display", - "read": { - "file": { - "/www/luci-static/resources/view/status/include": [ "list" ] - }, - "ubus": { - "file": [ "list", "read" ], - "system": [ "board", "info" ] - } - } - }, - - "luci-mod-dashboard-index-dhcp": { - "description": "Grant access to DHCP status display", - "read": { - "ubus": { - "luci-rpc": [ "getDHCPLeases" ] - } - } - }, - - "luci-mod-dashboard-index-wifi": { - "description": "Grant access to wireless status display", - "read": { - "ubus": { - "iwinfo": [ "assoclist" ] - } - } - } -} diff --git a/luci-theme-argon/LICENSE b/luci-theme-argon/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/luci-theme-argon/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile deleted file mode 100644 index 44702ea88..000000000 --- a/luci-theme-argon/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# -# Copyright (C) 2008-2019 Jerrykuku -# -# This is free software, licensed under the Apache License, Version 2.0 . -# - -include $(TOPDIR)/rules.mk - -LUCI_TITLE:=Argon Theme -LUCI_DEPENDS:=+curl +jsonfilter -PKG_VERSION:=2.2.9.4 -PKG_RELEASE:=20220425 - -include $(TOPDIR)/feeds/luci/luci.mk - -# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-theme-argon/README.md b/luci-theme-argon/README.md deleted file mode 100644 index 5eb85b2c3..000000000 --- a/luci-theme-argon/README.md +++ /dev/null @@ -1,114 +0,0 @@ -
- -

- A new LuCI theme for OpenWrt -

-

- Argon is a clean HTML5 theme for LuCI. Users may
setup their own favorite logins, including beautiful
pics and customized mp4 videos.

-

- - - - - - - - - - - - - - -
-
-
- -
- -
English | [简体中文](README_ZH.md) - -## Notice -It is strongly recommended to use the Chrome browser. Some new css3 features are used in the theme, and currently only Chrome has the best compatibility. -The mainline version of IE series currently has bugs to be resolved. -FireFox does not enable the backdrop-filter by default, see here for the opening method: https://developer.mozilla.org/zh-CN/docs/Web/CSS/backdrop-filter - -v2.x.x Adapt to official mainline snapshot. -You can checkout branch 18.06 for OpenWRT 18.06 or lean 19.07. - -## Update Log 2021.10.16 v2.2.9 - -- 【v2.2.9】Fix the problem that the menu could not pop up in mobile mode -- 【v2.2.9】Unify the settings of css spacing -- 【v2.2.9】Refactored the code of the login page -- 【v2.2.8】Fix the problem that the Minify Css option is turned on when compiling, which causes the frosted glass effect to be invalid and the logo font is lost. -- 【v2.2.5】New config app for argon theme. You can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos.[Chrome is recommended] [Download](https://github.com/jerrykuku/luci-app-argon-config/releases/download/v0.8-beta/luci-app-argon-config_0.8-beta_all.ipk) -- 【v2.2.5】Automatically set as the default theme when compiling. -- 【v2.2.5】Modify the file structure to adapt to luci-app-argon-config. The old method of turning on dark mode is no longer applicable, please use it with luci-app-argon-config. -- 【v2.2.5】Adapt to Koolshare lede 2.3.6。 -- 【v2.2.5】Fix some Bug。 -- 【v2.2.4】Fix the problem that the login background cannot be displayed on some phones. -- 【v2.2.4】Remove the dependency of luasocket. -- 【v2.2.3】Fix Firmware flash page display error in dark mode. -- 【v2.2.3】Update font icon, add a default icon of undefined menu. -- 【v2.2.2】Add custom login background,put your image (allow png jpg gif) or MP4 video into /www/luci-static/argon/background, random change. -- 【v2.2.2】Add force dark mode, login ssh and type "touch /etc/dark" to open dark mode. -- 【v2.2.2】Add a volume mute button for video background, default is muted. -- 【v2.2.2】fix login page when keyboard show the bottom text overlay the button on mobile. -- 【v2.2.2】fix select color in dark mode,and add a style for scrollbar. -- 【v2.2.2】jquery update to v3.5.1. -- 【v2.2.2】change request bing api method form wget to luasocket (DEPENDS). -- 【v2.2.1】Add blur effect for login form. -- 【v2.2.1】New login theme, Request background imge from bing.com, Auto change everyday. -- 【v2.2.1】New theme icon. -- 【v2.2.1】Add more menu category icon. -- 【v2.2.1】Fix font-size and padding margin. -- 【v2.2.1】Restructure css file. -- 【v2.2.1】Auto adapt to dark mode. - -## How to build - -Enter in your openwrt/package/lean or other - -### Lean lede - -``` -cd lede/package/lean -rm -rf luci-theme-argon -git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git -make menuconfig #choose LUCI->Theme->Luci-theme-argon -make -j1 V=s -``` - -### Openwrt official SnapShots - -``` -cd openwrt/package -git clone https://github.com/jerrykuku/luci-theme-argon.git -make menuconfig #choose LUCI->Theme->Luci-theme-argon -make -j1 V=s -``` - -## How to Install - -### For Lean openwrt 18.06 LuCI - -``` -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argon/releases/download/v1.7.3/luci-theme-argon-18.06_1.7.3-20220421_all.ipk -opkg install luci-theme-argon*.ipk -``` - -### For openwrt official 19.07 Snapshots LuCI master - -``` -opkg install luci-compat -opkg install luci-lib-ipkg -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.2.9/luci-theme-argon_2.2.9-20211016-1_all.ipk -opkg install luci-theme-argon*.ipk -``` -![](/Screenshots/screenshot_pc.jpg) -![](/Screenshots/screenshot_phone.jpg) - -## Thanks to - -luci-theme-material: https://github.com/LuttyYang/luci-theme-material/ diff --git a/luci-theme-argon/README_ZH.md b/luci-theme-argon/README_ZH.md deleted file mode 100644 index d66866711..000000000 --- a/luci-theme-argon/README_ZH.md +++ /dev/null @@ -1,110 +0,0 @@ -
- -

- 全新的 Openwrt 主题 -

-

- Argon 是一个干净整洁的Openwrt主题,用户可以自定义登录界面,
包含图片或者视频,同时支持深色浅色的自动与手动切换 -

- - - - - - - - - - - - - - -
- -![](/Screenshots/screenshot_pc.jpg) -![](/Screenshots/screenshot_phone.jpg) - - -## 注意 -强烈建议使用Chrome 浏览器。主题中使用了一些新的css3特性,目前只有Chrome有最佳的兼容性。 -主线版本 IE 系列目前还有Bug有待解决。 -FireFox 默认不开启backdrop-filter,开启方法见这里:https://developer.mozilla.org/zh-CN/docs/Web/CSS/backdrop-filter -当前master版本基于官方 OpenWrt 19.07.1 稳定版固件进行移植适配。 -v2.x.x 适配主线快照版本。 -v1.x.x 适配18.06 和 Lean Openwrt [如果你是lean代码 请选择这个版本] - - -## 更新日志 2021.10.16 v2.2.9 - -- 【v2.2.9】修复了在手机模式下无法弹出菜单的bug -- 【v2.2.9】统一css间距的设置 -- 【v2.2.9】重构了登录页面的代码 -- 【v2.2.9】为导航菜单添加滑动效果 -- 【v2.2.8】修复编译时打开Minify Css选项,导致磨砂玻璃效果无效,logo字体丢失的问题 -- 【v2.2.5】全新的设置app.你可以设置argon 主题的登录页面的模糊和透明度,并管理背景图片与视频。[建议使用 Chrome][点击下载](https://github.com/jerrykuku/luci-app-argon-config/releases/download/v0.8-beta/luci-app-argon-config_0.8-beta_all.ipk) -- 【v2.2.5】当编译固件时,将自动设置为默认主题。 -- 【v2.2.5】修改文件结构,以适应luci-app-argon-config,旧的开启暗色模式方法将不再适用,请搭配luci-app-argon-config使用。 -- 【v2.2.5】适配Koolshare lede 2.3.6。 -- 【v2.2.5】修复了一些Bug。 -- 【v2.2.4】修复了在某些手机下图片背景第一次加载不能显示的问题。 -- 【v2.2.4】取消 luasocket 的依赖,无需再担心依赖问题。 -- 【v2.2.3】修正了在暗色模式下,固件刷写弹窗内的显示错误。 -- 【v2.2.3】更新了图标库,为未定义的菜单增加了一个默认的图标。 -- 【v2.2.2】背景文件策略调整为,同时接受 jpg png gif mp4, 自行上传文件至 /www/luci-static/argon/background 图片和视频同时随机。 -- 【v2.2.2】增加强制暗色模式,进入ssh 输入 "touch /etc/dark" 进行开启。 -- 【v2.2.2】视频背景加了一个音量开关,喜欢带声音的可以自行点击开启,默认为静音模式。 -- 【v2.2.2】修复了手机模式下,登录页面出现键盘时,文字覆盖按钮的问题。 -- 【v2.2.2】修正了暗黑模式下下拉选项的背景颜色,同时修改了滚动条的样式。 -- 【v2.2.2】jquery 更新到 v3.5.1。 -- 【v2.2.2】获取Bing Api 的方法从wget 更新到luasocket 并添加依赖。 -- 【v2.2.1】登录背景添加毛玻璃效果。 -- 【v2.2.1】全新的登录界面,图片背景跟随Bing.com,每天自动切换。 -- 【v2.2.1】全新的主题icon。 -- 【v2.2.1】增加多个导航icon。 -- 【v2.2.1】细致的微调了 字号大小边距等等。 -- 【v2.2.1】重构了css文件。 -- 【v2.2.1】自动适应的暗黑模式。 - -## 如何编译 - -进入 openwrt/package/lean 或者其他目录 - -### Lean源码 - -``` -cd lede/package/lean -rm -rf luci-theme-argon -git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git -make menuconfig #choose LUCI->Theme->Luci-theme-argon -make -j1 V=s -``` - -### Openwrt 官方源码 - -``` -cd openwrt/package -git clone https://github.com/jerrykuku/luci-theme-argon.git -make menuconfig #choose LUCI->Theme->Luci-theme-argon -make -j1 V=s -``` - -## 如何安装 - -### Lean源码 - -``` -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argon/releases/download/v1.7.0/luci-theme-argon_1.7.0-20200909_all.ipk -opkg install luci-theme-argon*.ipk -``` - -### For openwrt official 19.07 Snapshots LuCI master - -``` -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.2.5/luci-theme-argon_2.2.5-20200914_all.ipk -opkg install luci-theme-argon*.ipk -``` - -## 感谢 - -luci-theme-material: https://github.com/LuttyYang/luci-theme-material/ diff --git a/luci-theme-argon/Screenshots/screenshot_pc.jpg b/luci-theme-argon/Screenshots/screenshot_pc.jpg deleted file mode 100644 index 4c355449a3aa732fd06f2b69fd6f6bd1f0342647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673706 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 <9F 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

3fNN(I!%o6!(io%Ea>{!`= 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 z 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%0A9b24siOI!3$VDy&gqgCsc!e{XLM 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

CT{pxmNUcw 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

BW9zrHP>w3I!v}o((L?t| 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�XmH0BX8{7Fo+5_+B0y51fCh=1gyC_ zeXDGwYgHUUY2B>`nY(|p5Lr|Z&k_gB0`RKZrt{$GR&#&7HlmXJ?(=0}j3Id2pjK2ft}>dMx~ z>W}yai=Pg_+G}HdKJktlogUT;b`9NQHB(S=c{-V^8R5$P9T&rtl`H&B``6^XQ~+9o z*$Aq6f3+s)1p}wf)Z5fwY}Oae&vPGjtWy_F^v=FNf9a^;9`)KG63`7#io^EVU%0AU zlwAy|i-PQ6`BZTPX-s{i4xFjGJagpmd^l(brCt-s?ZGA(xqS0m??>JCXCk817u(!V z+j!tw{TnCOQva{G8|q)%?Euwe5)ajWuR(S{vmZ}NHnxhfZ#vniXU@L;L+Sqbx63^# zYgC<|rG|r8xXKaAnxnXXp|$=TSO=*bBBdu`yJ%=q(eb9d$_7rEt>p`NLoEUPA z)pS4Ae*F(_X08G~3PMj?cIESLFHlwcLwR@75K-VFY#f{VO9hb6jI|s=N81GO5E%Qt zthFXfb=}h?CKzjJMe62t>;0sF;OwLcs~;Le2@w_2QFoa8mnT;wWGj_C)#Y$9yEJuN zmaP5o>IuISjN+D%#tVmj9sFH;bQ>sRFen5r(*V^=@4}0>YZ8`VY$>?NJ*K*q%@zO{QZ8}%_0odHPtdZ=k@AIt_ zqb?shL(D>* zxzX`uS*i)(di1qty$hS3!0@fhLCR%^fWCy;qimvw;Tj9BT79?2bo=PrDw9jVu6(mrl^&~#Uj)9p5Tu@qrHT#I&`zo|XTEMN)SQB-*lg)Ap<;7HpEk1rznhr~1N1yDg4+)X0Z>Jro3 z^6Y9y&p+T`cy1Q55<5)Vu z&K;p+1-kqa=qy8>oAF`7Z#%ox-NwH2 z<+asxCF-Z3j z`zLKoR+u=Jk~m>Q>#z>Or$C%5KpFE?XEzqF==TGJnm=&37ms}M(pPlyX|Lk$yKNYR z78JvI2|^75ay`s3zjs%mS0OXs?DZ>eCNz3x#?I{_Z!Es8aZ&ZR9E)8VB~DwS{=TBH ziqSLeaFzWCd4lUgJb_JkuO?MgZ7;i1*Q^P?_Emu}N?$}~&vk7rbDECXNn>kkscYPypSKW}?9KwkC4aH-%g8hiJs=@_yTkqXDwB z2~hglbYRO;@5;@pJ?EZ6@1FYOqg`OUgrO+=Ve-{aRG%X~fiP&>l&%=QWI(&S8%B94 zd|{N-5SVJ5CuK`zNZsuuj3jPKk&2DZ%;AjEpf}yg9k9IcnHXqgQJ(LiAIri$MhTjn z{vd%Yw;tAtB%%M$kPUAYrZ?LiD+gi}OMZ7!^WqRs1L4KHV2&}7=wnS|`l~#Q;bSAL z20C5nBY0KkPJNaMJ8jU(7-9@Tj!P(=f5=FL;j7^&mD)anWJSv1h$csEYU2XOpN3S> zWYs_(i*6&RL_p2-PClkvd!SKt7hC!(Wb$KC#spE-W?>iQ7Qrud;E5v#h>mf&I)XT; ze<0li=@7kCBVtVH27!9VczV||T}9gHQtk93UIIm6ptCg-Uv2EbKsa7miV=_U-=CfB zGS*^KdURn={FnBXTxtPI72x3$`gjb$a_a|mn~mze(=|VqNF}rxmu)SH#xVi4(A1_0 z8)_CC-G#4XrbpAk(nIh}*><8d5f*V(8q3g5CSI&hl9{8?#{4y%;fe#RUPnq|5*vZ0RFn)Y7(Q^w7P zY@u8FzZ@6!(FzO9Fa5mtVes{w`2fnlLNY(!n)RBnYG_u!ORXLh-A%trVHx#mR`aJT zq^gcN<_;k^P;jfF1UsaRM&weKwhK6^;}TMZyA8J@_Xkv_G{!32#BIwY=F?~sw+Me) zvr+YrsX0}Lhl15=%UBD`f*te>?>RVfoLGO;VdoytH;%YU%ZJR_&6XrM0*ZYspJgMz zQ7hz*@dRx_rWEmtAJ_oSSZn4Lai@L-ilm?a6GI7e|dQ z=L`~2H+|W@_Z6hLlj-r~rC{oD0!!3lk0JMwtr*lNsLnH7=oSF~uHa6?-lIO$@49E%8qX&EgnasZWt z$F22&zd)@N@NB(T-3QmCD#b|23EMzn76?ups{&6%-9=@kPRLY*rrP59Y1AASC-Uw$f-=VWjRRck5?JZmVvN3|h zVoNcM%if;#mP)b;3ybtSck--+iS&{QcyjW;A%>Mz4;maaUV#gHBjcanEWi{ zeL^b7_GKzFj5HYR=q7TL;PKMzO!!hFM;NM%1-j|=WffANp1(@%%JHSJ<%1*SAhA08 zX;l`azI+V z$_8&*l+B2#`upjXWO&C9gS1dLxuB(w+z@Orrwk~S&uc2Iqz?a)6S6X~;rf=0q?6j6 zM3)yS;9C4L328FbXWsZKmjfU5VX!WoQq}$9&obZN^_PI~s&5lZ5nJp-^~ZWidQ@vi zv9pxWYJFMvjIS;u>r=%~r?pYKU^5FAkrRGJaUvOAvi`GVRGsRu|KMopqa*2Elt>z^ zkPPWHGf=PmA?id2JwwqFm2;Ut_n@7M9}? zO+v_gXCcP0@7(m)j5E0jUwtiKtvUTU)L6NWG(SJBq`_5n`kA1PdSlNvfcrj2cO58l zPkyTdsXh_#=E#hY-e>4t3Sb-dVi?PB=i&L3&Vq})276Kd&6*H7J8~ybWITTF0rO)0 zgs?Z&vhn?oo^iw=LjjM%u@@YC&9<5Yb>-BZ?Jg#|kH(OVnW_;|tLNVba}_Y5>93(` z@Y3e6HmU~ErCe(b@S28Ncr8Xa*S}pt!Hlc*2T@5>cV#Xwr6rt^!`+RB_@ATa3~Vvv zmhPug;MuZTw4O4n!bj<-?>kY7vAl@SmnLnDTQZ`45%SiR( zur9dIUPw*dI=Y{;BePS0(j+0ViPr$N1Gue_(6_-c6Ll|)z7``;>t}d9^u>Q$RkmiY zg(9$#(t)M#ucK5*9FQm2G=1WB1k+7z&<0aeYUH6sME5Kq)H@kUbj}n8&0&p|Suo|h z4#7P?aQ~$~8;j8A@t5J=KIY3L3%@&02lqpWLJv~V#pCNY3(S@5`J+a(0V}||NQb7V zq+;rbAqkg4f5sF=iX5e^29DU{txf>=G$d=BL5ko&6J=`S50@ zsT_Tx$Q0xt*1+1nE_M0cj9tj4INcvy(430>-Om7GC!X>`W4QEAlw9V~98T4ia%&Tu z`?I?NDuMm{7L?j}X(eNEh^Y%#Tb{;VO92v1=LjqyUk2nH=wvV2b4433jI?xmG^o-c z03}x4+%$Wpgm+Jp%y!Fu z=Lx6wx7RWj!bsBWkHyVyt-wiPW_N-|Nqn00z1c`<8kBI3)hl?UKZ_c1B zl@(YLl&dyhy+SXoP#W`|*0(bbPYBRXhY5SOmnK$ZnqQlXP z<4DA`W#!+Ow5f1C-=uxaRu{Uy<}5uPqkz^nSqs#WGOcW;%IkwcmRD)}GYxh(@lPKu zd-<=dCg8D1W^wtu2RZWOX`{k%0!0oSr+8Ltt)XZn@N3RHEhr#%*BHO?W8z6<wyk&hr!Hw0R|Hj$rSHf#LmEpU+k&{z*f+0Y)bz--@Picvh0fme6;I}wf z`v#}ao=fCBiNI^ZHSlo+$?_uBmZ5Pk7HvOFhI=sBa5!vm=9&uMIi4Fm@#iq0 zMv_fq{Fs)LLbx!UCpq;`T0+<8l80mBd^ezj!+}>|L*6g?@@^wbaKempLs$4}o1weO zH(wxCl2sy~P^-l<9ejWcX8y&N%!As?U$L}%p=I<(I5ROUoPHT^aBHT{&3DsP2;wPy zmTtR0#rE*t(we^47@)S`$9>Ul;+>#rylHF!-^g~X$X8xyC0c3spjHRUQLrS2u4{v9j{NrU~`a7h6-IVmcljbN=eg8G5-j%+%09^#rLnd&G;aQi|c5up9cU zfT2VU{@&ii1DMF3IhOi|RDo{&g-fnI+;;QEvWnKwl-xmCgLT5oZIF?7<99JqIkxWQTOZg>q_Tj z+$N;TrYr!$^kPdr{(PYb3GctX^iZh-SG-BbcE#fgyM#GtLTrF9-X0`{?;?6{&1s$0 zqrc2pl*QPJvBjL=$FBo;m=z~%fyn1GPXYEMf$O)GH$e{buZ#Qi`Av3mT|W0>aZ>X z2b0qOg|_nl6u#hnaxX3%_1<=H;8|(byh%OCb)TU~<}MyK-zCCj)VE9pAov$$u;xqQ z7!V?`Cwr^A4RNU>8kZmXyVe5)E{Y9By)o)XG~@g}{}z$eir%O2cZj?Crw868@z?og zi!fACm!IbzvYCoWUJ>+lNy)W@I-sdyiZq&VvYsQabBevOt89(ke1`1ZN!l$(9`Fs} z;-DXRp#OAWD%9oZC{H%giURYJ1+}zU`tr9DKZjA2DkU25U$c#E)<-QzfsQs8uVckL z-CIQbZI#4gSF1Cx9ZPrpjd@);?y~conuN29=#oNAU)V3G5kG7gYb6dnNY|5EK}*?4 z3xp%0YpAyJYlrSvoB1sUi)89bMx>Pfd|o^XQnwX8i1U|@XZ+$CuQ4)xQb#u$=_Hh7 zIdc7LBqq*c?HNz*f6`+9s;jSj+c3tnkN*#D`^zEtAKn`681s)c*t_?<DI@d&dgbo9~tq*l8t^7-x4 zgx4E#mGx2@^TsHEa$E=vI$IJ>l@z(BopCrU($>UMaTyYRh&|}0z-vCN&K}1QE>|4Z zMZ~Y$-2Ox-XZ>hg^xbU6AwVsSyi(`@t|PiJj(U!|kX%8$sG{-r7xT^6$SfLXMg%9b zLp;0tm@xI^*TfcDsk^cFXt=w~TvN@Wh4Nc7lgTkM zjq!$<-hrm{(ighEZc`EP+VSg82jd=G6x@Q%(K z*8ascy5Q3I;{QvsLpEXF>_t~qC)wB{nOJZ3bMxR|H-TJk$LfL(;n6^Q^G~6QSY>S; zDcTBw$*7M`Y`H)W;l?@QRrJBtHi3yLWD9x4W$X$MB+TCJC#Ii;Gbz6 zu8y|=rE1smYs6DU6pj_vYrP@|F_S#`S9+;%>dIx20lUju8>6w|bJsSZ1Amc-Ip@+N z0J71C!es90y;Y!Sg4|X<(Nt9jT$;;&a8Xxe0sh!7@97_|#v*Kgqq%o0K>f$x_Oreu zaQ-z!fmzRC`+(7>BO+??$ugqKfm)F6gupO!!z%7GK8QhWJ1UN;Cr?ky+bYu%K&Vvt zyYNSVkzOJzqz+Bk!3Ou351)Kzp|sV7(-z^B&l<%6Z$|P{%S`^qtenth!5cxl14&9k zZJ-t(<_m03H&w7T$7g_YDSS$~l z4!1nK&|7vbo`w1NR0QGeRk{GuEAF1o71JvIo-PPz(8SNQtGY& zC!Z0mb}?&Kls{?OQFy}aJL0|MI3tJ1suYl+u{p#cdVMNjMf;1&+95qfEY0#u%%$A~ z=ik8#2}=GQof<#}3}@){yp0L;&;Z>5O`6P$iU@IKEoJ>^3*2muihyWh1RW-ruH=1$ zVguq@IEvRImejD06hC^-VeYp8j`8vx-iA(>rW|s2=Aa+_Hr-}@@!_CSV2c$ETBWy>)(vz`8t^QYm&4w zH>D$N-Ba01(Z3#g_|kPejOy?FtLdK^AECHF{B^*v?vT8-6?u`P(De?N`!b3cedV;R z+|-@c^*cJDNNJq*N$ZkCJg`gE3#Qi8Uf4Qh$6j8=Gu2rSb)0;fk4pNGgp8=tThf+4 z&C%$0qrEPDeO4x}$$Y>jXGK-haY2ga>SIblIbt2}_5SIwB}lmm^5w*n<)x1cegtE+ z2q6lj(lhxacO&QyoGu%Sj}ZXU~`<#+`}*PrAW;aua*9y(IiblMs|!J zD=$lyvt5c6bjx&V{7p#po#^3O);qvIx1N^rSEs2XW~(NE7$MCZ!rMRh{Cii{V{^Yi zOUJH}H_YRCtKUG4*~-}U`~e!40&|7cLJJ&w`2Cq!O_NmJWB%COH zC5FEaq<(9|A++T@yF0VS8UwjoPdWHy?(g6*{HVRS?AC>(iyeryw1BYp`uMxK{RNgu zYAdjCxyQ&dctodF)@OSh8;1JLiBGiLbhX1&^%r+E3md33F)X>iG|@>iz6o+fhvd|A zU^_&6H?2rqB3S^bXP=CxT;cSA?FZ4#PDdNmv$Lz)d{usqsfU@sKn`X|9O#avW9R48HcI!mIuw8Dl#iammiva681ND#%&@5Y04Lt{YCS9$ zI4Pe#6&(w~dp#TO08i9Hz`uSjcgB-ZNN4--mp+L-k9&|uJCsCD-2IK&%qG{-v3mNb z=!;dI#d>G90_tMiKlVAC;!yE_%l7B*d-^xPFz$-6=0_%-@tM~gobaL6F1J6X&QWTPb0983@y!q#yr@vk zzr&doVL4MQ{)JrYqtY0H$686105AS~kkg1U#WYGOKUX)w&*OTxtjAg7h3U{mz4pLw z_&>P07htQfe$}iCa9$2c#1koct#(z{#?$DVS#Fydu^@>nXNBcK%1U$z;Uu62Eq0K8 zzD?>Q-Ft0vgrFGM-H0zwb}(qm5Z=4|1Dc3~sd5k;KQNRyu#|WM5@CEy|*EvJU##-n1CZ3YC#65u*nQBJW0oN#C5@oRBob~h-ZTlCc zHn1z{GFDK-k&(Y$I>sSNbi^mvffQdP(uyQNx@HieWad*k@pif>;Ws*piBAbgf@m`z zQ!I6*C1?8FPPh!76aLf&x0V_+8y|~C(acp@xE>P2Ke?{xR2a8nus8XO9ZL>rtBFbl_Sp(A$4DE%AP`}}v+AozsiWAMjh z+Nh7SCXG!xPER*8Hu#98@qLy?9n2H3R*xbOFYn8bX6r2W_&fdhYi@I*0L7OP%cCtW zemC(e;%jHby-gd(hLcBw=g-A3YqFZb6<{#Z)a6R6MT0PwBGx4pviY*r6^Q^M0j^@{ zsA&{@wX4c_xz|!}Te(p-FKcOFmkbmu92r(FkbH|}Wo!nx1XK1pjL>SW!B<5cHQ4Tv z&L0OPxW7F+oFh6_@;6XNlJt0G{!0p!p-OHQX$pJO75IDqG=KN`78EihqG5^bTBX2x z`D?nGwc_UDahh^El|%P!g|Zj9xurbUAiW-ND!iX}2WxrLS-5 zBN*vXm`DzfE_2xFWb3cT#W0$$;7ZHzrSP`ucpq!avkPZdGCnazI-f{Ob3ZgaKGEC+`WSBpU0czE{~L>z+$dC%c) ziVA_{Ca+fwZxg@ufyH(cI}~Tua1qwt-iv6ircezVbY$kk@ni#IGyA%oi9m>Z@j@_r zDPd#!pkMP`CTw#sD3IL{&CB6c0O3$Sr?=%1i(UvUEg@`=_0({^yHgXkVtfRq6GyD+ zg2Z4|C$(yLQy;YGubH>`w|;kFdn(llvs`aA*J6FfybDtri!U9I(2u<mZsH!Ysw~xUa7F{9heN&tl!Pq;o$jb&@ncjCuDSrVi z!?Q5`DPoa?HQAuRFawseyFcb$&QWpX?3k$%?pYfl$Q5bceVrPaZ1`Ul3ZT*Pro5nxo;O(9%vFI@IuhjTe zS}FFjYflEqXm8H*Xq`5D~~)Ix|dmZIyz%z!HAj{F|{ zMoIgz^lH2za>eE9S{k-2fCx(?Ua>u2xo^eZ2Z1JrbQCWt)^v%2?2a6}4TvuQnCu1* zj9F2yJD!t!`*R5vU*l*QI$v2=S3R|j*wS}7_+=(=KX|kaxu>s(DE`pPPpW4B7!T*~ z?3L){*=I|`96QF^yJLZWF~TSGEm|$V_1ISOqy4PY4l%!ULsmi30Yy;EyvF=k{aWSk z7Ncm|BzG}!UmFf@XR21y$Nheyn1_6=m zK{!FzPsP#B7K8d*vcy)VP6%$Fb+*2{{adCBVIZAQ>Tf{3e3nZ=C-u;E%}_n zgAeCB-(t1hkF!&w$4;Y2rH7ybkSX4~qh1jvILL zuEZd5Nv+g@k$kJ(iqVE>pLoub^?37Cj>d9;?7@@Epm*r`Mi=gG^3Tf+G^*WVggTJ~ zv#tn{kIVesiU_X~2~Ou9oFPN4`mz7R?-qTUm*xCV>xZ|D#_t}!A1{6HRkQ>$dZaWL zC*SVdws$iMxh~)SPbkFyBH{cu`@g{$hm@C?A1ZF+%n{)af|oR)X!K%jtUVCRnWSOf zqB^6@kV7Lv_6(nK+M+&R3%rz+v-m~%XH+BcToPC6*$Jnk-7bhu7Ww_pS*r4q+z2742X3e`jny~ltHPY=D4DV)G)jZ(XZ?*lDV5cCGe5a^mycI*yS&- z3eHs6viL$X5KfhP6wOP^;R{e32ybw(c61}4bH@fd6yc0z#&D~S4wu8?H=hw5LjaV= zg^P9Q80d=N(*$F7Lr76LG(yq8NVl% zMg~)~xU`U7yhMV)4~uU;?3~k*4jh?lTN}=hnd^;Kf+gnd9<6Z5-(j6KI_qa|NZxB@ zwU}eSHC;P}4M4z%ZOASYy?D@;L9JfPan$v7B-I0X&?EDO*Th38;qEJVC_+3_mkeS1 z7}0I^+2_ZUg{50Fa(iD=Qkbm`Q+|A6OWoeua7e?w&kmy^>69qc ztn;&%*IoaXjO;oA)5aQB-~;01JJ%`-6}c_OFF54+l_di+!5ZU3x6C5m$nBV3JIS8< zoqMoqQuNP?VOQ9{e$ealyDKxh10^RV*BuK7xTc7O!A?OzWdfCp2%(dI)`h#o^EMvN z^D=5tzBVFQe8-5Al*>_u4ayv^s~=C-2Thq!qBRa3jhfT7`HRg=(FQs@uPsJos&%3l z#UVwhWW!hs@p^PLw$|SK)?`UVt{Sd9^%p0IxtNz*`@Zbb7BaO(bg!K|5PtMo)wjeT z$YH3JeFE+NxJ?>4|NXnP^e5c1=U4Y8Rbs5qF?t=VO(S{dSyz7p9qH=DOWX}5mNnb* zvq7{jM@)-)j17w`p$TC_HWJB#XhQyYLc3bY&-?|c;>!-6+~K_b{q?IEcqFTW^F7N< zqHn;rZm><*8e7yL4ojEvMb_zIVA78tnxW7t)t^uxdve6VE1l1OaO2MFH%ohc@{Ik5 zzz~LR8X4#1Gj*C(m>ity3!8Lp-A6VeJmIy(B?FXi%Lw+8TpF4!u#WVr#<9nORg}B^)>+bIMsfkIuOz!`$4VC`Vc+M7WreHu zrA-c4Vh1jtC(nS$&yrO3TP1&vPix2oO$wsetye~(oZfmO?EOnF!OH^60tnJ(rv#Js zEniFp$dA1{^gwbr+3QjRH=P5NS;pbizipHlCpR#c(y#D8b3gHi;6h<%Du+NT%N zPUiaVSbSofZ@bZl>~qirqSiB`Mua+V{NbEKN~B#N zy*U@NyZ-cH54)Qe=4q+4z-|#)>_)Pmo8qfcGRRg^7CR@`}HGTSZ1*F-BgPfLrJ}w$Tvol#W|1ZIV-2>+jO->hKI|`{mo72{E(PMHWTL* zaE4V$3R^6jg!IJk8i20~g;cF8+wyabc0Dc1zy*M+BI&3pSFXwrRdvuG4f6SB$mmThcIDXUbzSK+w45Utjq4)f z^?3N&XmjUXGfKPZ#mocD7i-R>mb@WA2fQjxw3 z!awb@ z!KcD>P-4L(QT3Jn0@~Eo%uJ+_ScaF`EHL?gDdr~1K~hC3+} zliFv$WJhgUA>O)HN(TOROt5G;jGjOFT8mY&A=yGQ$Rpa0N$|1a4ye(7;T82byB=q5 zDZAt-@006kpnwre6Z$g+Eufm>8$I-MZ_Ru(Z*s*bM_mN=xo}%7@00Zg!2<_QSmlUU zB&+yhlSlO`c*sU5qKF?>OzIgBttm zhqky#gcOm$tmK~}z~!AiZ^0HFXU`Z%w2~3N<2dyFiL={$MFXA3 zOWT%+E4WpoUhUS~E^f~ftM+!)&ZLnjI@w8%BiN;SM>M?hBlIM<}<&DlhS@mi2j&Jay=}O zAqF#ERA`yNuIov-)|pDb0zu=nJY2^6kCDD*v^&d^bk-);?=t&*8>`xLud2V{IMq#A zddrc}fjEqbCIcV{8sy~%;TB6DDh$rHBz4QZ!^cdz$o3RZ z3Us$g#T{%YH;5T=8aX2hii_Q=W(9;K@ATSiKJ$+yJU(yBkBc^ZqYrAt`T1_oZp<5^ zNlMrC=5Z^t!+Ul|82aL`(6845hQ_J#+}R0Ur4ttcC-EcHc}9B3mDiaf^SQUL)P)f; zndeXxd7xgZ(1TH>BwK}1cLQdGZT35qIjBuu7{)F+L@;{_jKL3qM6;3pS$Z7TRjKSwx%a2_ppHa zKRSoV$?3>0O$v_(2ef_DnpIv~M1dxljEa<#)*~C&!d`XBq!XPnnK0M2=ndhvT)Bso zOwTemkt2F_bawkSnVrlnfg?`&)hUEogL)2;>+~62u2f9PTS!k_$q^lH7rAf+*@T+= zKS6r3AG(4Po97l!t~oRs7(Z@5VM-1NMhVV&l|?Bj~^_t9%Z|x(fn}o;9-t=o!wfQp0zAFC6ps9viJH>|rrQO_7#9sw3y;l({m#8=-W6|z0 z9C*WfA*cY@?jY{!rO6-=C=C_%Wp0d?zicT=-krGtg}<%L2I3Gv@tjUqn|!>KUA(K0 zlqUI7ZScYNX@|GT#Xqn3BNX?}P^|HUI*LH@{-lFdCPfwrPt|nBN0c+xq&nNaobCw<PDL`s)%m1eR(e5UFDgz8h$_SE*n(BIBxc686U@;(K}h#r|n9A zU!PkbZ#Y^}y21eNxPAYOnatofkSCrl%7~4mRk`Dh=bEr-Gz;lnuH7c!y$AFa`s6(u zwo)I)K@ zY#CAM@We2;%#RE>ne~44y+^~NLdlXksoAYsyV=l4;VjpgnK@m~Ey*OoA-;S?U$F{! zn1Gqt_nF9dk95{aX{z4ujnH{KRCk?9DGS~=QTf`lZFi~k@Tu-M{YQB(5RUe#hNE%6 zRCaNMFJNQ#F=dh-hTF|#Ig^>0(xl}?I#2i_0~8QKZXza82O)e;CW7`B=th*6Q)A=4 znZd@AX^(MMKiaXNI7U*V1V~VgMhsAc~~jq z;JAcPaY=b$dR31J;JaD1=cCqJ^puI-Y-P40-}N&|ueqfrgBY5IcxBNErw5FDKL%8R zk`Axi++laZ&7rLL>)N5EOl_i{<8~340ng{l2lEZ3g-#|L(=VGGL zt;Dh^&x|&B2`HusWB%xUqV9j)6QI;eS|aJ>WHT*_fVR)~3>H*IC%ek=OT-x4RT3?U zd+94(L|)`3?^KB8{S?D{DPqdO#HPqRD>7h0go-6O_R<$G&CS6SN`rOPCkHLXO^Pgi zj{8lO37R`FYQQqr>(@f*k0!2P`mo6@9D%6^f~Z=AgJz!7`qeDNo04IMS%xZODhean zYVsl{2SLd@5PkBuOc5%vb%bIWdyMsC>wGdHx)SWvsv!mlvkGO|7T}^r_1k6v@&W@4m z@%ODj+-s^V2JeBJv2aQdVVUPo%1dlCv3*ysDOvvftBFXF z5~jZ8Lg$%p0AGTSI59vipRxt7rW2;?mH^-oKpbxsdTx@v17apBs=ES-5C*~HPO=bf zUR$8Fh4dHx*~^?mb`#M2+u zYg_UOE*0(Q&o&WJ4?iNaj^x^$2zJj&c~P7Gq^BZ&YfwnTg1+-%`1XN(Q_r5m@-F`e z`2+Tv%D4j_XxIZ+w`S3^h4ZlAqq1W!swh~W^Q?)We?4kUnrY#$=P#>KHCpBx)_wV^ zcBt}z(d%qSrhHFcL=puK3va1gn>vmqJzd_D@$VuQ1H~gBX zB6d9_A-Zbbd?O)392lpNS!=^T*0SiBTsZf8?tJBXL0;=31pC;~!)d6s|iJXiZI#O1i+* zZz36$TFT#!A4XdvxxVHC{07Ls9?e7da66v58W@t>s35&=y{MNR_G@2@77~hj03Rh= zyf9TZU;Hw}_Hbmo3j#_ZT_JHA%BEVwO7|bY zTO^+Ccbt6y#h}C`dm77=4OCMWt+&{*1Lp7VL<7z3ILq0G;f@KagL*-F!p2G_OAoU) zA~eas^nw~@k!mvPccVofl@EqLvH(}@C!EG`d8q>A!iOdoIB8r_ZosJs`Xz3OIbjzn z7rS^1yv4WN2a3li3frs)+ON+eAoS!gX+W}yB_BZ*2Xa`MJ>&py~iJw zSh#||h+dz^*Uz>h--!X$tLZzr31hv7xf;ri7dzPIE*k1s8)e z#IO&EtWZL`PAUtcUdL3w&}yS#)V-3i9`I;1CIyW##-61#ln$qq$sn-sZy}9NboqeZyiT zH+GxNu1mLLw=Los+5=XTR32sXJ{+r=XO1j=!TN5Si>xfeDKY((L^&*COLAeQ>`1@O z`E_`B)H=F|w?(S00_s0(D0#A*2>1VWxY8!@SAj8yn||&9r)U2nD_FlbirkW0y7}!{ z2^CYU`p*mU6%zQ2aq;wS$o6wK9_Ofr$v?`AgqhbTf1p!(^@o=KEu3Z-HTq_&_#dET z6>YX0(qOiM_#`BE_t#x^;w9BX7GX+@=yHYX@Gkx;hiB>v$h|q{B7>Fi3NvL+w+!ZW z_t#E3@Z5fQoYiy5PMYi>!4+vFeT6>D6KOHy%(HE`(i{B*UI9IQs#q#>8ODKJEx!1` zD^lsqN2dM!Mt}F;2@bu{K#K%2@JB;5%OOUY!WB?&d313mGkcz_nbCi0`2O!%yX-<)MbDptum`+4 zlt33-6{H!b1P$&J+JHg%_b374{MU)k0v)15qgZ*|5d4y@XeavzbDVQH3N~}6w<%{R z%+Iu1p5$Q%4#8qWiawkaHbIC*vSUH>sE0?Np@j$+t2aUznNswY#|A1uOZA~ZKFoCI ziOl;=mP~ZS0y`NQ|m?@^@@$EESTxFxum2nAMvMK^`BEEt=oD`UF^!+I)|p(0|8mv)X~Ox0~x` zH#69*wyV@%V6cvcW-Qew9OZT#%!$1IEeXze+}7!t{|untn)(v&2A?OO37xUF>3?!J zE0LiNrXh71MfjVIjGbe7wkUe`J_)-LNb@te=6{D))#*Bcm|Ft59$^wskUR^@op-&$@&V?%iFo_~8;H~@!I z@o?|WXm&nmS0;z(L@I~}wB>HX`r+g6CHwgqvYejeU&;6o-<~)hQ~3#87qjbgY0Lh1 zPRD=aEtCD%#uqcSi1RcU?OpBMlOQnLI8TTaQHr)LcGh5Xt8X>_d3*momy?sWF-85O zs@Y z+0kN$Bl!!tU@VE%GoHZ;5*MQR#4nQ%z+|e9;l|ndLWC!70VVH5Qvx;Uqzl8Au02W$ zXxRH*VbWFa>Z8c02Fr=M)w)kHJ9SJY!o?j{dv) zSqoiT6q$X9HO9jSIB@J`8|?t+4Y6;e@?GpYktw%$1z%*S8L&2R-rWz57)7pxlDWceY}ohV953ifPVr!}c>IicEfBic%+p+PQR z5|1tSz;6CgC&2O;x(Vlp1^V++2(DXA#W%;#pZy%GVyy^IOMXtu9iL`$rioEZTTq2K zhN@wFwr5QG;7t=@kVdeOgeJ;5VQwtS<#*#Ky|^(afl92jo1U^;GO2X1oOO(yr-_i2 z6I5<2eSnueYe4dg{20Yd?jh|T^UD^QFBaoZxoOMSmgU#KDVAA{t%84u4-E~etPPSQ z%MWcfe+a-9_1H~+r`gP{n^#7}W~?PgsC^hM4zncz1(qXi#Wm$;O9{Y961%*vElM7D zw0l^8NZErT*YsKR=&377TSyEv_8I+yw|LTraNJ(~x&~fNn$hWMmvC4oW>1VbrDI|k zO?HAg6mBTP-h?+SgpBx}v#mo;qFS`S@D?w#5H&Yyl`TK3=!TQ*f@6-xZA!^oaPd(9=`9-}p14P^O|W0jL^eA`u8@ZM5*dz$gHv z1Yxi4&zPz5`&a;e)aS{5U1Yhlp5@1K)}^%3eZo^)`tJ;{dS@qxWUG$Tn+I)^tkOgL z*>-JG4EvOt4Dig-#~Wc;s8P3a;G8pzbyLWFJRo-KS3NgyeJw;u0w;_fK_g}?-Tr_wH|>B1P>cRI$3E>FJhcC-?JmnTlMR&z)_Cz z7`sOK2WgI(StUKd6umcTp%;F((mjGDJ_$Q^Lq6MmyaX?T9yYT+t$~Gi zuvn?RF>^xaeBO(_E!-xSSUje4eg4KUQOW#kkS%yui0~sc69_a$L@k{s#VJF);jRP03SYe7@$jtog)cP$l%j!8D0yVX9ZaI`HyURUjx zi)Nq~5SU-F%u0-U3DjnH^7Q{+&5n4wiblf<8^)oShZZtM$Wd?2BVRa#P z8l5e30cqKQf}&TZP$b>_<$0W_usU{Zq^0p#E2bMW?84IkvUhm^nZ00z=zhoi1Mt*a zwvPt+9S(S$Kj5g?6CAe^D_QJ&zcDL>?z?(*V$Kxfx+bI4R?oWHWLxZ&*))dwAZ52E zL+i9gGRHo_O7j4MC=c?vHMc?a2E21_v)`mN5xy&h`gi(U4!2Yf3J`gJ&z~JBXh7?! z^zLt~1r9!6<1e(QpAc!&eIAEtYlB8*!lp`S<;LxE?!E&Xn}BV|QENnTmUv1swWeCoK_RKo~%8t!4rd& zMP!=P*7^ppqv{^J4TH^BU)d$64s5a}D*JQf3xL8$08kLSH1+of_|gb)h?V2PMhxgn zWGo|ywt<(CuCr-kDIn*2vijdSG1;^xMQ%*DBlpu55At7g_9d^4b1@?JL|U=ro-{~^ zr_M}@>mkO0o?rDlH50#3^d&lk!t(5Uxf|Ug#N4y~*wxeI*1E#k5WdL!C?^2%%$Q_j zE=(-{t)RWpNWkpNgOk&!?IiSe3~)p)N|DLh?BLhRFZLWKF8aD>g?((V%eaOH zugX#>edbD4X;W>DMhy5!TrL^Ai8Y?>O1QZTv|r&U-t!08Fn?DWsD1-6A`Y|Vl99rU z0RRG7BB10r@dY6&gNuzvx3URpgY8;MGsnj;Av?w?7O$9N4J!LALI;Pv(|EZ z`L4deX07))!Lh+ja-P0i+-8hL11NZH41`9(RGn-VviJU$Nh5slp<`0+5^ zqS4gikfC1#`y_Ro)H){Tg{S?aZN?#^wcQ6Pzbo8$YQ8g&4#d^HHZ69xqx?J~T^Rae z`0U7w^jXbO)azac*N}cY_=w{qXU+Wc0v)9;x5qT`HV7iYLP>)1yKJ}8OwN4t=$r7a z&99#3-Z8_5&VX4$;(#U!T>w5tsvxAIdlG*7yQdL*0ycNHt_oS@u2isH%pMis&%$`( z$ACX9Zi-2$N(i^4swO2~L>aoMCH16yUvA*6A65r*Xyr9q$k76%y<{AK`x-_&5_>z2 zL!AX*+o=;Y$SU_HA<&F*xvR#10GKH1$7FZhcSFT_FBtJ~rupFD$Unlxu_pylgA2f+2LaBym5`QedcNvXS=@ZRJ|<_LyU7I|QpaecG061JC6bC$li%CewH{I8;jNk4ewlE3D{YGKO?cnP$!Leu)tIUL$hFIkq28vL zSao_jPoI>keNLZ#OW1c&@4KCN z)4xaMF*V1GFNd!7XGP;ghJ9!+lr~*X70f+15oxpX^SDlCFI?*rp&(Y*`p+xWb(12z z&b*X3SAUjkdtg-ayt9k)`UVOa3+Ha^)SC?1BW`vshfVy)c>^`Qui?s6Vv@$za6RHb zBX#`COVYqC_bLI5;|jGiI^qZ&gKlHvuY@W!I=QW3yNyWGo_X@JVITc?iMRTJ5KHf* zbQF4wzBrs=UR{#dd@^2E#(&eI`XrXItfXq-jho3}>3~x$(c36|r?nHuj|P_o*wK#s zf*k6;>gvGQ1FrbCNj~KfE92&!W4Q4oaXkr~b{Dr19t3D?$lq|1fw_!fE2o5zhzj)l zoG`M1La2ow-|hROO6Ow1AHFCMWPW_<042WPQs&ciWe}>6aYCUPzSuQDInKLu_+&|C zI-Z&4>561JCu&ZK^8De&$m>nHe2bcG^zDNVD0otfbuA4#Sf31LymE=XVW=eYeQ0?g1Qoiis$Z zS9J*khUyH_#sa#)DPR#wAWtGn8Mv(6giP64n)I_1`vZ zlR|#+<_P(&%~=8=657xd03MCs-mzy()U6e#W9RWpSJZk~hyDG|g>)$r|5%4EDS$a} zmuJw876H>2Np4J6Cq-_FIYuwcr0LlvJ{Qf>YTGLX;k(J_$qNZt|+;i4Z1g4Pb4vli+L8IQ8I z#4jd>{N_td0Z;I@$aVD%+%%#HiGwU+_!RLK|LVr1XL9$$q3_v~YrmoCTItpX8lqdE z$oT~mOYajp6M4T)7mIWml00uc3svrz)Cb8 z(TeGBzmYo0b0WK!VbUod6&kE7fVi$fkhDL)O0LWZihq1CgobS9ky9wL@h4#W0-5ET zmcJ%ti#)svcWt+&xiL@li#b{~ePFZ%>>w1fw=m~Hdr@(I?!9M9@L)Po_l7)m}`G=XwbZ`sjttQF(VWmRN>n(1+hmN$C z&wfS0DY696;~tH+-caM6i;+IS+TqopOLd*x+B{hyEIQ^NfQyAN`vJ&6vTqbu>LPMh z()d4IT$hEs1L(~t2e}GJeJANTK*MPrcA^!j%IW`+tCtvV{K2a*MmP|KJynguh76f#j=;Z7VXQj$ocQ3iLo42Dbsy z(6pL-p*QAOpi3TMW~= zwH$9F*K^Nixh6`pUn6BVjbKvg7ug$_7db-D$zKpu%F4=JzwDk^{|ETkv|x{m99V`y z5Ypvw`pNCdf2Pl`{-CdZDwc2`*Xzcw#ccN~d5KVAtb6^G#cCC(b@ciM&Tss33pP{w zs`Fn-UMkJxCkZ*cj?B|~w8E{UYvPy(F?eB}UU+W(y1k!nQRnJj-w=JA;rs5=QNnvx zp9DD72|4IJbt9i-JKs9l{CB^*`zqo0?uz)hsz9>-AE0wwK4(1B(Xr`~UG%D!TX`Y< znbnCcp%mKhkJ^`|;Pb1w;C^onV*71gl7*Br2Fn)49o;o>OQPGCLy}pSlHcEt$KQef z0jy7bJxvMX}jRh33uL@jby?&U1^e3$6^_wHoyHz~O8O zpGE(6v-uzRnC9+T3A((00MFq+${5EV4&?$3L2Np@KPcv^ih_S9IIbSSW6#RU%aiVA zpT7-yS6jR`Ray2jx#hR`&rjtbqq6Z>kW>TL{b)z6V_>12+HdxL7zT!g!K=NH z1d%9?E2YCv4*LH9aVJYvZ{OX<{859Yb7gflG%#IpGa4^t^cSA;YE7HnF)V&kcy}v* zADs2?xt~w;bm73YD9Kn>_mLr(YQw`Iv+Zyw{{B1oo)I70hmIp}ywCmt7NFTa(}hZG zPBd;${+7ev&N!0%vPQDMZNNl`nL({RdnMo92#=Mp#%@B27z2=DR1chkFkYKez}tab}!wu zWBe;j=34e{arlvJqisXq`d0j^Qi>{;^RM-hsY|SvH|4D}$!staV%PqZD+RT-3@SXWL=W11Yn1Qut>9p;rJ(W$Z-&qN{Jj;11Q{|Y8*6_W zvM+TPT6vo*`8<`Thnj_#6d$jVFltW&tqAIlbTqU1yRe+tfd3R-XM>$`z8WOK$0iZASd%p9B}-uK{ptAt!p zi2N@Gxx1{(+ZP>NR1tceYGFDP;!2Ns{E|O(_;$|jHU^9mPs%SUkS3u-SLd7UCqG7f z?^QL^5Im=}o+y7+4ojv$j@p|a1IIj;I<7L_U=B|E)=iyf7uH&i8z=CUn!pOpVy3Gn zdK|#xt7Px&4M*(SP{Rm+shD8i?_IK1K-ykclH5gjE!A|T-JJ1DIdSn>_n4NvQ9+## zmi3y7iwWOpf3YsNjXCxnxifjy&(~|3kGfwT7gQCbazF&}gfMHNhZWs2v2fI=2hU=W z*UOJZ5A~kq>aTRuRE#H0W~zFOq_cD5b@Z36cfFw0eIa~i**MB2fu^@?sOWTn{~S-u zju8Ah9h&wCM8&we`PsAZT{NaIR?k(U&R<2WzSy=1wf!n6d}YlD>7Z(5w!2mO?-yi$g`E27KqJto*nZR$Og^{KdeLoy9XDy!soc~ zR`wp}*+vqR)BJIO?|qk<)_&~lMS=IF$;ZPgRJnf$(CEYH!UZj;{&35`_WjkPXB16^ z`k#149b%N$Al1(WS86lDwY;q3f?!_WEKLYeeda1s;+_2hnWt6?>a)hK)L&ewdH>>N zd}5m(%j!|#QB8PiN9Bj#pc_6X4SrnR$;r*4Rup0yLl(M0tHqA&CJKEpD*f5rbs$`j z^CxZPnL4R12*MrG#lwSuwf?EDsd(ct5~PLr+iQh+n07_TrV{1C7#w`kSMffQCG9ie zU9zcmie_t;ajj`&FWg&JPIjjq_T8VkWS93HD?&%tA53lHo*ltsK}4qLrvpjNtE$L- zw%9L;6>`*--OaA_(Y-2ne~#l8RXY^iwPw6&FUIp}kTapU2CHk4t=J{x$^30Wu*7$z zJ((tBdw<&n?6}l%NygwPH7st%a%3?h8gfy}^^RnUQ z#822-chzoesg&niS;p^UrSO`}kNY?uL|OqKW_W46#xh03?v&hZpO&jCFt_YQ9c2wU z@$HZ6N#ShqNL(HxdV*0wwd>77_U~cguH{K5VXQ=tdty(r6+}a15=%y@^ONPvk`eg| zBH1sIrn8R=$0nWpu`?&Gt`E;Nla|oP7$L1~E*N`ek$XPXR{YtzU=u69SQT8p*2;xh z(m&CE8P4`A<`tu}4J9E$M$6cPWxlp+^Oek|3zeZWdGPTq*rL&3i-Ul!x^ST?m2W8b zq?<0}%d0gmZ&^TI1bFIq5hzANS9Cl|M+uLPFSO5A2<3mfpjys!9ufYMm}S0!r9OKz z6@*@}e^i?Zi+#EP({{cHP<&3nz(CX1VyyVgB7kZ(sGpE-hq>NCJ1==z-BdrS!){3? zKu>-?NPH;hwar?>vPOe0I=gNi|HIg|k-WA55Al)FA!em)*)i2xA~RX^O6Ps1CygVq)$+9{P=m8FN0w$vue)4(z2{k_ z^K|pLbXl?SolDs#bB82<5=>p1KJ7Squ_vUm*%bd#m!AOTb`fX zjZiD4sWOKG1!6VsuJ;UnDRX+-pu`LY?X=(+Hjb6)zbWCBb2&Qt^+R+Tw(@ezm(GJe z1;PZ+Ql?F6qvq`$MfCVA_yojDBT;3gLucHm2u#y!qcg)T(!%gb2mU7jj`x$0%DC+A zJqK&Q(4?LV3n6;~w7+p>1|RK{v?H;EpVIoxziEvDtGqc+={X;_bnbM*jgrmPt%~oIK0cvJv??7!(R7K905&@lt zGGY;clb?cbFh3X}p~0VOjTCq>E3SB`Mq%bHsG3s#LSj^ei(j8xP%ZYYwen*F8^Z z?U@ro9n8TH<8Oan0ttE4U&$Z*vK?2-8i9kMqP24*8`PV7@g+42u%6@L`jNW1B~9~* zt4g{|#;!zsB0m+)17?ew4noaB-9Ejbg`q!$zY9JUT@g!Nuo zYJaz9`6PeJE4>d01#Uw;@Vc<>N-roNWw%!a)vVgUkg{H38^v6vZ^}Oiy zP*WW!ka|p_Y0z7mR>}2saNQsur)iAK_=NOCN5gFIzM|kNkYGvu-JhlA#MEpugQKj- zLkCw-kuJVHvsDil6R9p;|EL=MrI6VYYC0jLKk%h0zpe(7LUp%ps zOMb3RdHy`(Lh0DNyFJ`AK2)Zl&n^Wt-^*&lzhx>xQLi&nl0MPYqaBKkZ=2;-Z+;>= z&pNUnQDa?SbE#2bR>n^Nj%uV_6O4MCw1%X!mL+cHap_RZk=TP#>IRyZ70P-|NM}7Y z82TwID?42p)+-Y#ZY1R!W+%Mn{`Oc$+?%V0NKdr%II9R~mYhV`;0VMVa2?~nrD~99 zDS0?`a`pEH^NnzY66e{b($JcMyMa(sFAu`oU-if%M-DQulB+rMSF+CUy6Z)ePH z#5?AD;D2!E%l72l?AfnfqS_1KchH~s+-Rq>h7F(|LPOcb$g%IxNZU$OuA`vO%DahF zoiiQy@It_%4{Kh zkS1G++|nzdS^-6r1isL7AyIk@m-%Gwdh`!1osZ(|*1*Nvz51aILg@CB?P8IxTKfec zBdeqej*9XnQkRnEh%PYU^nOk*`BF@wRKp&}cF`H1|d zIJ;u=A}VHS;)am*dGD5)&oeC#mmCkr5#}~6E%s)ag%B1hnyEKwFx>vSqvP-q{pnRpGqQ<@E^P#x5 zqnE*E2-?76Q0>E=n?lnme4yqbie8OZ9IWEJS(6L~={bg?$M_IjkOfB-GwnviCwC*m z)L-_lR5DRcKFL4fMI}Z0iw`tj4CO_h*K|Y8812Vto+_8w`#Sy-LrykTlv$)?+Zcz{ zY#dL{0*Hx^4$n-kXreM;;_Nk_+dd1(H+5JsE?&>o1E*A8|9yqdLbLkr0iCmwzA;w4 z`}Eo^Zu2XhfF>(#!rWdwS3sWe;=X zQ>j?F-OwP6QYht70vS4gU$1FjAiH|9W^&YXl+iKZvim(coEqA8O_-filu}x*Ee>p( z=u==z@UBnh>cmPwoCJLM;pI+K-f)xJC1W>Fas?a{Ka--RD4jt$k1e0?Eb-PR>u2Xv z)O<|cT(l{n7BSacno$8~8;!|adoI7h3J))A;^*jGiP5!Y(8J@OT&~T&wBp{I>4628 zXF|x1SS|G)GqC9z3Wukd1+;{mTYfuFQxK&6zVD6TUH`-M#s+VCQW9YkYsZfqo|Gfj zeL5^+er5C>9R}yjgK-pjnH?9CbOUASXKPsmIoThqU;H#N^hR_?nbG~hi_KPBUUj5s zHrCGf=gi39OxTwLSsx7J87$H}+Y-Via{j0Y4D z#2X+|I~F^h>um>wJYF^X5S_OCyoQi{aKROb`{a5i>Ggt^(k>SxQDxE|zjQFM5fwES{UFF(uhRA<{}^b&x8x3)MVq1MUyEW}17;hFm|KN2 zu@LW^w*xOY6*%OPG?8t_ZYC~AFaVs>Dviw)=QtUMtCMo2p`mZDqXB?*2Xizy`a=YeO-D$ zrJ0_*xC|icP?aq%N>&6+r1ov3&9S!VUO#mNA^jH2UBXtoF-D@GNci6DnnH&Xo%tFV z!xiV6Ki3yewZS+rjWC{#SNK1MIGd;EBZXKA`xL}j6}_}|i&y9`bu<|0HSh1;fAoCH zM;+J6YDg&DD77yM$^QR_|34r9eL2WoE~V}5RJl1nlDn*1o}hUB=-||(pH7~u@mf6m z=jIVSmn-S%mHV6DSm(2miI-P@{x^unPyZ(Wm&(nX9pa@Qf0mcg-(ejmH-B*{$eMJ>O+s!RP4)CmChu#A8m?-tICK?qZThyOi`C`z<<&7_F5J+f zo*p#{cY+DkuHY_2sAd!GjE;_OyLy_tGJ7+JtEyOSeVkND@H6?~XJ#%^--Bums-oVG z{y}4&i`5-wg&Zr?PH^SDxDW(ORxBf%VsU7h`!e7(EXi`}uWNE?9|&SMh4T=UKi4%& zlbk^J6w$7bmi1en(q_Ty7%RQ+Dow|AzyI`vl zL~%`x<&rVkolYj^O6PQX`eh;g`lB0?Has`Xp4r-mnj!>=oGx@Gom^$5qwZhxn>U8# z^p>lbP!5x2btq9Def|i?HRe?sz1O3JpP3$Epx&O>pRQU6R@6!d9we^O1jteR1JE|& z(!WgMj`^C+x)&-xP>Cr^W0p&QQDL7uMDS2PZ@%~o!$z956LGjo$Obq6Y{$i1{TWL* zi}d4}d^@R!c6#rfc=MOv>;BKtUlXO9X0z$4W2Jw90hN0w;2XQ2`=*NT_Ft0x1MJ?H z?+W!=CQO~)vH1M?z@2!Dx~BOD0MpgYwfNi<4zP{iPR~EBkCfXSE@!vDGyLDgisjZ+ zE_5{kPOG=9+Coln5S``Ye$r!G_*5Hct27UeMLNWfIe-ethmf1!%PRZxCKPW(QV3)2 zYd~Ey{gLi-NB9#M2iV(`KOP^u$`*3q2<^w^3$zr37w<|` zsTW?J_sb61XTS%#Sav*()EmJH_8T>apV&&F7J|9fbsro<0Iw{#CcB$&0Qu3(_9WC@ zR1yUvI*=qM`6lDy2tY4CqH+qlzlLEpFrM9ZX{7#D4&lu*P+{Lp({(IzA<*nJ0HZ6b z8|`*`a26L#1zI%^4Q;J0!@Tj=w_FTJL3>D+tWZ0aNI{k_w!~fW4<}X6W`Rd-Rk?u| z7)f43f}(p#>J!;h+TzkGn!n)}pn^69&Rnj{_CY_fD|B%QG)ihs3QX;V*#Rwg%wKaZ z4zPM@a2$Wam$;D-u5gDqal$>QxslMhqTcqormMu|O}$Vsl%@X3C@*!5$&l;j)!(9) z@==TSMQ*Fl<*%-IP4$odI0>gkMR5^4G@#R$(8>i(jfWlGyt5X@`5H_tVz78rgm$a7 zt2K(b{8h?a_2X{9_~2`_poPpoNJ}Q_BzrUT&1~sUmUR5r&4i|mz$$jr^QfPR_nI{ZD0bS@_-&5^dAUb} z!Pe)Cvi1FYJJv0lz0F4F3BJfwS>2;pLG^=tZZqlJ8|}kizGS)&$>Wj7Aqle2ON+Sr z!@}NGN1Yt3GtqEV0126+g&m3lZ_OZwH-7KDv^GB4T$R^azp^?vIE9>ee|m>5RS~i2 zR0@??LQ?oE(Dl4t>Yuy5H-hyw9Z47S7nu^~vmrt0(4I=X4AuJ$;VlnNKcbpx|; zfm|jG0q7GsxaP|)amR^5_ZEiS?8f?aq582yDt}WGo+F-O(~1dh-86EdN&cd-tk(k{ zEr_at=O3OrP=Y!ay*Q7`8q^yG;D1iAs*_(H^_7}!bwSU|-4+ZvmpJNK(nQbqkB)sT z)ISG3uQqYmsUam>Xib&*>;vlbl?qo$A;NoIH$b}qPnG}3%P9P4Q=K)NE8rsI&biP# zhAc$OCY3TpFSK6d-0`8QEj`a@1Cv`zX&>+n48J;U_GC%_(Q*w)(lcR{E*p}nC**nN z_-60T?gn67CPvMWJl>V)AW*<~9nMNj$2;*ynnNPf&xhM}Bl)K;r6S^~%(*hJ=h}C4^*{SM)JQ}05x3bq~kD3 zMk$+*VTuFmokNNbyHJLfD~!po?kwkL`$tHZAW*04Cm4KA{LOC$8(`&>`))7mQ~E3~ z-OJ`;M04m3G1=ut)*UF_3RQ>i#s@^m^g9s*AI^ z67Co~t1$~OA#N&1sGo9CjrBpC7WKmgU`s6U@YZ;V7V=t=oOPw=PwIWveMy%zODtW& zsCV2!T3H96mn8PYYn3~~I?m}N_QV1(jlfcVnOMor#MISgoyF;3@}zDZ zvua9Jl|-9NsKTLJ6Y)SJyl}LF)Hs=ymFxm6U0%RqA3W%WPYu$$qQ5LS7|S>FY}Jal zl1IoqbNs@CVk`fAC!c4tcRW|UV9Gzr!qX}1+Jkv zVa7{D125Jk;m9Tll~6=qMcb+6v#PjsvPT0?)5JoUwj!-R635!Hu~($Qgt`k}*z!f5 zppL?3Rg#^~x)LnjRX&b2cL|pj_gClG?uTRNF{%pRv~z^@_G1>E@>0cf!6lv7)? zQc(TQ@Dt$LhN?8qi5Pa3si3eoUw({uRLCqhL?pc7Dh_EEm2lBPc6H3PPF|o!<2cpE z<@fzf`A5kBd^^dtR_J6rm$1=Ru~s)TX@oT_Xv2cVq>8)}(dqEJ(n9W?cJ3LTprj#y zCvM8vr+ItGB>9WZYFBj&ag>6DJ~LqwaiLwj?{MH7n{io#(C5VgQb$anVLCOY!m#{p zcVr42kLALxFkLl9x$?ZQ~G{S*^(kg^-A6wOPg-%<=?CIo>&xrcLbA zehD6yR;UVkfU8&7N6#KYC$2TMy~DA1Z6dZJzYwqM5pkN&fmA~@DUK0?^5qCs_1;9B zyWp1SvDYx;K%)AzQM5$pp1QgzW;cWW<6+uk?6Pq3<)Wt0%8AYAW2G*VjTxii4ud6~ z0K19uI`qMl>!P(aJ+6FmvRUDZR8=7JK*E-C1&DlX6&AEMa**}`v*-_`sRYJ{;6Vz_K#J zhVatbqx~jIR@9Z=GF~Hn_i;u#r!F<;P~0E07#zyYrLaKk)u?w7QfKy0{vHceN1K#= zBzzRd>G&<8;V{w#-X0P++GNyJiNzz-ZoM1Zkw;oiqB)#gQ70@4O9mycuZ99nLA|0A zfep^4sW5VvrEb*n2b$=*hwkI>Lqj<0wCWwSgPdjG-FAdq7p=V|f`}OD zQ|hxa^t=p80)#oNMvK%p)R4Eh?AKE%(&EhYD;Fq zvFtEj9Q905qBFtL>=H_Gs)pv8M6|4C$oxbiwuTA77&*IO7|Lo}=1k|hfI-+1Gb_9c zHQp(2^s4f{(tt*r#-m0)X>sfO;LaaIjYG%opBYL6Yg|J&r0)M}>SXAz8E4{6qLa~y z2H7hL{Q7O{_+3|?oI8qz5=AA?WU4LM4a5hLE5^H`YJjD^0yrpORd$78<+bM~^fW79 zxRBLqM%CQcf2oeHdRFAow}K*Nw5%^y zoi;Bc+DB*;YKN5=ad`r#iDoJZB7Im^CD}{ut8vkm4*dD|T=XoxHm*=EmnI<1jAm;c z8hrg7_e>}zm^vL`4TB)ryS*^1hn*T91u9gG3y8Uu7l*^g+5;D%b_Ek^Q3-zB0l&H0 zlhPSn0$C^Ab|;WF62kzFvgnt;si<5eFQqq+VqY4f(W4=^*7B zoGuNQR{(EodE{*4Lh-|zcGD^R!*bHxuwY8~f;T1PX}@68n4d5-gsiN6=#V~}hIiIE zHe-B(N|x-L(n|q38tePXPgvE;h-$09`@FibCx*O9Kh0~nh2^!HYZ833(UBeZ$CsL? zEo^kGk6KJDzwNlwYz?IQwN)9)7}~D=;O@|zr%2o84#Zb_@bi?N=^bJIR!=9H#+G7k zzIfpM5pT;`0)HcD3XyTeL&z54DrmY9{^U|UVkRiOaydhez9Rr%J@|VNBJ@Z)Cr5~l zK{>f6!^J~ujsLu39cN~jjVY#Qkd%6qz%T%1iUA_%PDBvKv`WaQ4ks2^oniZ}8hZ$E zo0a572sZuHH?c)NZE2E|zuKZtq-RkzZ(ET?^> z7r!~@eV+RfV&X}MgO)Ngt{VMq7=dh*T`YDAY%jIm0PTt=F!3C-Wyez!mGpJv(mo9x z%6g0S=bk3~nuix>&NlK|-n2oi)4GUF*0UF%(;A9o6{tgLEZ0Bckew7+FT4#OK2%RA zFk=Aw`i9xCo&u8Am#J^T&fU&Go7E{)YnbG^=dPjojgVrjkJJewU4y>38r;FpcR8!4 z1CRhnk?~=e+X=_!+`0%PxUwNE(V+hJanaCA&rmE%R6$^lItugbbL-RyOmOpB3%OsjK)PJDI>;Ju5;oEFyui2uNu$}8+q@uZzUiK=o%23e% zdox1{hfO*p+r4i3p~ByR>kk2Li(8(1!gC@ka>CN={v&0%e-6&)Oa*fjD&ze>AZY9i z2O2A&O%-6Q#!_9kD$IQ@t4zegY^XS$%#{RVf6_H286_j*S&rLqGPWJ-2epYqg+f~k zEdfDY&rnH!UB(T0%F+`bPN0Gkmse@zIDQH=T1?bdSVb~HPcCH<>LF6}W=C0t*IK8V zmWIqnyEmI&3aDkc{r#}Bq#xBdiKz@Z8pF~k;L82bmS^)H)R3^ix#IaJ=qaPtNN~$4 zX->XKxqK!`p94ziEyaQ4aHCKb#Bgvu5D(>uN{A&}km;TzW44f$!xsP7XULErNN98~ zv838#uXoI$psk0jc~)ZB<~oNT+E&{)zASX-Ar2VfvWE15xxc2lZd=Jdu_wwp5^jw< z@bPMRUU|H-q*5rwKfl!U2cjUGpfp;h_a)=I$m@Zk_2g>h@@!-7rjm3}_65rie{_X) z-SZ@KV-J~Ot6(*$+NC7gfzjW_N3C@tO=sn#W;F#f^lA;CY`%6E@g20i+4w}ataPP- z0d6f?1mCTzsHFqb;ch<3@J(q%*!uAxDSnlWtM$qI_TUi*(k;?rPTc5y7N3_K3z!)l zpR%x9-H}~at<2!?7NT#-IZm8_Imph=9j*$BbWudQcW-fX3%WW#r3s~%MN4ZZ^E^i= zVW5nly;M3{D#|#f^6U};0LnLA7kKGxjGsr*A6e&xTci@noiC1a%|pR=}qpp@7D6tW-ReZ&YVcUH6k^0ucH zw`cSmI6y92*lwOu>BeBX+A(3pDbj%Ysw}Hvho1r5E0?;5QdHeTQ{38k8ay0a>n9ol z<+aeUs*s$bvSJKL&R|MX;;qogc^_OQxZ0Z#HHh+|R{LR;loP`5%W54>oWje}!@>I2 zR41XiF*>glsm5$(N;lvwb`nJN=TRuTksRVUAr+c4Hm-YDCDCgCb9*X*UC zuVS%lVnfQvk$JkN77b*V$1Yfc%`XKUmahd}U<&1o+ck%t%an`06OEqEW*#z{#;0zv zs=YFiZejv7XOsMke0My`GCFTDnI<8Z%w+bfv)E^&){Fd@J*u(-PwYPc+5eHK=uw}4 zBzPi_)GhwCQ78a1F39oz18_eDEc5xwu zVHUv4Y{DQ+XU}I~nXqW$6TaFb$j6KwlK#uF=J1D#D)trA#AfRX1Z8#6^P|dPn{qs( zVeb>zP8|5IcNZn~!u8!|fZENtIpU8N1~t1Vu?hz1(zj*aKcp4n&+V{xo6N@g!h#Z3~r*Gbn$Zyx_-N0TedaFYdFNCW4oCW61WP+ET_ z>A)P`i9P)hAUI1@biuFZIAOmOfILGWIN5x$3g&~VgudxgZ*pARP|$^q-jKnBG!HFx z)s)b_@A{h;jbPLDNk!CB?qovDvpsWKK|LB+FCCL~k_TDET238VK zd4ll>G+~{#%Q}rtnbHvkZ5=N8#I6gw005r<4)pjxxE}xUu<#7qHU}S|Lz;#Pw8jIQ zI@}yOh;GWZ7SyrpU<%WM2+jVWQ;_fN z5sO|zBh+EV%k?Ji%*Z{ge8%JAZrHY3o+4A_h|*4n`?<1_k&=A3Aw;&pls88&z!#c^ z2iJ5L0@9O)c-0hAZ0TZA@mWfS#|dAtIMSAd6mof5vbyxPbwM=S(othseNJjHFhKg- zsYD6rksy6SrPzoIOej8~ZSy##^Ysq5G`(Ft5GsC!gC&{^$+(C6=?@v|r3)zpYqG{` zFi-MNHEnIZ(ec7AWF*8$_-;SnS|v-Wywp6t8nhjq(blz||D_DDRakRRjGHG3Dg37qkF7QX}Fj|bK2N<}Z z33L|e#{JFoRU3k(&ntzKmFl8EO87=5JGb!2+k##{LK=l0p(v*eP z?WXdk;-E!$H7}{7fb~Nk8ZHlXte_tvXnqmm^uVBi1v+imexkBJB^l;8zU^k!9|Xy zg4>XZg7X<9r2`gltxig2Vr~I@SS%V|?$@eql|pEMdAap!8Q_cD~7#xZKCF<;Z|AFn7GOMWHuy47j?;a$t+&ofmJs*Ut|8jx+&&$Q=-~9gvmDgwvwQ>7z zrm&Fz5w%s%(7R||2bHSk;zV(RzoNdBFz&_t>2G+A=7Z~?Fx!NMaYYB8^57++o&hr@)Xc_q0`g(^jlZhH1rQ$|5u9@0(Uq4j}f)jcLt zmcc)yJDO@fpJ@=#GY4-cCT(Z`-9T*8vSh9ZOI2!p639E+DdLPVuZz#29pbapAw#MZ za2xnF{8NE2bHISkHHpbhaICW~{goJr`NU}?0DFP+Ms5o@roBIL=#!;F*W?KZ4|))- z%fpv48Rg0WVpNJ=8YRx`H6?;?vtyFBy5lOp$c~s_owFQBMXrP38 z20M4#wabf9h7yQB9d$)t0-2(xJcg{C-R<*OAfZ^?7dbH<0vj7Yo2WDx-sg zmNY~SBuQF^60rZK&#bxUAU16W$ER&Sb#_s^+)J^hsl1_hM$m84sZ1R*$EB=btxbSF zWZH~J)(^%LWvp(}wxEsdsT{CAE>BKz>XtaSqE*|muXO)N?6p+6gSPFOeX?8EGd1X- zLVm5kPLocYK}M;qfueU#F)@9DnemuOKf(WGb3Glmt%c0mB2JK$ zE>pW$9IQ7je-n<`cVkOAX~Fz4Imbb|w2?RI&|rJ_mdAawHep6R-9wH4%XK03`s`0z zVtzngjsfwAXLo#ucxGe8_+-RV^4Iy!PAlX2EQ?l4YTlfv)JAW+0xs;yulEp#KR;`? z*(cAbsOk?(Lp!J;{ucB~fFOT6lfAR2?MmE-nhPZQDY7zE^~|=go<^q#JVTM4peXHX1*{ zkl@V%p)2nl6WC4aBJ0Vjv)`iif61Kmc zFc|7$5P8p0^@l8V(Pb9ig|_0T!BRenW0i+DhHfLK*qNl3-$+hsZmG z6Zrv_!H8wYiW9)Kip-LMB?xM#C{y1<&uay-@lIIAp8V#(gM>fNJ!sHJ*tX>T)OYaO zIxR(dYjZXm1cCWW&pkf3E-PhVu$OFe_9GFKNN3sCnM( z{#J2`2kBPm%9z8}?KPep$WVJ4sh~t&(s$JG3@(l9*b&)J-<1SX&*N^>qrH{2DK(tTpR*= z^xnjdYR{E+zK%q2P)&G+b3uMTJ@d!GY^iE{N%jbPD8Ro!^z-z5 zNdUnjzzM6eJLTp{tnBTjajbtzA&J8;$YZ71S3Y??}v*qkmSg=|r)hZ955k;cC+>417!M^1iK zW(bM^4;`GgztAJ_=-3`D0DpG){!X$p&?Gih$fW-nv7E(V9VLf`N;=GW$P7S;IB+qH zJK0a?&vVwH4*Gfwp>YYYLUi(Q*deg|*sWXsPJ_HkZ|mrJwLUfBK4!$Zp(13n(~FUK zv~m{l5t@J-xDrqtJU}+{)h~}>l9Y{VoZ2%F=%mL~oLCVimo;(veDxiZXoZ&K@UtgN zX*Wc!20w^c(a8XObU>feK{n%2&`QvL9juA5W{}yV*CzS7y~xY@c^vO}1Ev;Vzy4u{ z-GIIkEo&;q7k|Mw@eyVtaSoHp6wLyl$c1P2R!_tGY8}JZ@VTWc2y(9 zD~YC^dEKp811~aK+FQ-T<@KN(8Ex(#j7x14u*P=n(;nLH8L7@}U*)rNcnd>QseMl; zx~DWqZ!6(5O2b|_Me;5t?xKa0I7~j=3?mvi`w7+rMa>DzL^N?TreDE<0os`J6|IQq zsNrb+gV$^Kg^9CY`=5t1u}JPI9t~M`ROoO_w%y9;MdN7Anwnb>?=;RMopt{>(+t8f zRbW&0=@hDE@yqumBx>aDbrx}YD*x`RJnIZg--V*%KU*g$V%>P&?(*8ta~$j8N4T#` z5$0QUK4*pO$D^l2C#`1b4T;DyODo}~$y^26 z@+QL>8@n-QCQi(&4?OL(cwSgnx~jE6xVAT*D=9cqpBD!^MwPvF2SfFsNiEafm6lUu z-1Z~xEiv~w;(-KlLd4N~m7VkwBr-aS=tvDWh)$bs!_$N%LDqRbpX@R`n{KE#O3u!; zh}>~sY>Lys8NrH*Q5WWz8jC6RK?8>KT*&aa7~S<5NR7fAhk)A4}0l zB9Qa>NR)*aZi z4mhl_aq|Y?IIeItnJ@KP$z7ItygQp$^kVh99oY11G99sCbeXpVIDRuLx`q8y?N$aS?q1%Py8$5np^{g z&CurgCV@c-Lg}!jMNkR+*Teaxz+L5=S(*`P#FBX7l-?MGrilD+P7zUq*M{ER-R)T1 zM4ycqI>lS5JDzsH()FVpv73d4qQ@$_>q;ZV!%iD@Ov9Il_;4q@+DAB0cq-}v&OaC7 z=YeD;pgibJMd7R@JOuLlPcB{2ZOZh8i(#$kcnwWy3rf^)I&pgBRBIkO9%O7$DW;cY zi#26obmrZ|6l{;l{v_q4bM4^ZTBJE!-8RQef{_DR#%z{)MU6zB0w@?Smx*`>wbp>D zcF*fW_4+UZ>3vFmm)4!Ov8aS2bF0~Q*!HNBi6Hfk4!J}c7&*daNneYG(P?)W>P184 z62PgyLeA3tbxvX7DPUyvE4R_X-^FD1R3=;EKV%D$2vI;RLnAmFx27#^?HC}86#ut- zoY3RcYsnj3mV(vwoEMo>)h&4oo8a^e{92 zBFi%Hsq-TiyfV+3x`0XO!^cx8aJTdoXKi9~`d5c%Y=)F$UtdAOmj0G{he{QZCtSsNJ zj<3qCcIv?oVja}JJ8Jl7qlVHIAp7>x(Ur|r{y?L;35 z{l{uB-ia{Yxh|?M$|+!W9%<0AmBK!@Il$_G)t>3Glm8&vC@ilzP+J6R=UY9}8q987 ztUeZ24sRIhOhYb3)xC6F-=H@#&MI?O?MtLfA<%TjeHbr}uTz%v*hsCKvxa_7XJ)ci zhZ8IHYs_-P5zz3vf>hFKJkE0B7;^qxMSo?bV`XQh6W)rC4ZTmEjMeR`J;zJtZ<}=% zL`IUQz&68x4%n5kjR__LR+fEr3ySPyec&oJ#)v6;?j%{RU%EfzmWFj2fXddrAqYgi z%I=c201{jd@{%1uAX8&1{EVy1w%LpU*Rgsz>t}HA4+{HPGmTi@W9vIc@eAz$$hW%l z`Lg9NPJZ`OTNNjWdXoTmjo2rXhx7Wiwg_X?=E|YmNWOVERtm&Yob8e-5mTFriJr>R zs4x~{CcHdtqZ8Ir%Cw9x6QR+$I!&}D@s+NBGciTmV})&xp{yuP*M~3@rv_ib_~MQL zy1RHib(*(seLKU#xx8hnhifFzOwppHi?c#f-@g&Ln6QA1-Yr$n~@(Q_CA`)85O{N?3}GK-nJ%qeNhY#EE1YIGliV#@p9CGtmlq z5BO)u?CiwJMbfD?d|yJFhQetYx{7&Li*s{iVD|^v;yYA~AJ;+Y%8+UsY>J$fCCrJv zr(sdspS-cQ5Uj4h-(_67l4lKz9~JgGL7N;l(;<#aOY&!m#0cx_Qg`eJ`=Yt-*c1Xa>6t`E4er};|LAk#~`=QW34oXUmmD5lagnuy0Iq~}0o8vHB zt}nMl5g7Qz7N5#L&s8%S4}25p&%*P{zrFy-t?HM!O`#eN|wE1BB3y3#o_ zA(P9iV|HFw_fzggb-K}P4ehYY*&bN$)MA`WUDmko;TdOGOl?*xFy~MUBi4$iOx>Eg zt%|1pgZAUzd7Lb9t8x)w^HNJX5(?+o7Kq-`9QVjPbw*oJI9M8n&}jLEp<_j_sN*?K z0e$1#gRU&zEl7Uk+?H+?jdhxt9+NX##zt_<^#=|gW|&2s>1Z6xSi~I8sQmDkxKw2! z7AgVQ*K=tILK4a9W|=~gXAQY9&1MGbuV|R-`G(JQr{gf;C~G;4>m50xt|NjJEDVlW zCxL;7f^0w`p>I0QCRpL8wE>zfs%4p&=qS8I3rA&`XE(al(p_zS0%Sm0YsVS0k9Sb+ zSgBnR#~MMR)`{86L%D$%u#qRsV5spo<{uP&us72D!BMN7@vU?2FBTH4lv_Pw76$29 z0w~}+y6;}TIu|`Clt&T_XDCLwUQMIXHm+P+5fL2D{tMDwg%h<o^c{$Mom!N_!Rt+2!>!e6JzEpJAjC4|Q99sk_ZznUk~$xcH$I;A7g{4a;-rYu z^L9GC(?+%H(ros(2c#j}ktM}+Dy9@xE|11c%J1b*JoGrdAIk-#A^&K<$v3zz7d`6G zn#$Qd%m_<22Ei;n-*um~Xmb)yre(HK%DxZzq8wn6BgHKiDzq>d4vmXuTET3QCsZ72 zT9(`v<9)Xm8ID&Kmd}!uAL~;Mi57ZPu?5KW8zF`jXY}S)>(ueH^PvF-m18`6H14E?^I14R)j&{^$T)xbyyg zxY}wyxiI7br{1u!gznaI3w%E0rJIRtzBX2u?`_bnxHShpcMGe3=UB1$wYA`ToDgJt zV(X+RLsYqVQ=7HJYe0tiO1j5E9I2QJmoD-!B_ufIC91CkK97YtIVp~^8m#%ej|K&` zEkjSyH{509A$I(^eyS=mU2T&ej!rcCK#+A{<2NdZ49LeSSuIa06Q{wwWWc;%p1rig z@S@zs+%JDpOK8^jnT5O2W|n(xT#wn-ZNl@2xT%6iyXd6B-4v_71$x!fiJIFE6yWou z-A&~51uuDKIj;RXBupYa)HAH%+lZ@3V)AAF=s;=X~Hhm*M*i%+q)9B`&c|6!nLqYfP6gl64V~>ZHiAB9 zBT$!?;g3rqfuBMwS1^w&mf!=+AA5WPVS(uDohI!qC?|$}fsj~Z_eqOl4Az#sgiSm2 zFhIb$xin??yh+NUKyD7R7vY1F)WZ)Mx>Lw#QDvq-9o)&5U*n{u5XXLJ!&ab-C-3NH zR}}_|hyro?RFwtWAo1Nz+8ET%%=Xr)Ms06BG1B$97~L>o!+FwEBIJTN`);?fQOmry zzHz9KABEK}b+$w*Iw0%b4NMyKo9Rw%O(=_(GUnbqnsh*(p%*@8$~(P+tTsW0=hF`_ ziJ!4QkBE=HFnop|d%zr5WNL5a(vsbC@s?`sP&Rm&moN`A9F8R>WK)Y$ddOv{t10Ee z$?`nU=D9+%(o&^<5N+5O9laOBR0OG(SH2tOD)9nX!fAP0tzj8jUO-p+)lGG->^MA` z6LIu`%K#XoURon0^*F3ZQgkvAIW*y&wBg&`KwgvU@6&ZsQXHNx;aj|&&+H^t$hI{! zrzl6vx@+!)IX?DeX|aA)i(d}RvS}CJnu=x3EGSFeJ*-}H{Khu|Lpy8ElHdW3aYx|J zGNgRVTu%C9mWTHe>^S=2>@OrgnorYpn|c3JVkF2i8dd!VrQT!H(}8N=Gx+#!75(S+ zB(jj@uZ`o+OU>hp_f2x!_C8BNsUKV|-wC)hhKXU8$4v3=wVe6Ro!FyMbsnIJC> z4XQ1)^?Cz*=6tyUQ+s>|{K8huE&Y~ZM{eC}dofDdzZy+=H%{JXEcW#ei>tO(%tw>$ zp=>&^0A(6Y1xndlsHk0+Q(wT+<&kJ};uAYf!e5B-5KBmCGgo7q+Y?E+LhB!84N{aU z=W5&IUCpq3Dhp2L9;{9HhC?~h1iTY2<_pV;E`ZQD3y}x2Bb_Rc^YKetQ`u1c*zd>W zr>JDAjAyLV1ATK~#>-jOSLvt%A<@2iYk6M6@8MLlWKV0?=iMh8cJ-x3io9fe>})e$ zlHMz;@VswB9CQbSLs{xEc#TRi8;k|Tfe~acs5R1yM%WC|AByb%5>zUF|3&>9UC65T z`S0;-Lr=f3q!Ct63Hxh>zZ;KK0x%Qr{d3~}Y8ay(T{z?5z~!zn-(>ELb6d~&4let68oygP}9qiZCD^%{qVkLa-U-4 zpQrJxPIC`T;y8-{tgE@|{zYMlP+;ps7UeLY4tKe}D!CIG#yGXmoBfgonz69Qmu-vIX&Vrc^cV9ig@~Ed# zM-8_pt6kD_s!L`{g;O^Qs1+m?S)1miL(Z>z2z~%5@wD+0q=xo$<+Vx{_kiX!@rHm; z^uoGxU2bvwgliBRZ?aTx4KcrEFf=oL=w;i4;V?nMcF>P0?mtZyP{9yDToS_$WzZNu7HZo6$$KaX1%{aI$o;lZ{x z4c|3IX{ybJt5Br`9)?-B@#~(pdt$0I-}FN&-%%Q=xgB4%Xlww&Qj|-#3k?Z`SZG6m z6u)BBOoOI&3<4+dVV2-T*R?Ctjwmlh>xY{R2LqlE+n>6D?yc-l>%o;fk?RER%r2;# zy%occwZFJ}3gYACNA~u;TrRO`rA%k`)T^rxFX5`twvI7|Wo0?1lhbZmzA;DJjuRmb z@B$Mjz`yEzR!;3n?LaomSRido^g3r}f(~wdd*?u~P$1CM9{m@OopzgwRb2&BvNFec&gPp2Lp&}mKe=GTNrE^QLQM=8 z!GqwzU{ExMAoOIm&k?=wMb=@#8kQXk6m;rlflo)6%ZCkKca>0-y`a!GkO&~nnKNf(uuEvD8hSCAx3mW)-`qDH+lfZ#EQGLOSlt?9n&B0q0P%{U zFx_0nhjMtICp}+{LHg^j{j?!jr67T4(eJ_Btn5100+ z;@Kw87P5-|h#UH4xD(u@WWls~{2rj71F11i?YnR%D!1zP5qHUxlmP{nXu=5)O-7s) z)oe%;XSgcKFAU;~{-t^G(eJ0nZP=ub_&D7m8!zKwrk?rOzh2jyHIM8`Yy?36?hiYm;mO1*Su0-T+AHW5Xs$in0>M%<@aTpepHE8^X zF^O8%fqH7|D;D!$Y~n}+VM-?J`e;oLkwlr@XL~{gdZp-Mqnal z!5zD`t8-7bZJ`vrZ#sO{_;y|sECcxD%{`E3UX5D)`r+XbXM)5c)LgkHwPUC0Y~4u! zJyQeFz}2%SF^45PKfJ7ZMqAQIn7XEtxJHp&BCOcN64Br|U4+ zn69v`+g@(Uk!D9TORb5}SrD^i9lh&W>gsIAxl1KdLj;vveu{@50Gew!b;yN@-$}mq zZh+AP@LNAMt+-2#@K8N@&9{}d*S~ViQmsARqJbh(zl{;(5XK#4O`z`7UCm)u{i1PyvrMsOpmpZ z<64-yL?wEYhWFcOZWw*@459K61gL#%NF8WXKCVU+D>qFnD0I(+5YA$6~F2R z`-dnyGT@@D3l~lGPxo}=rHm6JUQVWk>Lq0MTTnH-NWB$Wn2et1qkN6gnXliM@p~2z zDQhP57swvE)uE*Xr`Y2s@8;~6^rq_9%#nKA-fZA!;`Fu&NNsKqWTIGGaxgxv#5eRO zxdK%&7t4_Jnb_HwrZDd2w3Z5Lf7zI;X~N za`C6mJPjMFVh#9IpT;#zrnn}cmu@pIfkj*^TgV$m0F#JusGOoTVGK4RD0HqUa7Z@{ zX;%zwp0sb-)pagWA8Vqst}$~jGe(X==VMYmZ~({kmF1CKQ2(p1 z1EPDjvx_VZvCSv%_Yi{!ANB9>EB<)4X8 zdE!NTXkRiZMbor5C(9Ae=F6(GhCeM-UWoChgu5U%oI6DYeaoD@z-eMAp@K6(!HmkO zlOWvE>cbL{yk@5n`Xe4PSNj7QWpli(B!e7%aE`igby1a*E*hvlfX%`mk zA=(li->}801A2H}`3nJWoDiMR*+&zy3NvcieUi32`dOf7TWsjah*HqCON)=gTK1y* zMYhTIir7CWCw`{QKlnSATs!0T1TBP$Z0DbHJa?RQ)MJ2dF}TF#NE$Rn9#|Pqgq2c% z2{7wUu97jLns~tsJNDW|aBj)6KF{FcrYGG=0={}^)5YN~|F2V{ekqUn4S6Gb>me)%0|>2p&T$cw&K2LUd9`B-`g-#ko|2?ds8T z(R*>7S9~C;TS%|6_6o+N-K!k!U^=$)cNUfwEnV9G?wxq>r~QRuR;NK?YJeg8_3@Fv zKT%spbXr~A=V{mQ5ZD#HvQ!s!o8xlv*C1a8mQ4Ek%;N0RE33Yd9BmR4)e+9mRE*ItUmK>@x{zgtP3hm2`sk9oAqG`M z>%-FkzE+GZ;|6$XzaNQ*k2PE}=PtycFtK~|Q~j-gwDA1YXqYM|+8{Ie0UL4MzO?*d zw~squI*{)=+yrGR1iW`B>MOyXgn- z6?TxcL|e+q&KxNe_ytlA=~782smI=;AWB6%Y4)RfBUo@C&5J}5RrKzHm195H6SXe- zd16EGSfz|#2T-q;gvdrpKsr5huphMYN=1%&*4j-%$~F@ z%mdbzkN=j1n+m|2=hE@Ed9m$mDS{&b`G=S26>>jToPg3Ukb4~2WA1ROJzHfoG&oEs z@}Yd;_5n&b0*j~M$J#UT9S(n`~Z={=dv7=I>wX7*uAV7&2O`7T?_B^-DyR3hf#dk@+pHrd9aA>~t%k=|UUh2vq7!GofeipmpNV_dRJV(Mz(e^2W%2@UQi~k#w>2wTBRk)Q+{EZ3R9g)&JQ^ zv(x_`LO*r~Y0M<%q4AM9)8_5*J|YVxK&f(2i|W1z5%cf=u!b;SHGJr&Npn14)SV?< zQKo1+wY<}skS{77Z@eOIKtt#a9m_WD(9jYR(oVgFzrOypn9n!&m2U+3WVTck0qixY zF6e1OpfTyX*de2qo{JEbjjLwHSQ^{fvHg1H9gln8e^9NwN-vLCI3M70n6fBV$@>@eJoVI<(OTt-Hoa#tpKTWG{MqXF-8ieC?!gVTf~8<>UBgz>=^! zfCB%12`^@E)FzkQCbMy$IW-g*c2vgDe)PJTk19<=5HonRa!%?;;Mp2b%={eDoRTr zkVMy_XmdbMr-1JJ=qK%KrOmEOUc{x=g}aZhXx~C!?FCWx-B-sp(Zk}_-tzy!-dhF5 z6~SRf%laEAm>kPzJ6T^pC+(sZu=ggU!dvD$Q zGH>&+YrpNP{e8RYtG)iewU)lup5y=rf7Bo9w-?7Xg3&1|@dJ7?UyiAUGGbbtX94+?EI-Dq|%6*iDxpU!c-gG4BiN3GkkxSS48 z9PTjE%y^}XGR8yF!6rd8x+igvv> z0x!_WNU0wzZO+>)Nx!KxOdC4E+HNi+P*cDGQ!-IqxwX`&xbX}c}gYWgojoPV@SmKebAeOvwQAeS*~-u319xU;~CH;mP9Z zClmk5WL;k>42#oLT}E0*8HG8bz7^1T;lrrL?aJQTUlmGQ-rSPt5J4yljsFH$V zyJ;+aO{sMdpUdgXmgg=KUNsppRw_1T^>6>5z@1FS$uP5Bqq`?o6hj4wuEfvWQ-jfq z%ro<>l&rJUjzbN?TNNSU2{WDN1T(CCszF&ZPticrnO^gfgbhH$D2nVk4PQL5M8BWM zt2JmJhJ%Akj&XFsR~S>p9yRb?DAm&JGQdfcho%*=!==UCGcl@>c^Ko*C&Y?c8&B5<6q^XTNHKObCNZ4e zh;{`;f+*7_h`YLnz?Izi2wI^9C6S7BKUaAOeSpcR!Q;?ug#$-e2X-H0X@Lj{oy3{% zF=oagf{y!}0HeX`bTp+nI;1Op6Zx$YBm^nkdh#wA8w0hlh~1rN_iD*MMgZ;T203z$ zg`N7d?h!5axI}F6&S*+vncNgB~?Qjj?i`^v2ai;noUZ0A_f;2njWn?ZeGfj-20l zUU$8UXRpfxei&dDFMafIN6(I-kVE|CW^Z8@HoT$Spsq}2`u2+#PpkTS_HMHxv;!qi z8gOnOf?5SS4$38C8pZTiJP6+|SnZR&rK#O?H`!)k1cNp_s$r~ugsSvY7l72vdqAn$ zQ(Y`#Tqx4=#=p2+@}nDtiDs7!gCMds@0Fjy=C|t`J^93}Z$}t>o`zyctSw$Kh zCR?t~rYYpRoPK?16*MIX9#cT{9tj_LMfMSYLtoSF=iA)=ENFweqRi_T4&$NxyB3~X z5w5y%qXHH&%uzzF_Z5i;+@F8S3qq8_Dn(yvP|1(9O!wmWcZ1kYE?sbc6>2Ot3?pJ2a2 zrgaRIEsjIpOn1u!>t16W3g}1~=LGG5$*3@e>@0pa1A*rqtX_{^wjc@xgDbe^uCoJ- zm@j2LW=zdNM*Z*BxMu1n*JZuoQ7e{;qF_b`C1grhe%$RH&J3W(sT@InNtF6PI8Jdm zKZrC;`9wM8p@gP+U{H_# zH0hqKoCTkK3WM?> zhf8ym_f;}}&%o>UG33}P^B>qBuqkOsPHhZ+YPzsNbxOOdO5JX9nWXpmeETGgSX=}7 z6P#T(Q#vVL`q1h3KDZA9K_3V+{;ajBy4g5^vWk}eMnH0XmKSHMm}})0QPK-aQ_NN= z8R2TfcHgBUm1VS}3d!@m1uppX;7nna_jd(xeKON}&9?Dm$QGY;4iN=BY}>~U%3u7Z zO8F;8_+=6KosmInT4jzCK#V)wrlD%$ipF4bOD$YQ8NvFtV`51rV|tPhX~k%R?eMlm zgj*bbyd2Yt?a4>JsR*LpQF$`1=t)AS_V)S#*M$7kObScN&X=l2g_EL>1W4bXYE!g{ z`9j?7xsTIO{?>FGD*hUR1p~fr3FY`SpI_Ndmx%#{d^GF!$Bd`d^o;5eQshd?<0 zhiYR5Lj6?z1<#hSS-yd^JvX%uYkl7Ol)4O{(Vb#NXDEipbC3e_hzYfMu7P}cjohxC zSCn3TgoBY~)2Xr#UP*IgaQ8m9S14Cob)Nt1<3k1X%NJjcZ@1Z#)EiE^lsrnT*p=Mo zeDMyZ@vY$q+z<;+jGVBZ6m*zmdMpKeDRYX^q=R8W?Czk zvP~jA#nGl5-2zTVPjc1OUuQ4!zn6i78}bVzJE68F7U z4l`^dWQZeU9hdCmrwW=xduQ1lWsmFEZi(}~U0MXG6e4})f$Vbsc@fZB-4+<3Y1 zj(z@St!wa`0*Tb6nd)j+6GMUw?z?EcDg|~LRoi_A^<1IhOltca6fh1NZ?q7r(fpZU zitr(%(5+W@!J+qp9KK+}!NNm>h-0sXVh|Be{<9{P&TMCu);u=8kXz8t{0Omnm_vq? zZH!5~U~rxlo7}u-{}Ad`#J`^YVa}q_xd0k9+&RUh+XGsu78DdO%3qo0C#Ki62o2IT zFEfZ_))^%*Ur_b#0hd_}f)qFS!rHn#w80+K8U$fu8hBeI+m^q3RHr@G(?^2l_#qIF zwPmGmBS4@@@eK>p@PR4PlIl;?KA-Ld++4+eSh*~QG!m~xv%C<7xFr0WTT^D5`WuR8Rr6RXMAK0WPh=Tx z&Zezcu~w{2tUhHv7w2N$Y%--tbz;UKC5{PeUSkn(t9Wy|_ViFXnz;u#{z%hvK97ti zy%`5b22RdnAe;0dAkBz*{5Nmq4eJ^6V71w8@K9WSjnsK3AR7S7z zGmZCro{kaPM(Kc4yLPnr!4U;H5f_UI)-r8$Mn>MPSPWiN5bt2*^Y=y^&m^V_<}Qg;sA-_8!m-*(Fa z!Jn+iCq9@M)=Oyut|>j`*UFnh>R_Gi!l*rQTOMybmzPD@_0y#pVrXg(v_1qR?LXk& z%$S0m3)F9oqyLT znUd^j1n(teS8jg&;B-p|FI=oTtgUQ%P%Dg^b&dXUaB1obx5(N{u($uV0xA8?)I;5j zV&I^w;>SqW+{-BObBMtzk;Z%4OCPG2fm;z@%DWSyH3RF_?QFv4o^!p}oHVHcgFl$Z zShMpce0PNr@=W@UXmTh$(>^gQ*Xh-$9JJH%sI{9AZa7 zND70;LcDk(F3v~1Ld-Zb^`}_42(p;7bl^4Ph-39!%wyIQ;CVqG{KC+9C22gd z|B3>br-m5EednY2VG=e$psb=i)NTRudCSdEm>`UE6m6wNhAkIKxP!fu6j$KNTb(K8 z@hBVZEnCRDTF!Hcxx;k$w;>t1jM=B5l7f&RdZhd4yKrD0QA()ffc=(k+p@2Pj2MQC z%@}Pb8{!&MbC|< zeobdD9O(`22k+fpe*&~EYfEa$pH5|DC^2%T6Sp`=qhjAaP|cVLcpEB2_odV$3)(le zz9FV>XJWTgulj?)Em)qbHGrbd*M-X^n|J&qFvKJ9wQ>9kcV2Fo9VtHpHU|zUev`TD zDeukqZ5y_wPf{q5ZAzWX=OJBR0o41c^W#4k?*Adm015zCBw=C{c@vn+I?7{0B@bMv zJ<8&IT&0|@n1rrX+BmkY!}qkj4|2S$`ls+l%kQRyuP35&8Pasma((~gkV&er*RD%G z%?NXcWm{Oahu;!F{Ni~ zst~B$6?%6(cv1IlHx{)y3SK8h?@vw0QD$D8fcnFrP9lqw9sAB5Jsgt8%Xj}t0{u_C z$G^G%Z4+3Dj(FCWA}_!FWxI~!za2&$J0h<&p!)w1Tr>V5z_dgxri*s0I#yR(L{<{A z{vkkELgp(Td|&gP4;^0^KEAvW&*L%L246A`RxwvHEj`y>u5|DYePe0As-hCF8fI^a z^2WbPv<;+S%2jGUqwzGDa z1z*Egmo!9wIo|wm!+BYC7!q0kSlcnc;?RNgX!a8R+G1Hc@%*#N=oL4kHECYWYRmw6 zvs-#oG(SnSxJ{kgclX!oXO&HyuRP3EF|k&U2+Fs7N($FoX7OWatEZKg1@S+Q=Bc1T z+oLZ@LSFNnv8WUxX8;?* zt?pN3HNHgZ3CZu-wQ%3a`;|N`v%V&11OFlD94UF;iHY3Jp#MYY==z5cHm7aZ`sp$L zNiEvZxRhxTh%j=vZMa=H&Qh~XnpS#7UGgHL>wXDWQn#Kw1_x20pJ1HOg^6(P{ECPjHVRhcl!L*4w z7sQkA{xEKNan)4pMeq~a<&0LN@NRxonH&$BykNKp zOX% zdpbMIC4qf9#L)u&`oYVA!eRBvmb!8)py3}@KQA70v{z@tQk7sRK5bYJaJTEliZ3_Vb?SW_PL>Z2~H6cnx4?Rhx?Y85jnehvwH^ln^;>OwRq zQU3Pg*kEqfsxBJqh{*tJgpR=)^HJOHM62U7vm(-SsPe8^oo=fER%lfk; zr-@(nI7_h-SdKF7mgiXA)QL8dk@ke59qRXyOaGK_`?;vwN8|x8w=ui4IMzyb`$dAK ze$}9F>4VSOEMQe&O=Ie%cGLLvO)QKEe86E7>NA$D%UvC&)m;z)>r%3gmc6opG39>< z1FJ>d9TClA^Aqj%K4iC__eN6o?%GANlkWZq6Z{3tjN1x(-hQZ7a~APy94hU2!gqWv z1+Kf-j+uR3Hf_L>Ekz0VS?LLPgOUCA=Q^jlzEI)tbQT=~3yoATD^M-k*p`Ej}-hk(9|<3f%3d)$O28owzY9xEyp0^{2h zRO5dL`1SOB=GF6u+EtuRk8`AMQR~;n6pMpx6X*s+C$FQgg8mxtH0bV4Rv_D-H^XaF zE&mW^Gf&6GOAamyyV^RQ@!%x1vB*H2jY@2P<U7#wYQ!nb%zRBXg`>&+X9#nLzJs z;#?1)l%c)=t0^aWvPbIZ2&==(Sy_6{6aLvt<>N%~z29Zo!8tsxDNEN4O4)VG67@~e zPPU``x%9-igX}i6FG5F8;H>;7pYSqzC^Sjl@qLPHLbBaq1e`!G4mF9}bi@g?Dw}$WRFb z(+rs`PkMD&IYl}sazZA8BU?=*Cj@q@X!P{*^4^u0eHkWob9=WBZ2=ILf98ac2dkb5e}dbydIpQ^g;Gky|Ps62jM+ zTo-ox31~%-(a58v)0ONI$HFe5-I=Nj!4D3+kIN(E-5N-oc83ewo$5j3s4C+5D9{H4 zQmC(UklxXZQKZA;rPB{xDSzdSMGHa9EJ%u+5Oycs^c^c?mV=UoJ@UHz<4bpFQ@MvF zGx12^E_6s{mej*LUx*#T;34c!Ur8(7-?lL+ieM(ic-y;S>)A28EPww|0M?>HN&Fp; zJ;1d&&+udSy?H%&zctCsn35A`#S?F5T9U`W>nZ&Cslrf;?mP(JTuT-YfaCA^sME^G zCB*YK(7I~;cdubS;ngrVO4bC|UQ=uA>{gbm1IVUg$$BASK#E&5KUbLTJ$VuS zTN#osnH~3#lyjbw9$+WA;wE~Z67*XzIifiQS`;tu)T2s~@`Y$--*=c(@nvDBxc79G zmn~UJ$9gv)n#DC-+NBjly2tnX@AOr-fb*UXa0~QDB61C3^oR@_ zwi#)P|6l|Bs!M`ZYar@G9y0$pmkWJg!vFa(xbm{Vx?;-w|8-)&XRstDIdQ5g6yAc5z6wlA!66uo9EEpDQ`TlNj~ z`qDmq$Kt?3HXx4MjH`(J3is(d%lXo)UL9oZC6uH7hmE@}p}v~DVyH42KJ&gLT_-$| zh*u!TrCRUgsam(*^%N4A6x&rkoW4whe_3K0)ssV6my7pm9-caO);Y6`ksXi zCs-NPlszIglbr)IIOQE&y-;jQJAF0808i}aUd?f1zBk#cs`CTh5|lOQ@-&0g4~l8M z61<(KIV+4wy#RGKfEp>hEUWv_7n7#^Ph@cRUw8vtjV*moiPJa!Jr(A$ z^saoCim80#R%*LD+w|6*n%>~|{t+Yv%JH2bCsGp3cf6*owO%}ZfU#Lq&Tk5eHfx;8 zzl-4W#%KB%jP2HpG>N>8CBd(#!?ONjE`&*K8YsPV9u|#H3wfv=f9vaPa3{F>2Gr6o znZ#Ujj5_z)-lW~dH~;w}_zI~#*S=Srzi(Jz~T3G#4Tbj}7S&LPzOWERx9>g7eSL&mnN3MtM2ba>l zaJn^6G}XZ^7dl+zr!5nz^e>oJBjhJA3A*2f2LUJ5=msaRM|9EhWo1&>)%H+GSCr|F z<6FrH{RFGM3D9oprR|l;rP`Gj?Bp8U5*o90iT>mG8DeJO=boMxdyKy!F+gUc>?)CrmQ~_WK8uLa$G$Rx7mJ z*ilObs`&8!%c*VTmSb1b}`3lNECR!t=1uyHWt{I|d zn^}mthDZOrD(8MCKwBsA{s}PAn-g?OdU-cD-RiQVti}b*O6k)l>-GNw^oEPzPaB2C zeJOn)oPq?u)1MYg=4-7S$_~Mv(vkWQw%kq4l=8Xu%nIC1t;%EnAGeopg?ht_!((?**f-1OQE|95=!0FyC^V@S%)anUBg z#iYI((BrN`{(Ef0(c7^{YE^-qd7i58Vp-u!ZxErOki{5nrb7Xp82J#T(Q)(XB{*^s zgian7A6GxM`H6a18|O7Mb>Y)cj9Vhw_y*j6`^ba1%FJR|>bra~z~ZaBL4_2>=!Ih~!? z{j7$q#v;T$;-UNRn)t;{GMOK zoEE|vu3_{oT5%FALp=Mu9+Y08qImGaJzPwB6yPLF+18dhpS0cdE}%CuIq17e#AIs( z?sl@Uy0i>yx&uvr4*A>5_f4RM+kDTs)d?3@7wY1_dQw`9d2!$=R4b2?w$u$@g_uto zO*cP@bo5r--_M+mwOdZ#0++ioXiF-A->7t_bY^kpfx=v~@q=Xo7VNyA^n{XXX6Zau zE~46GFWtjRJ3hMRe5KpP!wumk3g8}49<-h}@>=u_pM;SpO)3gQRrHL84!$22ZP5eam0Rx%c3qj@}}QD}M=WpjUQv9@p1Ysx{)9~nSBUNVYTn2T(*# zV_4#_;MdaVzaou2(84DGb`R|7eOi?@-apH2Z*WShkMdl9;);#3*7Suc!-rBi>yVGt z1ws9djhIj#!;hbH%%)PR7HMS{?Ph1nzNF|x=hQZFHit2zo@!&basF@s|SXr?qZ=xrsjZkBGAzji8T%?G8p6;uQ|f(0TmN zfaEf7dtFL})j1sx{M0XhBpN$|>vPRMVrC;wx!lwYF2%#6pa@5g$>hLqfWhQS z0in5>S?U;-Xd$W@um0Yf@XVg2j-_)^aN=uK>=DJlvfw`iiro4jv9A&MF#N@QnW__! zCz5IF9&d`CQjnhVh8(R72!K?1c^bdD6#RJv6plEX^^VMIcyVg$LM~Znq#53Xy|U!~XTp!5>B-2B zf2%Zaw4S~y;cMUJ44!F?4B=)pDb+4&Gy6d7b_jV$xk*(q1GWmyUk?|MP9k3XpE7eZ zGBVeBeMgJ6O|Em{l(F9y1rAUiqIvy0{{nB-M$Eob6D@VA!3r&3*OsVqjF5r(ZEzoP zsk57*tfxF#nmdNHFi20*`RxWnwP~AMViXraT~eZ54I4>wjjiQQs6pUlP<2t0B=SH?W4S&JEF{$Pxg~gS71%~ajB8r`#@_WE<68aB~Y8FkgMh?lfKZZ%r6nqb} z1g+bxgwi~wl$;H=H^_bwun~`^sh>Q)MNsA#XZJ7Ec^bc}W09sxz2H-OTM2@>oM%!y zmnX48)ECWoQ1sS5+QS=U*YQRuSu75h)sp_F0MY-q36+J1FrHu2BEXU;Qsg7W^RWDt z%Pt><1D*7KPt=17M%j^71HQ(f^;6Y{Q0zUBPJd}-0O8<=YQl^0;Tf!7qugk84Od)- zN6Q*5W>j0hcCPzPrlA)dBA*S*nV5;Hk%Pb*Kn%VznavJfdhE zpz`*~i%Q+Yi(vy_6%aA?J3OFpFi632q}h2w$k2B%zF|WQBJg>{G{jqS8(S)ybrt)WlRIq#+;tF6KfPlRVCtD4hyUCd$ z7D#^SCk;Q-YKnbFw!9{byry+KawEW+uh?5!Wq8?p$M_F{EhTKYa^T?h@iN!WhlzTK z#fG(3;T@<3R#k@guDF1!E)3VZXe3H@8z)r`N!#qZYuvjE>rutnWw+4kY19|@@3n@R zqTHJ~rN^+Hr7>__Q;QKCXX~p08ukn@I4Y+qc$A6UjdtvIiCUtii>FbzDo0O0T)OY~ zaj}Vfb@AXQN1Ka^971uRf{u!z_m1v|O8d9d$SY(@joV~LvU}BNBsavo{;|@}C zrg@tN=B5Lcl}D2n+)Bc7^Gp*M3PttAeTb9;t<^~{hP=F->JmzT>B6zqO{)!iJdM;? zBg|1atyS1|TRiRlSETNglKS4owc5-!|26#mACmEZTJ|EuJ8vIAvYv$!z~t>^Z~v3F z9|9)X`)RZSN2zuBqoKrU*qwMQ935N8pISE7G)xQtCfDmvX$_$0 zyr9K%*g&8g|Fi%!`$ZortX%p{F}cIPiRg?L_KVX&d0U+}a(qZA&lcr9{}{A!qM8gy zdcbSx+c3j;xnk^+XBZ!)>5015i?IMJcwysx5OM`Au!!brDJIA5#i9V4T5CjKDo$8Z zg!L&-Sq~dR#wRJBlG@B29ChZADOHakTDxrzjq2Qhixx7s49sO)_UGS24bvEQxuLj& zmzgIv8>(A)HM+#ddS&{~qD@t>x;|A{u=r4YNu-$}ww4%GR6kQvo%Q(ShA6PoY&1|R zG%`d~Ik@-zAuIS;wwkVi_PtTB<#u6oOV|o0Z&q|Ahc~WUV0fh0UQEo~%An=kyu(Vl zbS|9Vf&lQ|J5|H7sqHM=P(?~A{RD;lTf>8-oCYc{Kw|?ZhNgfkT*3t8Bs%h_7GAMM z>eA{!&dkNlX@fPrz3X*C74>n4fYQ&44bj%LzO$y>v5M4a|xdeH%nhfJXLjcuFGl#Fe;@yJn6BL7um`?%r zJSe@Oh+}9ZDk_ffV+(fTF~kC{pCA#8yY!R0=@M46VzXuU1%0U+8aHZZ#u?955WRKz zwD`;6?Wab4+iB(WvQ^9dSv?+J-g9f~c2kej)i;CVYbH|gWq~xa`$CmuBO9c#@G?6T}d+{Gb4jtB9 zh3THr&4kM*l*-J?{c7U8mB?0mT0$4r%kbPd(l3$Sa6tG!%P|>TQKZt!hBwnL-Dq1yf^d_P`m}eIeFjjE8Zvc^UN#X!H(4Y~0$l0f}Lf z@k=-S4M#XyVRexjM32i#;CXRCYxF!7X}r~Sall$TRX&#QzWA~C1KiL8u3zlU>VOU1 z5hm`2#UX;gNNQyP1`n4*=o}GZ93^2#T$n(}@2ToLa^$n`p1cU;9;i(e4XqeUoU5zA z?M7T3QaSSXn1eQ3deVmtBBn2MmqDzsh0)&*RI8huC_RMp*oxQjJY(;s<%bT9rtE=`&A%FJnhzU8EMDz|JhckF7)WRDRRe1zaQOR6d>wT4J z^fuwxqKSj%=Hh9G>17Dch^yIMo*k$Na`Z0{|1-1Pl2ICVP9luWz!f7|1T3$(h7|2` zl^X6B%ff+hnLzyyA1BsCPozy;hf5Zw&RKOsmCcK6+;@%b! z2YNvIlKo0zZdc7h)NoIX$eG{RN%@b}BH>PWzVqccB zyWv5DD)ERjPY4U*-01J#LsCw*%MKb4+%_qL&SNwZ(l6dJe~J__{a}-wq2ldbx2%uz zgC9Cd(zbVHCP1c=dgAl9QmC_-hsK^I$UV_(ZN&$~TF%l=jbZ*i}^P1ODL43 ziP~L?S8gGwn)rI;xjQPaxHoOtagcYUPjjsG6`oXq0~-a{`_H{`?fjNTiqG5vmni!B zOIJ-6Q`~-S+$|>&(sLz#Zz`NJX_-mfY5FP(i?$%-%C_K14W{JzbbYfcm-hEPx#_S} zn~!81Wo`rF?qK|6ZHe+L*T6kSjFzMSQHN!KNgtR{G1fS_hUkn**wJsap#G16F&Rq9L@!{`F{R_uCcYO>1v>$?UbL$p@mC?i4@9@pfuXDC9| z3(=?hu!gEn$Z2rWuziH%BiK`TjPMJ}Tb;~El7akAXNrDGi4ZHYmV}<}cd!JuthxdE z?E#kjiwz08$)QwPu38mpPTm?NM$!JF)u^#QB46CJ4!7Wsl2~RbWY}NDkfKf!x<84s z3I`c%C`iO$bm9usFIvq}L^Mv1Q+_^ryO2#4XQh+9Z|UKNmb_l<^7QDNR{?DvnWXC9 z+_~Z6pqid=EupDTGTe(B05KD?8FBN+P^BG91ksEi0h3^vE4`2Wge}n!e_(FDd20ZW zNT}TYdei{kq~i$WYyHYa-^t9cZQ0fpq>;W8U)eC^%#3VxJK@9Xa_`w`xefRDafD2f zBcT>7YvHtKnKmvY7uPWGsVw9TSdv&h;!=qC>%BqeeqD>~o}JV>Ev%EgrwQ#_&V=u~DFeMQJp zusebbA$4CQ@-@c~2x7J{V}Zuae%0!n9Ahpoop3)MC2qSD8v&9`JTcs)I(pcBLUCFV z!q*X#@5fq)_0f8HFfYT<65jPfjL6mkj{V-vb(=uMnC;_!HEgRY9eYGZzeN)jC8`nSl-1C>wgGWLH`g!=)<7j z{y+I8`2RM3DV=qQ+d&FoWyun_WX${16V;+!Wr9R+2z}9o?WCj2C7o}d*$s#P7x%K$ z?;rN1a~z}BzC9DPf0i=B3PrWCNEUoD$ex<$Qo1+_|!f&IGCi)+z)iYxPz zaE0gB%gpq>?d;)>-H#3clICmY!xXp9qy@hk!fnTB^0$PrnfDqY_7&hV%_QmZnxU_u zy4<4}pWm~0eDwdKWeFLmo=$rw0T;fIop^unQCfd`EkR@BvZ*0<^)jw0I`9bb#2XIs3^XfY09W*ZX}#JbS8IE>f9QDmIk46 zCjYFlRAvOI%}0=PT1QUpY~Za;K-vDf=TR!0e;(!R<~2BulX#0b;bcDqiur`F5=#Se`>i!VTMT3bw_&se*aQRB1aa6gT^ z(0t|b(RjP_&A{B;92xA?WAoXkamFXxQ|zxG1ggS$rNZTEcG2eGP$hEdytF8A_Ja^U z|DIJkCocORf)nI55FXs%{=(o!W<;`k_Yc9xrsLk+@BRk;)~-eR|3+M`|F6WAqE~Ro zoa%AoKZK#zD{aP|>!v8_AHpMluiwMRhg3lHb;`BGeD8Zk>&OxjZH33A=Ms^JcYaq= zCzNeWLuk*`o9lo7A^fcyp7&yUxY^*vvTD{X9=sk3L@?=q2V{o>Z`l_ zl_wQNyIG+OFc23S#g?4Mh5$+T8J6njW>f8HlWs1#8F^C;?wS@ju|$dyU6lM$VhQP% ziAos`#ZFbeN5?N@t!2b^2*xDM$55=}0{Yaa?Z*$5eahrZ55r9(@Z@@|W-Bv#xV1lU zWqH1Bo3ZSVV&yvENqnSCGrdXGi4r&CD>?OkmGQ|9zRKu)u&!@Lc0zfX8Bmr#?9HZ|aWaNK{T#r;Q-%zsou zWMN3&h`TZB2M(lVMSr_s+i|Z3lC@nDLwZy~e8EeL zEl5PCwReL>L^KmIZ1+|*G|^j!s!Db?oK|QnU@&@fT#8E50kEBomvnx<32-}-ug;4d z#5x}#m))Ux#kf$6lJCK}Y`iWE#u3gNH~XrL$g}~YqhG!6ORmS9oVdBqb;2#&HPS}r z#&=5FF{JYVV}CAexh7n$FH2jC>N4q@(vwkDe#4j=@)^e9vV37`xr|qvuUN}k_FiqL z)Ug{Ad44DvlleF~WY?Gc<(0H75VWqUTexGkRA>bV3JNz~-PQ+mWxy<(_|LTh%Y1tQ z+eiNpgt>xxETm-j8)r6eg+6wbQWsHaKs;4SPM(wI-tE+~3uOYzd-rp|KECU~>E_5U zDEDuu^6G!Qj~5X#wjesW2WqHpn##~6L<|mW^ePMDv_5BnrnBK0%$_%=nl%_Z#`5Oe?ywQ41LkB}jmy3nR~q7e8Y;nqj2a#dn{);Sz)@Z`TYWPgr9@Lt!`d zZ>E5Sk#tELGE$nFn|Kgk;o#eshAiE^YQB)?xZDz5Ov&q_g;(HFJH(&4g4t;{SlTT2 z9<-794?(21zpSe9jcG&TU~wz!;%%LjP5f#8_UieRrCqukq*3Rhf34vBx=7@}xMaMh zddIHjxS|pl?Ca;OF;jv;x7Pzs#C9|OEMlI`G#~=I@g*%UAD)ZFU6(9xs9azb(ZxG1 zI=_Hw<5YKW(G~XM)r^X38lz}Fc4!aW)lUSNl`e{I|Jcn`?Kz9$+|H4iHt1 zP~mFJugzp`7(p!9%{9uA=Mws;F>`Qkynoa5xFS;zgf>U}VEsevk3Mqz6O zz=Rl##Piw36XD=%!s*pv$t2eY5}N2zsO#pD&hxIiPUrVRFr+VEEgRsKdcM~EGw9RO znm|n|<65GYknzC#%?Zd6=1-a5$ln-I=~RdBdmXKDtIpe!u|5ZTzQvBktR>zaD8;Xr z`(nx_5&~CZV3Ft)&uwWnqEt3mf32nw24T5z|H65{ZpBNc!-84J;#|~d)aA77xa#PY zRC2P%{VGNU=pl!IX%}wmFKKvjAfJzRI5wp5#b|ZZGq}YOGh-?$OquwNb_{JwzeG}B zncjx((;`WY$W2}?x+da|56ft?MZ4lwy~ZxK1P!j6{icad!gs3uT$pW(5W!XV_I9cO zJ2Z4R+awqzUhZ?-f`lW>sJX1%!TLwwVl6!v(#VLiTg#8Xtgp1P!5_2D5Ax>|_o+>GvTPjlG}cBQE=%92BJ+q$Kj z`=Hflj&wDFC8-{4>|-q)UbovDzmE5oeEvch^@p!^n`zR3%s72-sUQ|MJD5GE>Gy!~ z`2I>(V{=Wwq2?x6M^RBkTAGQ2s{0m>zC=%)nOh6(d0!&Dzj zj7&MLcY&VL_k}fTeA7|m^M)T>3N&bfbGhT3f8TsYxJv&cM;CTqZrV0_1}LXm+3`~| z+RLpE;V>vYCGgx|hWFZP)$au4#<;jTTOtNf*Wo6APIuTPCgLd&ScB%6?{le<&KVOq z7Zdms)=@xY@zf9K=n^@a_OLke6N^hEl?Dr~E902MB*K`h3|yl ztRmTx;HW%rZ4}I@x#DIWw7EKQ0tXnXce9L!ytISk*xa=w9L;{8Z{>a4Eom65ABae_ zt{5Rk=FsDkPMb=6gNq`r+9Vsv&y;O+tr**;Xr?xJZTfm1MGWRA^&_mTg)he!Xh=d% zY~Sh*WD*Tha{Q(gVT|Xw$%_;iGCF-~{Rry5`4U#4O{2$FBw}glP63G^bHpATLuz93 zqHcieY#}C2p=wdeBxa&I7e?TV@f0Y&e5^nxd=PNxYU+1$ZbwHP~hS#|d)P3d!p=B7q8NHT%x0l6q}rFM$)y<@{} z9K4ie(U|&+%ztC=tfJ}&!YxhkU_pXA2X}{qCAiDM-TmP15?l`Mn&9s4!QI`R;O>D8 zcV^wWBX9FOuidNrp}SU9{q^s?KYBc$ith^Dckf{nj;*khFyzd*+-R_vn|oz1nIrEMD{VB$n@bs~dOsd1afqdmj*+dL z1iX5nn*f(Zl?5sDYRd)jf!7kvr3{oAPxU@!=*O$n3V1mR=OWy3;S${;J5+-=@Mg_g z0AYS>rgGb+^1A#!LJs7@Ca|u-d(~Q^Z?zvk1LJuE4jnz>@tPTT{V+fqI=L9bzL02` zj`$vB+FSaqg+V&mxgEP4+xDs*OqA2Y(a6r(|kJbk#8jT$^%+^Jns|k5p1Wz=d z^7xTslO33S!AFcT)N@iR$60!d1|ovQE(jfPYdobRogdNhBkie;kF46V=LtU*tg$d|M=kXXqo0Z+FYig}&I47>#Pp>Q(6N~gxZWq)@LoIgK(E9Oi)lceIN{7rbi zVy}fayKke*xsCLqIGn@E;Du~3(;R)7Uoy^td=T=|Ld;C)Cjbm7@(xNAjgQw+A0`4u z!K3#-C<`v4@5QKIN7gZ_q<5!I)YEggbf~KX>)1 z>E}n~LGT+{b}!d`8Qu>S#Sd^WA*vZ6mzouKBqlPwBnOC5XLo0Om<%xVhiDorqbo~@-ld5XT zs2)LqTasR^Ze*dJByuExR?VdmK)hyDVC~qEz1f%vS`EUb4v*URb%DvjL~hw^w3s(A z+=T57n{srsx>$WIdyaduMBGZG*7SM#z(=IIbbolPl%yp*Vq{N9#R1lk9tjSCgrw%_ zJ+pFEnTgynau;W_?CQ(KH|3xo-vE(x(7fp=C|ZFv36r6ZDJ)q1l2~0VN!+ZUATcos z$fSa&0*Id$hM;G0nM7A3r!&UhkTaC0{l1jFOFr-vTpTA!j@yp6S&fcB!k!mjQ~0@3 z)kTseDsj0J)N#FVJc$bVjsK$$pvS<}kIJ7MI@;M+XG{a1%z7*YR2Y(o{Y*OTj;X8e z0vt9jPhD}kI4C_+(^)8u>*y?ITe@emIm;n*tB2;C%Q?ZBFj+HVE>De08!x5`9`j^f zA4*|T5M`u}0J$>_FV@teQVZi2mzK`&E8+q`G`}t0Im{s}Jxs)MA~=U31(?i!@3NVe z6=#C}+~*K-M;eF64A@PK(!R9P-KdP_MvNHwSk!9U z6cnz9T)}}=o=c&FCY?Y@l5+e=?L{dzJa1!eQS|VYh5~dh|3yl> zuaLvLBrWnimX6|K#c_E$v6|VEyLM+l6d&%>g-$OZtK<;fS_~f>g`DCS!DbVECrBe? z@3$IAK+TmoFIo}N%_vuoH>9GE0S2yk=5hT`zQn@12L4$rxo6bon6pSnhl$g-4$OR@ zN&2Sq9S=qE=iSJNO2F|37DuA%bYp+c%vp5?N`@bRv8myb(+UA=R}t=~vaCWsJCRvD zN~MjbIYtW^@sQGjrvh*uX!SGu_Z%zm{7#yn>2>+4o6xRMSWQrHL*^ChS5vojT&+*j z=&!_zPe}%KT;sAW8j5A?BDGZFWByBCL8YrdAZW5u`H~dHweCT!cgNtGRj)kUCOwz;F%TYZKy!+qiHvZXK_TSra?*62whgi2Y0fB6g+_O_?k}gV z$u_;LuIjj!@(>r&EJ!z@!L?|37J+P$Xg?(j7sm(h?Z#Qz*(MjfjIA*QrBziqr*VG{ zJn@bf5b(T5;fE_{gO|o4kN7zEsK?oI5a7M&Si(3aQtCZa9)Bd%j-wTd66-l+P| zU#?bP^sZH33wCEvy!-P}SVjr0uFo>B+u^X}j20*RpDG(w8maZv2TF3LH4_zAkCn6A z_9Pz=rY0`hAxz*d34yqaiOYXbf3L&KQ~gAqwJ;O1DKIN{(-N#DNMnzD!Y_?;zor9S zH2Mz;W8gaawEw^lHJ4(7Yec)}e!a#0pN*XwR#Cx~x7g|D+nQ3SVe581pPJJs5 zVRwrs{QkOXe@XjDLZ_WFS90Nad3v%E42YCs*v<|~+8t<{EI^xIm$oQ@GJ-LG9)o~! zHuKf}KZO-6^LK9{Zv!(prC;7|-!->(i1Qc|!rm(F|DI^PSGG}1vJu575T@*=N7J%0 z9_|9ENE9)v7SK*Ift>1~iVz*^OufbS@YFHc7hwUM9@iKo*F&m)2JJe3Q zWoRpg!^Urxf}h@kN#~m$UYi%M_H*QqY*g$_`Opl)4%II4*k>?_vY34tTe#3X*{$fz z)WFDi<<%L|ka(^u1`|k;z0AD{SoC8ry1)2$xIVP=hyyZEB|lkC7XQ1B^UL5Tf5ITY z8yKgkGt|&1s2*>F%g{{(yZoME)Px|LKlNvJW!(1OsrwF9$BzK|z(iBW>YYq-WW+;} z;1}LYnBbjRxi~bhoEY0yZKF}`%#UpdvLp=CZ0^o&n6(`(Bz_-#-l&%xg z?0PsQ*vx16)z04aev!o;S_mej`%8G*hAENkSEQkaHCzi;9&U-5gV0gM#7v4l^P{*F zBe{L-c#6(AM5pf&NCMvZ4NeFr+U&gQ zT61XX+Q36vHJV!K-p^~YE^X&ti=iO z%F>Pi%&({D3hJLVmw-6ai$^X2S{GY7f4E7i+xDU0^miXIU0@T98b?|m6MQYwJKW2Y zOaF5u{Lh$$|5DmSarg2dQ?Bh9c*gNAbPDN!NWwUK>nrrjdDqT1^H9T?t&I*^LZ-Li zXXbev!}!`ni9S1+HCIqs3qXABSD47qZCnqTg^9Nl?Fk7X*i5TvuwhUV8M?&355N4a zX!`Wl>@EDG8p9S%929-{G(LVPHnCPRSUYne-f8EUtZtgXYF!>&ie6(|9s-|2CG1$% z#9rrWiEd|@wi_KFMHVZieH3+}yO;I%m%DDzkZnkb_U!CjE5&*SjP^ACtrV)z+GSZ} z_2aEe9XB2plV$l&eu8nW)cM12sUXbIS;vVn3&$I}zo-amp7#_2MJX>TX_>|~4ct`?esMp%MiTh&E1A?%Y+-9g5C5#a zK0?W3(>@FAw^(D08Q-xbvfC9Vig1n~vQuYW4Ct9ATxe#n{RO4nPnyNZ=#E2_{OqlM z@tAeJMy_$TPQJUWrm((fvhd0jD&AXYq`7crQ;l5M(VIjyc&=ezk5|#27r(zNzz{-N z+;Yhl7w}9V4bDQ%EaCgHCEjyEGV{}&LcEbaq>>MvX?1oLeHS@HVxWo)lRqRJ>QfMw zm-92*1;t7`dN(9NOMM?-id_Jgu$@FJRc&yX0$E^Wh@CLZIeVFdzQ*TNgr_URir7>^ zvtJfQ6GlRPC6?K;DR2^uw~H_fCiJsl+ZfQRvf#xeIt)$V4LB0`qLL+butG|yBh-2B zzsmkT=fe2rCp;+Hsk)SuSsJ~)T!_XIbTB?bD;c@I`3=LybD^QtG+GHzh8^Oc&_!jL zPQVX~!xbU2KJH@A?5r!z!$Xk>-zUs{&=y-;c`$jc z8;K_SnGLxVo!iGZcSSgDrx7TD&2KJ_!m9OS&A9G0%?l?rq!2I|#j<7awWT&#|-G8|@x2^KwZT&!AfFb*Lrle=;u_4V13) zjif~rciY0B5BktB?@g<1C!^Cd1ab|_{BfNjCJKs!<;!{$Tq&TMY$mp|nMr$N9+P&* zWOnDNa0?YGLnkCP)pS6aO3qJ&cYkmLHg<;8;%A<=-c&itPOpJxCVJkjn11K&riJoH z&KYfQjK%HR1-wa>m`nMj(u)?OsMq9LuF-ipo!t@6KkD{5Z&Q_N9 zXl#voHFF3wAPS|AZ)!ONXPk>h7d(vBKIWfo$rS@k7o z*W1KdUI?zpB)5m(>8#p`QV9gw!wY6;<+%%p8|{z@!>@+rO7oVkL{Uc=Nh7%ea{3_GMK>b4A&FNeh=D6{=PNc7Y zG+Z4UI2F->_jX8=wwF%*1^R=*SUGU>0ZUqe7i^lxG(*wRP;_*P_DQ=l4abMV0;Ctf zsDgtfW)Lz@7arVs1al=DyRvvKIj6OopJuqT4JUS1?-~w0vhM{(yA{vHyWA9qOh?A( z!|bEvL%cN-Mf$GOfVx?`ExdmbGb{alknZB+?Dibj^@#zO`&>g@NF<-}cE(bQMx01Y zpG{vHyFLy&UmxDxOI37#HFLw{w0Tj#Zsd~v%|Sl*R=T+18>vmS0dG$gR}cOKE!w=p zArtqpA<6@24BNfsMw=!3YvhIzcpkx+u6MVhi}m%*zs!Qw zvU*TUi4y9u6EKF{H2|d&D}F`$Dt_TpyJ{|Ea`>-l3pnhxt3Xd`1`|VpBBnu;FjLC# z#M<$HP~@ePOs6)seItcxlP<1cP>?fQ8}0gR?=+s~pr)0%M9(0nBNSUDLPQPamYRCP zM3-}R^`v*yx`$7m)Hbttg$BI%s(k~su6SaS-6F`<_^o8jja_^t0*CnTThUY<<^ld7 zDcDhi1h(DbAQizsWh9|6NweR>YbMrTU4!Ug-~o7ZcsY93w|cI3+wzzu=PAmG!oqYh z$+)v)OCY4UVAIR<=;3x!wwjMQK{a5TG`Oa&yEX_fn_~Mel?2zHoo>sl=6$flZfou%`}M_diJWxt zp+$y=3-WF6GYic$BTSI?*}(67^DuMQ^PaWua8UHe;D z<>ypg4K2ZM?Un1mp0#q@_Tp7<+iosB%5|Y7*u22ldEr35JX@d8gyp-m21G1I?FYF` zSb8kMai^l-R9xN@-K*O%4kzutRHNV+X4?hA6(}BA*7|;;*IS3lzf~K}7f4O*4LJva z>HR*DBycTCkD~5uomcB2lMXF7xXfet-V&=ez$c{XfWB^z+?JZp7ar+&&x<`Sw*0?TrHES-7?iy4;)c>R1iM z74a6)#`i9XQ@U2(TkxQt1gf|#%(Nnss36_JY9_@THWqSUriy-R28xotVCBij0Mm?Z z;6U#~F~tMlaxS)q2lVK5*1L3bT^0d;=$d@cIYN@@IfM#)>Ku1Ih#;aB-hab3-tlv? znWP6JTuuM}tQxR9|G?x_{W&Ia7(tqp6?-9xZEjt6&@8^kv0jhJFz0)VL7Lo-r}?@2 z>ZPBc67kb>p`C_WmALgE-q4NnO>%h8<7+SHDQ~N*ze3s7*=9nfuXLj~7$;VVhxlq5 zF=sX}r1`{nzuT~aJRx7qaW-y7Z$5d#G(5I{hk_B#*PfZ&UzVowj=Cq}N84~CJ4-Z> zY(dw7@pLyoJxpx9`uaOg&RVSOPx8|u(%zu+9(qeBql=av8US-rx54OxBvL%wrOKy= zE88Y_63OAioSm&o14@IIEvQ{;+ABPBf?tPmjnC`rl5SOdEWY7yylzAqo+HX#QBWD%DLUOiO1W=;H5(nOn#tq zkJgb%j@_&@jc`aA4R&N_~j6*euDiSLN}&KFh@% zthi<>T>a~2PS@<3dWz~KtD&t)l_H+9h4h(npfcS}NgQzpNi1*(f@r5vDy6DeD3IZT z|AzQ`KeS9@Bx1fpNO^7F4rI>OTnn_@)iZM1WitFcxaZVK{4U}B*2`c2wz#tOl)Y^0 zVUW7@c3t!jYA605)ZRS9O5Hi(|3PRu@`e2ewI#>!A$~x32dL@QU9+9w{DV>xt=sws zMZNWIA-}$~n4|Fz>d)y%M9;qep^-Yztij9|19ZmHJm!KoJ(d%Vhk}ngRR5qRa2vet zswqkDqQd+?@?dV}81(*BbLGYlR0r}be6CMqM*%v~^9x?chk*76KTl{0q@#UOm0mbt zAbC>xtYJaT5y=H!6!-zr_!%qy7|T56?e%rAA#O=S3^ittvS=u+1%4_)b!gY+{UI_eK9G8AvZ2?pd8snjIM75bOP4ly{@}MR zrT$c;1rIcqY$VpL(KW_TRzln5R``}Y*Mb=br_35(zz3Z13!m`a30*QG2L9=@W{+T9 zT}IaLwbPcWUsgn5Tf)VeM?ix!UVg0pW53MbgoeKsRj-fS)lw!=)l?hPpc4^+q>)UD zxUTIGn9j^+4E#ZEOosw=KsjWaWiXSZZ;bIy+X{a%nu+WR-OdM9CL{F;;3)n_K5_3anAvy$CDJR6nb z>@1=lkHp(K$yZCxGihUgNW{Ad{CBK(yfgsfvH-F}HkcO$eKRek#ZRPUToVeO;MN_%ZiV)T1Of!7ZKlcv6C(*1V|GSKbclu^5~b7Im!Xb0<1*KL z-&n*gnfBF(J4#fU!Yam^&vIZ*PMYZeaUc=mn>Y|}{zMX`+J1UiP0`jzz;iMA&hEoJ zj*-Z=max&M-bZLsUqygWYlzFCJJKVrW~s?#wqW(F#uF+~91x0(X>eYeoHyzEqBwc5X(Y4Gg`hrDNZ;he33ong6 z<>;lkAHS0-yu=DLSYk;ScK*H*^d23~E^4JMVHk2DEsNexk$mf{@Jum6CrQX7R}=hZ zaN--h(5&Gq&krXijb?!6vB>l7Fk4-{X%i{8L$aFarhDqlnqlLyBCrW}yDGkeDC(S| zIBfaVZ?TahLA?&N(cU zBuV8jMcFOY6uZ9OQR#br?Sha@f_a%xTkaM#4_YI(yK=4kFXv52Ozx7k?XDC~N}KEz z?PK58Rv)p3)Sp`q>#M{Y-9Mjo%|89Hnn)NsP7ws}9vrP+FXBq3b~uYRwX-Y@Up@Tw zn_7Ovz|uS)F+q)vf+T-7b)JfR^Dn>fby;8pRYspImb+jSw+Rl4Zh#l`IU{Ovl5*+1i=b(zB3a(1WA5|~8W&&6bSh_{@Qt)Gi zKj(imE5hK#2kpgzlV3@e+V`rU3#-^)QVnE_0_C_dmY=}e;bog3kGtw`$MfR?=-Xeo zTBCn#sFzz@XY>*-7vFD^g1%YkM}+XM=~ew&_?X*~7zbM5`Olv#vak7;Qe6do25zUyg+I& z=Ed0568xy$RB10F5HLuBzSI(8Tsq~^v+%8azqta`+O}jTQ$;sUrD^>x>UX@>@*yKQ zOOiIgUN~xF+YzrcJ^Vpt*CMcdNH|^)hogmJ3IbLfJGOx?2sJ7>h8O#f5cumB!!Uu2 zE_Fz$wUt(OPBz4aHx~kG#gv7IZSwsdMy8?aeS(~!(jsWuX@cy!%ttvSB~=zg_vIKK zCr-B&_U*0nrA2u zt~Hqcn5#P3RXpCeY-VxY5(a^vd6Z_b({*`ML=Os?@nZyBds23mZ8IZdB9inU`C|jD zDx5NpwfmgS^1fpvtSF8{ATiPeN$4eHw}2&u1Lw}7y3LA|6cviz2o0nLS$yoh2)$Ue zHsQ^|3J{Igl5~Z)+`L!fD4wafzX%KF4t1nZRa_t-+nofKgoOTO#1AKHelakSb`-vV z_roGwfNdkEm547&B2Zc@N;l9kvI|c~JD4y}cHjOf)ZGn-*UqUtyKl84-z!PA_hMb*CO>;-ovQcc2!G3t`;Jre`DRovP!I+eOk%M=Xpp zBh(raZ6N@tX=mhq6)y$~;50dVtnbvmsyCS?NYenC>pWg}8R=qZR7NY0*;;JElB&H* zhI#0V8Afj)3cOcSHA<=<2PJzu)hmoHVVUH9mV}99O^h*JQkI%c*s;)#8~AFZ2a2vC zx%J}W*445eiX_0j^bI-}o92F%Se4wNd*(DTz@JR2Gz8B9=}*PZgus{k!@7($wprmY zx)5w>E5(H82GvX2;J|K5t#$2n8Gdz_Sys^lh@{}gYH{sepY*OB9naD`THk=oE~JJ>j9P4g`UA!3+5k9Jex;im{*nESwSy z)v-$pj1KQgN*&h_LRFc-$An-{Xu;zR?Z!`^>|0+&c34x%I`eWmkjn+!+fbgS7kp{- z8A*7WH5HD2+UJm5G>!*aV#?~~M-NE6(y-x{j!nhV6=Rz^rZ}ybsQ-y%MHw4`|4F#H z@9*}}#V--l=L2DQC?wxGPL@===lS4HP;hb>4kfukqKt54qr+qW#N!8heU7!DeXlFW zn(ioW%JSH^Af2FR9<})~JUgiwh~jZwIPQ$0>Hhw~IcI|%rZi45+ynM26tmQy>LpiU(3;G9SWMmkYP`4pqd2sG`fM9-HXR#~dqoJn%IKUVT&U(B6I3^#wPw zsPq9#ng)j=_8(KidGTpdNPHcHspc`5m`rNbw3sSyGU@7fB|k{30Kk_{r+nCbgPgzR z%5siUW$d-RQURaVzxbD%-SH$aim1AcCHiR`4X&rUKBH|+AH+S}+W+=e zBg-#p_AONN(FA3~N7DU@p$hJpWz3~YM7j{5=A_KzsM2m6h#r6mEx#QuR#Wv zFr}zO;plRU)Fo2{U|Vpe$tgYWe{$9uW%GEr2-?mUw~Y{af*7Qb0yS8dSPuqady}hS$V=Lc z@rwlp{-}bpI<@bMmzoS$w3&!|@OjQMt@+;z514;@1Fg*jouh&pm)F=Hv0>NFqCGW_ za<2dWZoF(|8n7Mklu3s>S98H>ymfk@^u$7!a{x zF&Y~1pnLFiy&oKErVtYXY~_@7I}e&J2oOB5m7lD6X73oV>n{XgPrP?XDRwkOeVnZ+yKYnWr$};*-uPKmZ6l@mlnR=zv8d$RmF1t9OZ#wdv5Ho z%3XhN8D!DY$TSp)^$dT2krO+*C4#k_mUG3f7=p{fBd3VJHcVv{OPUcpMLFq-ef02h z_u$Qk5u4FYOM|e-tLteS&B|P@$`>w+3>SHK*a|_Z*#!C>c-I3Nu^ZdY?7~j9)6_A{^0nNBQ+la*T6-3~SD$ zIm^~nT=aNg_rKT9KJTbsZkm&3Gf4l5{= zH8l}L_wu6fOn^dm!VlEo83Tj%qC?~TnUTa1Rw#dYX~l!?^<3?F64B4VsRL%~G8%3+ zW#SB08w3R1QtGdn&q|a+)ACl-6WAU0+`Wu41Hxj*;5<CU#YC!Ve zQ?k+7Pn2sB>rW*`xI7h*#rE_}`7o!(98K~_;rJs_%FqnCQgaI#NZ*a=G2wDQps@JI zyV2&@bkr1ohN08Z_CaBq!*kbb$;+-X?IG&K<=+-(KxpUq*QWS7=z@=ap#n&xYy9)5 zOJ~VD@74Tbubu@ad$xLpvObCAD4b?f9z)GqizXzRVpJ;i^!eBeaU6KSsS5AsA z?vHy`oALC%cF*AP;j8)^Y(gVRi@X^)(x=Wam*RR)VO8vG>>6YcmuXwKsRE2~uEmbCD z4CBe$DNN}+(D9RMJZKHnBFjE&Im{&{c$A8l0Aut}rbX|NJaFks(hkl4+ACGl8EkIg za%|o2o@?xI(MFL(Lba0w_mlcJFjTtrD_^_YA3itD)#mrq#w{o64z8IbE|`R0X_Nn? zA!yU&i{_G~0|*KL#r2$9VgQ1SE5D!yN@@>1Di29R2Ce#QTPJPr(H`UKiTloWfU8L2|D^OAo0~b=4p9;RUQ93~=1G~a#Wav-)zLu1vGKIT_u6ZqK zQDey}V(H@LcoQe4WH%%;9LrttJLEo;tvRHCOrH_Sc0t}kq6dhv5nMDebuY)GSn zV-3^Ak!!{U8AFW~`o0{&oTvO$T;KSW^{aIz;{D7fM4;Sm=Xyf-7_?uKWby(X#{$+~ zY_NBw%RR!lk8yxSjd?wPnJwuP(_Umd58Ts$4E%#qPI3gVa3>fh%x>A#Kd8$CjP_HQ zvtzaTh?Bl&xGa+e-_Gq_F8r&B0C15n404rzjWrO+J zbs2n6^`2Er{kvFWArza;0m`Bgz zrMBN~8m`%)k?Riu!d0h&l8I&PgDN0ZS%bT(_XsRgTS%N6w+7eylUW#QJeq=)2> z0iptU1oMZSdwaZWmNZ*oXa2iq>OV}G`d0o_l5YxcW$$N9ZU3OK)}HfNj&46>4|Np) zxCwU-y2{@Vr??Fh9Q-MAR0AlW5Os=Qsg;DdUKq);v%ra zP>yb<1tPO7BRNJL8Oz~YnSmK54|rW7h_y5%8A~HR4NAq0mqAqTlGM5`L`A5h^QR{Y zf(aB)mQket`N42cy!?9KcmG7GhP^-kgJQJ5ikZRoHA~Fv|Nay2PBeQ%=8;RIa=61G zymTk;BQ{6y+h*VE={t3Jj+cLD*yGY)c?^NOe^B0EE~}q1C_InfA4s0y)=5e|M)#(ivRzO|NlGwKaU;*`8En* z`F{SDs=;yfqyLSIc#Nce)&08TyfT0ALtFU$-kEbAL(-QA7nbLB`>XL8+=sXS9Qyxr z%8<4L6z=J`8E4l0wI$+hb#hr z*G~j44`cbCza@K88qi+6PX6)LLw!MpyE(s-_#z$r7kkmOl2hsEHmkL*i7UPCxxMai z%-fv1v&x+tN4F&LNax!d@E;VI<|b%y>Z$J^)ITWF4=8x|Te=F3SJz%{yvrcP3Tvyo zE%Irb3s@=6aU#5Wpdx2K4na^0Y|*Y23~HRwR;OU3agh8F*0V|c#U|~=DV$kNM1myT z`U-n2|BXkn_`so6@vgJGS8cx%dd0s*w|~{@8~?D!AlFU0%izV=KB~A{^pCQa)iFrT zrs9VYG!^6akKS>tZ1n`-PkxvgqyU~rV=pQP4261(Mn%=>wMP5z)aaUh&w~e-s}IiM z2ujc`oNy~$E!a-GyfBp15K4-8lJDU#0eeOw4#|=1!M$FJgzu{E=Yx`6X3?Z4Q4Zd?wkNKSLsw=~%K_`1(++P~a^8P$NL3 z9@PQs7tB{%>&DHYfM?rdbqtwRzC%$xEV!V8@f91m02ZtI%83bP0bLJGOI zX`1GFZ7{mlMi>fkkId_s_^VIlvQJ%_hvt#aoZI-F>vc>56~~%HqAUxJ9%$O6sVo;kAb(+M%+E+`217#Hn1_;MJv3+u>ih zIC@kMIQOvr^IEI9 z4PK$%9vwHl(Ymg4>gT>Nc8B;9m-Gms-um;NymL%)9E>nf-g$-UKeNAxEOj;2HgFG~ z&fs(i>t|5R=WGb3bT1UI7`U`^yu3VT{GIJI_1~$kjMdjSyU%P{j`9BoRku||q%kSv zcwfGsdv@h6__17_z3?~Rb$&U<-7c0Yy?!sA6xgbG>Uid`h`4^yG5}jl{K;Hh)!z-) z)pBhdvUL+VrHUoV*Y)zUR}&HSaRY5sGQK7y zDV#Z*qV_ro*x?p?e!EH6nYKJCa3OII8y5{WSE!~85;@FD@RF}_7-dN=+U+NlwW}a0 ziY*mv(JvYke*|@7kG#N7HMZeGq!&^JM$*0+Y$_jQ(A4R2abo#0v!H zr(?YMq1oknO6DCeP_m7LdN%reX{W|I0xA~tZWg9mO~*`+iVueL1lhFbFC~{J z{%@on+}pFiDPpZ`zDi6{4tOz&_e91F=iW3vtIcyMz_I6)R>3J^uWzDzCRZyQ{>=V6 z#8Mm_LlSGeTA~!7-BjX zR=Wl!yx|MIVM8xF1N>Lu^o#Bxy8Du}tNY^ib>iaF0q!dxW9}&$-Ov`xB`(D?P|0Ky zLnq?Q-5vc^)>Xt15m@RZU2a1q)`W+dgu!FfBbY+{MN4?=o>qf_e_7`7+pkWM#9ofM zZQ=^s-SWQzVA{-dO*yEu(rlhm&#Q;GE+3(#eD(Cp)*7VBaMZ}xuQR}JMG*f- zw|`JbFI*Nnq?5QBDQJY%L0R-!k3r%F;L7sXe^4qK5iaXmpr1iiqoYw2cpr_oM>F-M&iD*%nY4Mk!}pXeo}x=fta9eo&9gN#dw@b0JchpxI)J%)Tf zXbwiV2l`@p<6`1lY@zbGzV(ND(%n`2!Ud;hU+j*$u&Ka|4w~2*!q<)yQBpj+!k;h6 z+c0+4nPVamyVp#bPUYn!0LQybGjAPt&9iQtegO}3e;);Zv(=&G)Gx z_#H>aYj1I5|BJJy)piB~PG{TQYJ<<5mfdrbkAr?UMYW0ei@Wdiku@9=mya{mLa})~ zNq46x=`b#2Wlv{Sq6u8qzW5#gpbna!d@F_H$Elw)&ozSNUWxwpPl?(LSfO%4qbwv2l(n#ZBGl!e!c?uL8E?qbbETAYAvag#232QjO0J?~ZiPNGrq?#Okmpekb$~J2?fh!NxndDF5oRbywb`;}s!$0;qY4 zDVi?4<@mTx?4m%H;3gho_&p3lp8m9HWBp{XuVIM!D!s6?o#kubes-Erp2xJ%_byvr zzS3l%GxUaNWr)Vyz5?4Jc&k-c;tJ?a^LsC;S z|3XrTYCJ7$WWi-xM%%w4MgCKkeAsC~z2+PlkvuF`K$>#39Dd~xZ~$9^U838{h%mH7OuoJ$_T*$@4+pK?eJI%`kM=^ z*so$6Q$+G`mCyq}U*-w4BTR|GZY*R`j-*P;av7{SGx5=;HR*@H@gOn%aWf;wPS8bH z+gLt2v-b(yfHclOCnp*VTxBK|bA+$xI!uquwwEW@`%O2s)#TR?2QmAfij>_un~5|i zOqESmgRjfVZ|IfxW?F(FtV6bIZem*#AGe0ee}$WLCr z7gFN{lsmI3GNIh^_6%33zuUm-4zTSI4c^3|=DH?4v+z=~neyI1ZGgmXtyFP+0fa1H zv($=>B9soL@?w(>B9X0lq!nT&O)-fdQu%Xsjg~qzu`~hGS!L9#udjX}KlN10Al=kV z-E}&UKo!Z@q=er6nLpzNPgW60!;Ni1VjzS-^`W!yv;GkmM44yc9iuJ%pyZV0x?tsD zIcMj$!Pk%C=MXYWu{KCt54A0zK_Z<1Nq)ejQ~#QVASfUr7Rm$7ls7Gbh(IB{I-g;k zrUG?uT~=dv;;OClK8o@wA6SLezE@x{ED}TnPAi7 z4$`yi8~(ZnrOd)Of(kn~63W9HU%nHeI~|o1njb%@PSX;?sx8t15A$4WSJ?@=? zK_ShEsa9dUIPjJIk#5Ca7`I8 zg3GPJXpNXeRRZkIVAPP-kflBLnw|M4Z(+2Ez`nO%)v=L~325wsfbd@o5g77|2NW#< z(EP37eQ|swUZlz$Y){E@mA+hT{ZQ`4rM7*lt`vi2R0gs-07U_O0$Z}`nL|ecS=LP0 zAKk}7#zM(&)k!DD^sgC{P|$s5fnu{nSG7NpH)HIT8>0UZM#eq}?!|xO47DJpo1)zW zUR}vK@ir~0Ar)RtHr`e)UlRo)_CC{AN(Sbp8MBqn&KqMbKhX$0J)M4{8e-d!4*#no z355frK^M8g1eQ4_KJvOqwj!LrKPriQm%4iy>$Q%ec+OE|!XTdV`VLv=^6KZlYekPN ziI^3kq0ORq3eU;m`XNoULNN0u=RoNbEOABU{e`hC%mN?5pnyF^s~W^HH8g(L0PVP1 zK>#<`;&?tYzOfMmurslM<5rsj(x@&AA17|zOD1Z9X!Ec}mKAO|4j>TYtY{~6#gE<4 zCfZRhUJN`whZq-N=v|gKB1_}1*drWpBe`!jzx^^Fa++A_`{`RgpLghp~-n zx9{c41Gsc|JXeRsVZnb!ob9AGM8MJ|Clfb*e|@mc94UtyBh;+WfNfSbMZK~5+%bGh zVzGFjll{Ty#RTb|LAEI;SNdY+1GOo!;mT5CciRlE(5+HqO!#dD8+LRt4#LgonHLXE z6+tS1+)Q_&DwM+C#=r`u9h(%p* z?BmQUYaI8d<$h(6j3kiaAuMY_KqgLEd63Q}=WsTmN(Jk{kinK(FNc{5H~tFQ=N8Ry z!L%fCsuPGacd4Jb-&@j*%d5!@uS_zFTA@=O zTVb_VcBi#6V`e_xeB>&#`@m4l7%lk$;JOa^XN>h547k;dL)*96Zt(#^U(dPPd$mEp6Fj`}rW z?k^zntJs%B^B~`5WSsGt3&6W^uP}en zhRo*z(>e~>L-J@8aLi(7mFGpieR>OrwO56osa9j0C>kO;eBLKWOpLlPB`bEKIs~54 zD?^98Q<}R!Tjh{9-(IGgVPWTKL6&}l0Xge$aJC!ZyVNd!OLCtv9vA0iWL(|gvsMx@ zYQ#ClRQJI5TWc(gIAOF5uIL|pJ`4oj9O@sL>%YxXN6cd>>npz=1|g?tUO2wi||&k9qz3e)vo3;k+OTS~2$;Jb{ z9<_HmXCF@du@Fm-9+)k$+IcdncFu3CmpEodNeB(hF;vLVB!ydE6e`9p@TDgAYpreK zk#dIbti%BW2+X1(=e63Nex^e=y4I}ahKozeb5a8ohE^bGUs{KVf_QU6qR34?vK!qO zN41MsBivLd`R~Bt-)wE?C6)y~u4u6Wg;SHyy0+I7wiSdmmX`2+qD~rY@@#qi6u-Qo z0yN>X#bXBF{yyqpTh*+%$u`&WeEA#zGPygbn<$eK8hK#x1{xQ;ZoV6SM1qRiX5kVb`y zENQNv7qosm@JJc*`l`Y zyr3c8rN1w>(2?bA&9|ztQ{HK*<%4)9*$_xsIgL6C`NX*Co3D~0U#W04N`N?o#>wHVMW~Ppc9wCd}l0^cKwF(iG)y! z_-qA`XE^ZR*n7*Uw&JkM7ifzVX>oTe?(W5*Kq*deEAB3(#ogWAAp{5>T!UM%;O_2~ zVP@TX-??|*HM7=T^Km|&wf;Ft&Pj4k_I~zn(>Kz>2CglYi5jqCeMeG`PPM2FfL|eJ zTJp{j*+ld_kdO~ip2ht^^IG8P5h8^X?me&SW8E*wnO}dogm4cN$FlDZ*vNd#$=xbP z6vmH}s!k-*Qlm&Q!p+CL<#1+;@ulp>AJ-K9dA<5dF*2V<^Kitu!>t1J@V>#UDvkt(0N_Bxic$cAijq=({nIxcqzCACAV+9*^1Py;0gck z^6(mUK>yLbNJlQ(89?VUYw4c`{(bueMRM}?=;L%v;Mav3#n#}u=_|Ws>xzu~c@HN> zc?5rn-5Tw*(eMM9V4Uvj5yeOXU@sN5O_&JcrctL>EpgN%B#u*M$k>t3?z(AVXSEs~ zY>2}iYVQnGqO^D4^8aPwoJ=9eSdfL-Gp2n8pQ9h7&M<;%>?VibGZWUhl>W3oK3|Yq z7jzNM+2>FB;Ge3Bv!T-JJfjSZ;*wcB$~%rGvlo7kqqjOHNr1h%HrA(*HOtH(`Cb@VIzF4*?# zrrk9cRpHIYauQ&`t29Z|uE^yH6f6plP=v4xu11_Vh`;l*Ic3<{Pe81(Xt~g1I@Q1v z3pnO7ideI8feLKnjhov;+x2b|2ZH^Fd*a9lPEcygd#lL~BI){%k77)IxsoA_ItCP1 z?sgEIp@Z;Vd@?uHs%k-dM2Caa|fa1?PI94uBiNd2weTXnjL%((Y2Z zco8X2mQCw!d`Tra#!|%io4v1l+wIc56V2D{eWK-7j5a*a38q2_5JL#Vm#;27YWuON z$;d-yQB-c5SKtF|S#neEq_p3cBU}Lc*l31K&(Wt*g*-6zhd~N@lKuLXL+y&`Qk@d| z_#2*p>H!K)4bGt~cbi_<1%h9gG z7q)Tz^%<|9bIO<7)gmmM&&~az&}F7|`-9{JUjM$WR*~9AM?{TA-bdLyG%u|ic}xZR z{ncpM93JLDa|=5c3N3!+5S|Jyd4g92Va!43(E*|mUXdJ2M!P5r@(;S@{8+jB>2~8t z(|2V9dcCkkBfvYzz!kIo`!vDJa^A&stOn(M6UP1ELhD6C=xxgrxz7IFS%<3yAT&3h z59+F%8w74N70u1FPGn%X8s(x7`Xo9vkSDWqm%JNdEb#gG%iPD zrfIE!G&tZlTRGU7oVw-*EenfP6+S*kmkDVKCq`ib=1)-+bPg5Y>jxPYaRXc`!#36w9|-u^``MPedy42s~E~ZqDvl{vKx$crai*?9GPkg zP+*P?I3qLra#6B~F@w&94C7bOsML&hHS;{{IX}72<2P5!(;4k^4wxTy{WWjiYItV2 z7j|G#2zd3jsFL&xz6{Wtj7xi zr?fis=o@5h$tPdSI)mn}P^@&5k6Orzd1SD#gp(p=5zfCi5+j7>Gl&L7mS{J7*01EV zTWWw>YpYw!PB*kt4p91T8UZrlLElB9bDgxAVx@nzU*3#lJJ@jWOKYn0@73=bi6)WF z^u*$Dj)33zJ;*uUov(Yfd*b7#SdBUEX0bUaVB#SZ0-5YwxRl~-U>KMstV+B@NhC;g z7XB9JOOeplDAxbm>iExGKEeT~BjtYx%*Jaf*cKV!w>2HC1I~{)rhWODd#zpMNCDA# z(Br3N!@D06Sbd{?@}v{fbh=H$hq5%0adJf+Aq!WpF&Iz~vbo*$g*IfHe_uGhY1vaz z=h&L$gk@RuN47tQ{f=X%bG>1f(|56{{u*Y8&pz?_r&Tfoz4v(1n1YuhH>I#$jN0aC zfCURp{KPIAxn!SlZG(r;WYJj@d)BaVaY}BMAA4gHUox+~Tdv9eIC1USN{UQ>xtNhq zlYuoF-n%=YVy%JR_{0l`9284ZiB>?Zv+0@5I~AQ10fN*lo&MUE%26Kktin5WSl8%a z#1pVJnvV+Oa+~P1??~ESt;oDh_*d41Sl+hLG$N?cU|W)vkwwI|X#DrnyX7G2xfNuxPMI*h5GNT>c?%@XSW_EV56B7@$oMF3!*vbm6It z*v4VwCQ06-HypMYvJrX9{!;=S(S8^8E&?oC;OyK z$yYkYv`P1Pf9J0wQMv8(!8{Aj#z6-@V{-=g!pTqNI$7n)HiJQWmgYp;L{h{#@4y6a zqcKg0ci7e47kV#OToQ!%aL?Z;H{^$yd0N}S?ow|q_j}Due<(iZ#KsTN zOc4Q(1QJ7$41d>#v^jf${5ssc%Ua!dVcD@hlaVKownG{jqronfx98{S&&OI}@YCa0b^TGW8TuuK3vS}f?7 ze+W)zl=4s{qjl@0_$6>*jYSpb==qIg0&b67>b4C@J>w<`=pS+L^0L3GV#|e}O|4FB zWFqscaicnVq$!9b|drMH^~Gj>LD5Dl#g%|RTJ;M5a#Ca)9DR#wDNL>fB5oRloE46_}xC)lF1CdvG1*| z@FbEM*c@LusFxsYPgmFDoI5+%s5t9z!cx$X?c&VV1I$JKm}9eW0wabjs}oo6cDhDT zu<@0Qi`x|^$n4{e3kHe*dbwRbx6KX|AA30>lU{>nHGTAtVxF+Nmb)}OJg z_W;dvxCRbynf+GGeaT^M^(2k6!CNTnQ(eND~(A;$t>PKx0QJ&%gS8jn6!l7Rs-ZUCCtTN3P z5U(KL&z*kt)Rv)(==4RNYrL`k>*FVuROB2hd+RIey_mP%5Ew&XFZU0jYOJ%sN>}!Q z1s~S@ppm`^=;~gaJ>SiFJ!gmb?WHd~Dqo&)5=cGUTcKiF%0IgGs?In+geb1KEw)@C!a z`tkFW>X7(XvUfE)PUFjBDF^wP6zk;@moBdiU!4<|VUicxOVUEhLx1jn2=^E-1jCiV z`vOaCKg>j!yR%lrAg%!huFQ`CYLsr;6d|{qfsgr^Eq{W=2aU=;WNetdsKhKCFtRkR zI$!**v84f?A8+*Jg_2+T3;gN-uWPUyNly)8mU5$wB?vCsI&5~%o|mFu#K*M%zH{e1gwtX&hF0!KXlMzy{&Qs{w()0NJ&imEmtXvqr0h}7!EZ>-D z1*Ab8ipqwqaA!d4t0`iNl zDh>+C(UA|3`z5M}|D~xl@u+lrW2z%AZ`inC<{j597>N^U=-g-V#eDsTDmH8+eA(r2r z*gnFLTXveb`GCLZ@h8BMw7qSgULg!$Tq0EkSc5peLm=P9pa?<*jYumZw<`=gYbCS`7$QOIo-v#-wF;nkvPh)7s=4IfQU z++L8$yHsLs6j|ChY1JB}`D(4Av_Tun4Z2dha0-pQ2hV-_gi=w?^2GHM#5Pu zptaksN8`tBPoxKcWiVSPdC%#d_Lrujv@YxBj1uY%qhy2NpV*6_c;Zpb9X@(l^8p!j z{X6Zuwr_TH4wfw2Za-7I;=O=L4Gaxwm0&Ep_DV;}(sSe&(OV*-b~$&@Ww(V@#}Ee<0~1-bLvs#7!-AL~ z&tQ>K`8G}KVHSMS%8wdi#r&bAEtlsFz3TK-ja1_Y#%XDLFXzQMWwNDPr+UaLZC77B zU&&Vp78O}NQf_FNyUvfnZe~`Q!M2RkOA!^-^EvFZN!CZB79bSd;efw`a-TQXx(amfcV-%fQ{$7IuyR z;61YxS&Q`|M|Jy&VT2h~-?83pPArK4g=mU|m%Z?{Y}L6zym>GCXY`V9^m(oC?Bx)o z?Gh90LiUU;`>}OO^B3JZ%#{J=?Ryp#eh9H0$S+SdqUe|jFvCnEz*w5H(!NNc8cADJ zT&jta*}VHO*PkWz%Kr5nAV>|3^9MJawJ=GsO&i@OJ`MG11(bzcnX9hq!P_D`u@nre@)^Z zOlPU_TIT9bWaLp>7MvcWB&QbbDHAKBzL4}PV*jr4Fez64WPp>0N)4LOM$5g%N0vnr zv_1DB^)|cQg+-&Hu!8LO$9I05oVFV!2F^=3o0>eZAes~uwTtqUknAYf8SX|1OtmI3 zuq?<-i(RDkhDJoL2Vkh$URMvbOxSq#;6vMbJ8E1n`_$hy`aLwLN#^WVJ*c?ihPu#u z3+cujX%~67`N$P9mPzaDj&%UuMGPI0XEu+Ws$a?Oh0F0_Yx*;-3{}k3YIC?>-Ha*B ztkRMY)c{8&Haeux9v^?nAdlQ36Lv-Alh78TJ{J+^6t z+`3fED!~lH{g`UY6Jr`{i((4Kni-TVbe)#Q<-Vs#6Nn*2in6Lbo@zr0Vx z7S;&4GQu|8sy1VdU5>rK`pn)aoL%V=aVd?cj!#S_ZL=`e=UO6a#b-<*!%G<@5SCa8 zKaNb7=8 z{jRE@reV1ukrT8#D1Jd~7P4Z&hJbZdyGY+;qh1R?npqq?xOkn(ow6H=w_7SuFaF$% zL3<>{$nK?_-k)o0n`J}7kl_!Q%=8eiPY`|rFV(En*`O1f3;aSGIp9=4gcSLu=58$< z)_g>j1o`Mxr>YCSrsw43tXiL$)!sD+q(ozOv_$K4x?&zgJYm{w^XqNL95J+AL?hs~ z8&bW$iuBf$WAVqYio06O^ieO%{6moCsoTI!CQttO;ob6+aE?G(N=h6Rzw=hz>JKn{ zLKAt@yn6fu1@K9$!E^zfmb|kE&bV_`NZ=XC|9A|#rn2}XeiTA$1WIwRb&aY9W?sTm z`5H9%&zzCAVbie=n_Yv!SoXYa1<(Vozf`(cuT$y3C5VCETCH<5YjZPQF4*%@eYh)B zQ!vs;3uma3Wg~HCUOEzsYjYm9jF$MbQ#K$bkik0jfLdqzXusS`-U9C_Q)CHU@rk;Q zdg%9`=u8KmW3Gzz5gK=lj@n{B*>DZh!(<10f2?8qs~ka*%G{N&j_*eY4t8Oru?kzd zJM&ky0S?>b-hWI-!*zt;c@U^4FArc;E6mX&gAyl$%@QMSz4#*Lv%d2VG8(>-HlXkl zHaJ@AwXe_eIoV7jdEkl{m`>m&HR|{C(^OnJaNy_=-shn;6^yuQjU8~Y3pj)`rF|LV z$}y&yus?NPv91N#M+*LN5pZKomapJ*dz&xDuOJOu0_m#`o1>s{a5 zL0QYzudC5rpazawdGfM}UuTf`{xbQ{H%dqAh>xh-u1JmW9>jNpDZ~teIAyQ zM)b*IuyU@aZDRKz+=wtzQ=fs39NXGfy^->3kleN>Qw|+-Ll3)l0WbJniv&RXNt>JH zMfH}fq*7~7PAo>=c3}LPEtJc~<2DcZ=0-Gws6(ORopVsr!WS>=zm5xHe1&|O_^%IX5?hp$a}{*r&PVxzFIptB(uf(#Gt(KLb*x#^r2 zme3}DsmJw4C_1u+Td-Nrsw*{o*-NOiUOr8?K|d3n0~dlMOoUF=8qW;YG;z8ZWDE=* zB^iFpd%3QyWuKvkn;PcdCuB;{!0i+hgln!cDCMp>P(*FE>+r+>u#AZuHW z;klf-Ez7g_iPn{dc;%_3{D&f!JphWyp;(zuMotn%%f;$wgOTVN?As;OOn%Seru^-& zQu$Muzr&xfH_LHTGlRo@>nz`#KRvPP#fLF{MNj0nkJ2yR8OV4q1WGOSD5zAV$3DER zccBdt|CPXQy%?go*gh2@4UmJDp=HhXKK6c3c=yYB(+^_%UB1#T=RjI_KPnujHz3>b z6_!|vd_)4M%7OP zrj9*7ws!^(m{9a#AD@@NtVcrE0C#SXJaC@epzfu;oc4ygCGKw13~fXKkDkdRCjOoQ z>bkC;Av#|rtGMPotH)=k+k);Z6L!i)-D6&Tl*hN>#KY^&TCX$FAg+0hSYCr9{Mi;& zR8*VCmXzf)FfHN^dqlDoEJ|fa1;nL@ONn*MrV%3B2TBJ-%jK$G?ctULSr3{15Vme@ zFN5r>MIFb2cl|{LYm$=o894O)K6`OHEF8YK&fRbyPLnbu4o&jdn^G;~Xk-*)wXJfF zQ?=p^nm)HPemzfwT@*skQ6^n4G>k*7O<&O@3O-+t&Ycf{AQ?Hz z4qK71a`ePmt_glfZRx_y>_qX9K}*}>&ou{rHpTGFAe)=FU4%V3#V+?BbZ+ zm&1i=vO6jLP+GnT6ZNkpjO90?brqnikK29%u#ImyM}^)(zq&ES!ALvaj#g-gtO?1O z9?}LRz4LIMQF#|6VxkHd0bn7ql}ih0H4v=sKCvxgx|;7_s&xt(^e663p8p zevcS(AL!cEB0dz8L@Og>)RmEeXMvXkCc6_k8ouqS3D)(AxP)x z@Z(=$nuGS8rc=X-_?&#Y(OtLeb=?^EIMNO2XH)nQ>0Dos<=uNC0%UO2{%{r%Emdt} zMnqI@?r9nc@T%FXo=~{!x3_yuj>ll$RT<6rx#hvP79KK6f9-$U%=pc%IX&n?r@%n} z4PUW3UhdQQDqSeoH71Q&HN`_A@}Mh-B7uZyGxLs$qCrPDcM4vr*;Q7UIGoMug2`&H z=JDiJ3tTaT6`v6{VYVmY^~3$GqRhFCE~vnb4Uqm>%EV<1+;Xuq>H-p6x&~euFJ%KW z$`Cobaf={>4>&hytSd~>*LEPf%Mg^vB~Iky>D&|O)#p&w7KIbj+C%xWVW z#O5f=^C2g@u^exRk`w+UyF1fQTros*GjV%0emo3aMc8KRNpz^GOR5?B0%bfUQSP`q znD{J!tH5gSv4udLR5mGAs<%1G+<;r-x449D0y>LpAVUGk?3!_^s98i+bvhA=^I}o0 zK3o{AnK*qL$uKlIiN4-sg}DEab9D!hX@FBI8ns99IuK~5nAR0t>7uaCsmZCtK7E?7 z)2iT=^-Jx}@(Q9ct$U&!zWc;7?^(cH7V-bcX*bGG%o4|5XF3n24vUX@8xz=p61mte zUR%dU7sOM>UQ^=3kY_dHeUWofU!mij;W)lP?H8k=9^-|{)zxmx_`3K5bfd+s?EMXU z*dj-%gM;PBYiP8pA|fx<_^lf7+;%Wgs5X7J$B#+&z zu<~ezkVT2HZQK<30rZP@X%ReWPRC`0(pFJbYnl;Nqjl-Z$TS(z_8+DSu8eWz(F^)Z zbP?M(%9n%Rpzb~q8Ds43QjXu1fgZfF0mJ8~T>jBy&`KDKql;)%I7^BDVR8Publr(g z5onO=PfN+EkTD{pZ@+%?_RE@8(WdKw&SSSuZ^JJNH~sp+6CWHk8ZwzhRGj!&cw~`f zv4*Bx9<k0qSd09(JK2d<;V*Q1IVQ+5xl4j2#oxz-KN8XxfsX#6g{L1K4 z4`|hY7+Z(0b+#<5!mWQMu(I>gN^c`lDi$o)!7)W09w3c=^2Ttphsey??HlKQc?v;{ z4VOG3?7uyclB#yvk^c`t$a@yy;??6}rRBky2|XeepF35C?)0W-XM z^>{{W%5BuGH7URXz6#UE{9mAcd3psXT|65eg|rtBp7P)pGjNo+8`M#@*TAT5m5!|a zqP8M}gEaOv>SYuFiyHgfk7N<3orAjR?a1G<;PQ9oyrFONiqhd9!ZzYMl{ZT#+x}Yn zuyz;F`TBkNoMG?iF`Blp@3!_Heg@@ud-tcPLl4uVQM0oZpHf!BDnRIy>8|_Km~d%W zw}K$4P4Q2gHwn<`RZLc)I6c(>iu1&_IWwqYt~konK2Z<_(FNU#L@jIH?0I z)0R~2;Kn!3omPvpwu)FgdF~)B2KA4+m?c?}NX_wro?I9gZ1zFL3ah_BZLr-WK?86t z!|EF=PIO=T!oH#1SENxJI;IDL&?L!4ao$edQ;j1lelR24;8j|-{COif`D%(eG&{Jo zY3KQ+2&v|`3Sk-skgpqx3Qek*NG5^1gr+nduyLHxVg*!hs& zJ~#kR63`(OOmg(o?*8#rI^buv{%UI2@!o&UCjJM~{Qt++tB0p?QWjBZ_SbUb>GkGl zK}1GJf%5dw_@;GZE3=5>?BzdUJO7*g-=WQ?KCz?8#vX^BGP(zQ{X-Bcql98tRGvO` z1gxGtdb_+aYkZ367k*qNs04GJsMSoLnAm96wtZEHoE^dACT zS?o3bINiSp@_D-m4G{P<1pJ49S*5~>6u=KMoZ|C--k6#Jwv15QYe`d1Q5>8H$Ub26 z*$_@w)me4K*Z%&kaeP%H1L!5>F+3~3d5*4D*W}Fc6%*fn1-%Jl2jF^WF488?<^yyi zT7tjLuic{*P@PHS7Pj7h493{V6+Wyug zvzO78fQZ0QQX_NE{^}d1>WZOYA9X#Fx%U{>Fx&+s5S?aIZeJ?uGRaeU`TAGkfS%PSwNGDMh-;+Yu;|aOrXC#7GKjDG=e9bW)Nt;O zI2CXC7(8lV&tBfOrBV`)o>m(o^Cc(F8;-XjDAXkF%JUUo;G+PGj|LTkm{`m)2QXN< z<Eo%tZunS%(CYjJD3# zm7Bl0?rWL~%-GAyigS-JNVGb;8Z#Eyw<_=9#_t|;CA?Mtz4+5d>Bz%a`G_;C^6l+6 z?Y8)G?AZp#8exU&bpHODXlnNm@rgH_t!`3K{Z#|U&U@6TdyFUnv?+6nEwOR8fjV0u z8F|b}(wspfeEq5gmNdA z0^d{V-c#{!mYv~TjSv42st51cFN%kMD^ah#F2kqR7Bj@e%~uZCP`cUz=9GGrF&?p> z=fBo1j%Us<`q}l}+^0YA&6|EWGqA5;!2H0%>SkB?kk(w6#z_BFA&Kq_E_9Tu>^(R4 zC#ojq?KF#7MRPeA*MJeeMkz^EUbNyj8Y>k1j>} z(om!1$|F;ZA~0lxj1jtDJem@bw2iHwtWE@!ZFyqQkYW1(a&G3P-%he0P> zapuN-_PJsFuEd=7u~7rUaPa)qF8Di+Kjw)EdxS*8eeA^To1SQ+jq65z<#di{NR zIGP783$yl32Qi8~5v@IHDLU$5S#$Xt1B8^ZKWt>0dn5BIjppW+uDQ_{8_oS4ZIWe4 za@yi6F*%+jm%5lCWA3$Yy_9v8p2&2jVI{tY_zSh~bEBCh^djaudu_SU$MhrOjPWn! zNf9yMC_lrPS1JLt;THVxjueRls@_blg1DPjm-V49Nk-Q)iCEtfZbB}b;u$rIAi=J{ z23gl4AZVumu@k|-#x2K9H0k`iNBBslkZ6}(rf~VAsfm)vQCvIKMVtXe0b$nVPhf9)8=6s&gedMeX z?;K`L98sVyu}Ll6y<9?4+-=u_vvy@>x3p(8ajwt4{)Iet^dyg#YtjMiCSLlx364}= z`F7|fWf6{oDu%ZPV)@Qxu7lrQXc?8xS1B=QXsV7S$&?uXx*&wDijjFSu(b^7Ixb@tnvUTubDewaC}C7zbqcQqRt4 z7@+))I@qwjUK*XoB}>H^G5s+qm|E!@{??nfCB8JYqWBdxl%khiqw2W59t2|o(6^57 zhh5(UHFRM(3v^}!OymWARXu&td#7h>jxhpLKz&ZdKiAsR655%mag|xbc`({!-S=VD zmjrFd61+lOCL|Ic9BrQI{61I}x`@Ykx(k#V#CWl6_3?>OklC_O?34Ao642`z3^lhv zGN-vG;wmYVIVb(d_I7u*tJ-OaxT^f?7B{j-vO$ZCzN_blH~}S)X(QMc5g#;K3VIdkMU-bN_FeacL(4Ak>s%ik?X(ORhEcO% zR&<6iEEX%+8wOQEjXbu*$?8nS1RXJ&)!C)$&7bAY{z*`pYzW32=nEGb$(=%+{rN?Ofc=d^r&#tAE*+|l(rW9+ zH6??U$2rI21(UF+dJ~YFUSZesuWs&U*KK=;j=n^x1fyj4OK46qM;)Zrp-CTJPS{u- zFj0oq7RsB=3HA6If{SF07jWyLuCN=Y(-`eQHBibq@Wy7X*a6OFqCH!c6_yrxo-uMf zEr^NwB$<2RNNd?a>a?QV_~Xn<#N^9LH|=1>gPb^a{2q3L5JvYPA#zFmmqnZrC(aHk z_?+r6_4$IO{$vfh((-m344O1D{%Ipmm`n{hbvnFVSP;==%xotE8N0S_lLVFEU`ka0 zXV8Z03%lUaChh{a#bSI=NO^xk;%TZDt;hAlk zbzm?l9Ib%LPfI)S%|&=SM6kvQ!sOx0>2+UVp<^AtmLwie7> zs43BWH8O5tEIIi5ph>Jo3S49~%l9`_!6HU-B#tV^Jg>%8$wn*GwO|H!#sxJN(f-WO zP?^379^~UnJ~r+vp=mc(VMn?!(sM%$?$7bY-he!EBoB>MHnj0QvAQly)iGx8&cwYj zdek7QG{FO=y|^n3JP(?swV6 z44X+1{5mcgdQN6xf|3gEp0ttgw53|YZTK}&#vB~#)a~%oteu z?w7~rKr0+ArZp^CIHV8!S8-c#^K`z&z0N}tSpA;)D%-|8W65iD5r4@QpJw$@bNs8F!g6FEqUXanB>Xj6pXm8zuJ)J#yOsSyigVpT z*OQW{R?Y@$GpT9JQ3Heda|_jk{HT@^F9ffOEX%ckoJE+nXd7l@6dz4rH2s!hh3Z~0 z5)I~*%gA}U$8A$Z&Wrw0#YP?v>uVsANOJUf?9 zj~{2%-yfUpyG%Mpm!@)*)q~NOZ=?Q6vUp8y(ChbfCSc@vId`D|O6{k;$WzR?2dqEP zAttik%mdXuuH8kaiSYM*Yg@>s#+bI*2?Ua`uJsrTt#|KE==i0C^Mwr8#$@aUO67`# zL~$P9Z4>TmVPJrS*T>Y{*xECFvR1-o-%~(4v9*6t3RWAVVB;skfzpGK}i*Au+kVcSr$rmv>XVxb=+dN`tz(da)gUXP!fXLm1Giu`{nUtc^y4nWO z7a}bGlgxMKTAA6k`E=cB6@hrRRW>>Z@5ix@#$mFQ{iLcb0`ZdW8;Vt^ ziY^~64zrEy+^MFB)>k-tW8%K(VBfA9G4Oa)=x^_r@t{l_`$8^_1;D-mRtVg&#f``# zHJ4)za_;PXb=4iLcc}3pZ04|dwrjJ`2G|%IAj&sXWims?4)_&ppFXYN+j+Yd*&K=< zzuq=ma<#6A@wIL&z*|z|qOADy!k&h022Q#$1wS=OXA_&N3eL<_hwv*f0f>%+vlKtd z0$_XRP#bd8s@tu@bDdrtz%NpL02P5pS~Re-JaG|x<{*#7LVOZe5;cYz6>A}6V~7do zDzYDLgKqOd2WUT5>{qAyE|yjd$lcV$z`m;PRzdf>sOfS@_>GzZX?{QUSDpcpxp{u- zdHScxgZ8$j>SG}cN7jm`pSgIgVYgTF^H*vg$h1~l7N1i@XF9F|_3vD2egC_0%>PWb z7J45+cqe#9iMAn5Lo;UaLjy{QS$F>-tH3zi$0A@pe_w~ZQ+Q@`Zh-9kRG!w?%~~5K{UCDgNNTg1h&O)%GZfWQk5Lu zk(T0LVDwf8c=;LU#KFh5xv$kLii36u2@5!c2{gwYMqr&1K6<~bd!u1FK90;#9Az= z(Q8iYa5@QtD+XA^>jKL>ArohQ#<9RUzy{kL&7yH;LiWI-XS71=#F6EbP;HqXK>j7aT}|LBdykC9Hs zm!)a3nQfT}=}#9P*>Js~M0<=#B8lN(3WMVR@Qk^-*A_>>X0I(2gl&frdPLiz)qey~U6*@T{x zUW{G2%iMh7aNhV~99_hiW$G99a{b#7TXYT`F0hfleHi(FcJ_ac*?<1gh`s}JrcS70 zZdc^brN1g*qca3FZ{;epaxUlaE2p9^XT@++?-xU6@S*?f%9^?V9a?$%6WgXDV-<0I zDZ2XUcXLr8iUC)?NqMIqFSLupvoJ9HrTw-p?5FcGJIc<~Zww=wIc_;d^6rHHI>T-( z4@x3lXEJXo9g!ueo*|p%P?Prl4P^{YeNE$&dyFL_kI|fWB>j|hn}NppX(@3*M(5^X z4_{<)bs-8DW>Gmb<=6ExbY=Tg; zmYZS(RMEkGDg^@Px`^a`RlbC&FZ%OBA>C@4SQ;{gk>Wr|$V45FH-c zb5PM!>vm28CGcQ4s3Q1)&~L*T?g-&B3#Bd7Yua0GeDDCLgYB#VeW|6@-q&rK zo9%p1mF~6pKzjx0f*3`<+i>XX9JwaV4xq3FUvrVBTmn=hqr0l*(D%GhVxSvrzMYP4 z;-U%*sH`{ejsDpCBI{U28D%y@Y8+$kPRKW1<#MR-F5>WZ%R^lmpH50E&Z~Gni5BRt zBl=_5pf>QcFLi|0m~q6Gdot{co5Cw7A2RH^mCarbKp?@YMW_yrZ4&-u20e$JANSL? z*Nde|IXU_V&F;&)CVw|p$~+(zK=~R&Wznz8oT+JVuCGP_#tl(9MeTUf1{#E=crVaanYf2pE5?f*bjY?I{zz=Q}+sCrbb@m0||Ffz-8mw&e&?o z1T|chPQlcn^v%#2(0m%O$KzRNkAaQ`b#3%)dW1PpHp_5f~ zj7jBDKP<&4bylCVo@T8Qsl`q@%fzCs>vKxiR073Ci=G4XTk4Wg%zu%k3Ad1ypzB!% zb}>c(!UWL0lJ0#CCMXW@6g+sQcPM&$Kr1Z zm=_gl$?5P!1OhEv6){a`VuE>}?i^xi%*(I` ztahc;h3F%a;Rx@68QKt~kDwS+lKUa`B3kST5|Py3Q^L8Hh(Np1H_ok2WpT1y=rY1=P6fR_Ya)#wMFDJE9FhbDC=Jtvs~Bz~Kq$0Hi96erJ)@tosAp1qsE zXj;y;t`=~1-EU3kN+LP2ohkl@?gD#u{_QG*U1J9CHYIyem@w?;80k1B|_O@_W=8KBJ%WW@x z#Ui@fsOJ7&vB16JH(%{$RrMh=d664bPgi!GuVV7bemrqzYBQn*7A94PY1L!W;S3CQ zL;$pv#4Xn2mRy(^F-$JSW=4J(j!9&bM{nU^_G-R|K&1d*an$bnAf zc;j>$Ga3ganI& zRI_r$gic0donUpL`zCFn(r}g*oi_TI+8735<-7->hW5n-Y{BDiybv}szV{Ik8=twn z)v8`K?lhF7N_Dw;C+9&o@-=s%s%_fz8|!eHBV)XK2`3p5*285bg$Si=)Y=3+PJQ8% z6rM@zYh3~PNW30KfH8i*9GXGZo>Z|G?oyGhbeY5I80Rb;&$E{$_UGcD<-F^5l9>Oz zMH_c9WFi@fcSr{`m%oOHv<@n!DKP5uit%+P%+pdA6ReWLUEATsA{^`fT~ps`+;EQ0 zSlRtLPDPy~LPv7A0{*yC`_u$<BXRIM_YXJ; zrW&x+66X7DDjWTN{DqLhH*DcM6ns^$_W|hkuU#=wr!+ zk;n6W=puV}1h$*YzY7fSdub#t>Icn2E%(?QIQltDdw~@J!k`Dc(rEW{K)zePrA%zDQJvl%As(qp0;VgCviH=4qRudpV5^}NTKnT{{0Vf%C zkt9qnVVUuP??=2zPm1E#x)-j16`?lfIl-KR%_p?O#~fx;WI6GiaDzNdM*)K`qiF+J z5?bMlnyV`A1*{(a&4`8OIp!F}xeOoYL=)5bNeI7?J0n72AEo93Z$URsHz(23}j4y9W6-J0`rsb+#U1D7oG548Fzn<5o2P3Y8l%w6oT2kan=KMBW|} zrO|s*#28AVt2i7rlaC&ZKN-^rm(^X44UourLzOI@LQ2}`_}0!59sivSL+z~WS0>4^ z^v0~oH%|Je{Z3r)4+1ORkNErR+d>p$yWg%)7_59?Vo917_dX6*tja?>9x8< zarpel&b2$3Npyyi34)U@rS-InX*+ywU(Kc}?8@W5>Fz8*V(KUC$odW1jWf_&%CiIw zU#||LDJorVEGlJP_jZ0%Nov-oI!fH0q*Q$z_Oh)_;K9}3#r&hp_Z_ZW%GCRtb;F#k zgx}bJq_JC^`)i6lH~)pbw~C4*jMg?G1W2$T!8N#(hTs<5AxPuy(70xI^QO zySp{+?hxEE{Ih1xIcv?VGjnk+|J%O!s=BLs)mMA(_j!20pRLRIF~v9?JD7#|y=$3# zjf?Wz%$SvO5`-)lW;pcO{kLpW@GYfDbEhi6x4MeRQx7}+)(UFMQu22lC62rigb8~s zI&Y3qJ8x~KJ`4f*5j&HqA3bokTty@~O~sTk!H`U{se^}HumICq%(f zZ_k7Y^V}JiDF3v!x%}kjKl@Ss-OKttdQwgYm-<2KX&(*`7_OSLGNF1V>8jqCuC762 z4<7WoScH@=JW#bA%!3!#&iYuS?yuH0>E>AIxPR3)ecXOv0FeAG#Av1B$h5C5(A{&{ zwVRuohYeBPXM?tCR3xNmt#gT~CAvjj#}#|sF}%vLUCo*bD>c3}&`RHQ5z{cMbIEo( z;#Rs`N`ZWuNi3L5uNw&#d_jkaKnzfC~;)w>IFhM*|bBG;Jx2q$v z{Cvc^$sH}RpdM=4)zvUvvhK1;MNs2xi5&XiDeZS%6Lv%BgKovQEG@MpfZA zAXRCxN!2{Qfl|W?u9}UwR87j7vKnX{8T2!VfnEAO zE^{8PK9Yz^RO*Vg`0gTb1?Cx~jY<%!Khw$((p__#X6 zLcgtT>~Xj}t6t!uKA25?yiVid!ty)`#cfauE3B zexxn0l3AxZMBD>6IL+16Ts_?3n-e(um9{60Fej5iTK}qBE~7?tmM9ZwBM(&b)6V@W z)6L1Vt%rz1GM}e^8i@GZ*=8{O5E{zS0cA&84m8L-N(7h_w<2fJDlc&DAUv$Y&~;fbh|ns=p6% zToMkU+Mb=UUpbDV1>X{IX4RjZzm-N2VU0;R@C^n?wj|S*ajf<011etY$wEp1&5Ynd zrXPRh_(sWqH%Jml*D)-Kv?e-X@0c0z634zqF~m~W)QB+!v8pAx)>)oi5>Lb2e-3fl zsPeN7XbL^K`^piQ=sC}!4!B}(e($H>*B9$Qtr?BNlajDP+L(mrA`P-KeQ$ZUbF+Dl z_L!Q-pgH|fddE2t*W=p6g&jZScaG~oiHvErKi`bermtE_BmYhM#y#Av-D6k@-^zqB-hddX=bwAFxTBj zp5zdGjp_S7eT>y%xe@`kky*6wpR>On#cSB=uZgRr1UFTa>o_Oue0JDhK`LeGG+;$< zZ839Mvcfm_$Rv0!a#{-k;1X3R;Bkv7L;$-Fk7x^%QWpblr>Z*Mc{l2mMDnDQh7F`1A_oJcA_NPX^Z z+)Q&`iLT9@YH_@f@7oTOtO|e0eAiG7_SQ8c#x#+<3No{6@7 zxJe==q)oR7Y^=rAE6R-&Ve}S_Z9PX4T#_vB;R8 znK7y;53N6;$0lVzgyEfW!0;bg3s-iutiuy6OxiGD2*P8aIh)+l-o5o)teW;jZF`~- zKSfi^VA1m13+P@CWpjN;b@Ol37VXEUR2UBJNJCZmnbuBD+*LT6n0H}q0T1QA@7N^* zh+vUS-UIr6(2bWwhLGhX)Kf6i+GSqb41jJZy~tUhDj2E7u}pEP9qR9mg@qZu{-2Yk zO(}3_MLgZKWJ+!|@?DUEm|Xks3BBS{_$|g4YX$l^Q@O0B*DpaYeN%WPpI-jHYOZgR z<}$~Hyj0jfA8EW+G*b>+{RtmFN~%6-rm$rxE0bn6k69FwH_fJ3)<&}@h_t+7m)njh z9*jW}Y1dkrsvoSBm>aXRKst6FG%!G)C>t;YqIWhmR=CNfxM3`ha_t-EjI5kaCw~%1 z6bnDw=}3iN)~n;sbmU-lXgFqq7Iq8{0TY(yr#|3<91vW3c~{BiUt*Rl(pBk*rpEdV*ILfX4;T4X?` zCOiTq-ATJCpFHqy%H7qI_9uQZLl<>yu?UuBjQZd+{9yzSWOS0_TQSA7MPts)Ag)Kf zET#y_)yP_o;qo1GSB__QOv(<2-_gdrcr>&wqvOqIW%ILIiq%!1dEL}t?4XS^ z`Oib2N zSvp8X|0x}F%2azgo)`f$X)<>ePYjf|po=g`>UEj=Rcq{zI(Z5p3B-YqnwX25KAUQB zeGhmGtP1vpK=r3#b%HG<{wpGW8lbnqO#6;lb-lb3=ceVE8mQfg@q6bpYi`+WdjOiE zw2^=M*ZeS$RPPU)Xe!Q{a}N!HZL~J1u6eElm>Y z66tA;j4R9>czq|%@-6c~`eIs??x)ZFWeIM;68fy>eDJ*2FfMtYl|N$xloc(Hre$swFAK{pssnzsiPIwpd9Mmh9!lcY z%oxzI-rSPC#b)KRoI=FXaul2)NUguI95NBj~nZN!qV6mo{Wzh*F)P^j+Rp- z+vlAP^21xCcGjHXR^L)GOOut0Xb=u}KqtyJq>G;?$g^_ERQ8s_$C|sf?R*Bg@;R&m z?1mkyxb>H6tt*1l(prj^CCR)AK z9n!nlf#A4qkqVAyv7N>N_B#u_7`E7X=(t2E`g_eiIwl#7nD@W)m+*Pu&fa4ar~d+p zRib8su##EElTMCn>i1@*PH@+bc4izA?8)eylXnSP+@4r66Af((hM7P#TLk4Q1HYA< zJzW)volz;F6otS!)vg$Emw0Ag`jtvF90F%_1Xn(5XWb(k%>izvEOc;}-LH5Pg$|m>@)2wi=O1iiabMl*1jHlJj`R#>av|lH%S_Vg2 z*jLv`HoH7pTOP}9j-Q^MHl}tazNbcB;cJ5_eJKtj@b)x2)+;w|d3Xh-*|mT3&S->o z?UR&zBW%Aow|>wH3`-H3v_k+uxq)tf6_-oCSyL8hV|IhiDO~%Juu}U++fE&c^Bp|N z!iFaiD_Kv*SwLhG1gP7`Hezt2_8=&9X{29Bc~sAFC>S=ne5v6k)xRzy6R&@cTLI+H z*#?_L_qWK&kS``xydg@hh z+0E4CO5kAW!gD^;CILqvEhM5#^xTurrR{ZBywI_Z|LXDyl{?X`&Y z<~&asY#_@kD6E?4r6DFf7U#E|eNWIjQ|PzP^AGL>`Pp7y_vp9KY+sUNzJ}D6uunfE z_X|o^a%jd4Z^iS{W%r{ij8(*pt<(@I84K5|_`XJx8=B|r8y~!x%cOa;i_3f4HqIFv zhxZPSsC-KPpbZnFQJw$8rZS}XQcyM7p&WQfrST_-2%yu==>zn5^lBhGu!oD5Zca*r^n^wBmSs{piwsiBh z%m%)79txe&>rkDBkOs``{R(^pN&aq?{eyFZ?A8pDOxK`sa}K%P(U*)?ALEt`9-@eT zPhZ85)*X81K+}_sHuxvqfQx@F7`2sb-S(}*3HrUAQX~nnbR5OgFTyEuT{uQYmx$1v zaf4P8VMD-NZ@V{4~Gbov*S79-KSxI?MU^c-&x*M zU&h=>TK7DV@^oy8^eD8}flP3=EAI_Gw8EqC!_(&~@)Wgt{V4CLms2H5c1vh^^$)P) zWCct3nuu-tb+7Ut+$SMrAvfX|H9rqX+T!mGD1PH7OY@>9qu)g#Aw1tq-*{2~;3O;D zlRM~td1>0;D8FpA)jKumE~>sI5UT1#d6nrlbe&%UBrgBKoxgI1K6qaRbF%jMmA**rXg}J32$Sm}Cs)yjSQxF(`8{nl%?(OaodHcw=av|rUky6r zj}51U$@YQ&;4s#dF&cZ`h+obBYo(yMIP~(;<>mM~*&=WhQpY1Imhel92080bW%%_s zRu$|YTsxD%t=;b6+KO-Pn^VcgL1~s+cvWl3FNBSr^&~z-^B>&9TSCW2OpktJ-FR1V zMeom?YC1FiF)b?U<*LCev6uJ6r`HPme{jVW_o8<4jeC{$H;%WV;%{qJ>*KtAY-tc} zoxRyu)OsNNcIof>+_OjB&~90=-HuQ3ghv+*t>4&9sP6+iYIoNH^-TPd&aw}>_nHz_4kN> z&lmafMIwG=KLPLL>&!p68Na)}%-YtdxlrBm8&Q6R(u-rg)@zT;#z~y)*H=9$zYG7X zKrTDt7oFR=OqV?4O3It>-tzoWwr_%{qg>l(a_4NRWDwRXW|lG!+E>5pj+aY;J!L3a zXO(h`ms>PtkzVD8Eb{q{A6P!BuO6+(2>;*$@e_h0YB%0`y{mptM^zbeE0tEuEp?)l zY?&87{qB%{b%3tc`ND+**%HPzm2QMzAHi9oHpjRIpBkks17fjY1gf4Fpj3a@4W~v| zl{KGS`s|#(YJ%FXAkiB@tD9=r)Rr2J_U!^Fyd8qr9@QUjIt@>DGwU_aEM$6RNqVz`zJfIk-}cq#|ptQshF5S}HJbbmZvXvnVl_XSiP=%!8{ zFD(v&8XWtb!(;**O)8IZMW$DWbx#&S?*xAukXgsTR}VuhtI~QyD^WwSqnLUNO?KR? zP1A?5$|a1;v@4${qLp+Py`m!)00Z-Q@`#hkgNq7jx|2$5>(Ov6VxyO7I$r*A5xdcK zu{#)^c{0lLrr-!dpIqz3k6Y2$CMncD^*B+Hz+Fu1;#I4!L?J>13rhVlc1ZJWFtbP% z)p?OQt<@ifr>L40xZ?&WxRC8$6iFY;%_I-Uq1{Af7RuVe++Qr9AI|)P&(JE43>E0e z+;ltYQIn~iWrKxHs}gBY?CfAaj^)y{pcm-m$GAmI|5qC%3t8=E*HWQ%|+8u{>hB#s>L^f;y@n)P1fjL-BmfJiFA z@F4PI03%h_u5%*cq4=fs4im94x}!(ipeAs~q2|EKb5&0Pjxq)pljH!BEBIU-6O<5q zC{TY%2RZV(&!u$C(WHI0C}uKMgH-QcRm3$jAzffIYZ_stgx|O%GsUp-&-trA34cNq z*PyHlI{7JOPFyY*PVN2KA1)F-BpO2w?MrS@RhGCB+#wgXu5!Xg@HAz8aq+CXz~9r+ zusz8*Tkoukg&cD_iZ!D6P<7N-G9$YZihl zLkE?tnwfb=X9frtd%@gGN0+3RHlrJ)Zrsx^LJPa|ELY87& zH{IP2+FT1$ZW{6iL+S0nm1nwuTucj0lRl7fGt-zELzT<;j)XXsnj)1X1(vcf=f*iG z)4*X>ahPg}E#XSNc}ANUox^KcC>FDv6Macq;S(83CB*#T?`uNF#3T9vHk=>fr=7&ZYDB5K)ze z)I`lqaAfroEB74Hu~{?CW;~|}?V%#+=N#W&glhCl=?Hj1^?^VitTnQ=&{7H*nN3~rySo9A zTqu8ypfcIG*6IgexoPlqRR{@NU0VG)2+q5WI7q#PVU&~chwMSzrQw9uyRaCw%!>k9 ztCgxOjKXruzuNdU;sJLoo0UYogx%bUia;)f*l0`V?|ks3VN~84`=vXn>|LY&sPy8| zeBVWcqJFF$Vlgj&^j_GERHu;SMjguPrb^Vv(tINV@|p*8i)%|XEQ_70_ZU7bq)0S z^l07f64sgTKKz^h+ZLr#c?t)!w1Q+DpkLhDl>sYKKt{|Z5VSyJ;)nV9$BFtX|$g#;6oE$r}_y;-Rq-c11Uaw2!Z7efv;IVl`qo60APiu1T8hFo34pV%JwG{A%tY9gSW{s z9|hD}?EFQJx|*4o#)&Q=17q{dVUDZ{XQ~3|SI|bEmURGc#nvLTZY%urhMRwBinxEzWG@DPzp=e^gTn~$Mny(afMVzOCC1I2p(SbycYg%2r#3u zB*hv`4((n|oq@EK%@@jw9FSGM^Ukjoq&QE((1SdLi#b_)oI%~I#*CuB#NVnDeCOv?foI|A)$ zu})@&I0-?!EG;#MhVuuu^@76P-vTiA#!AX8@!X#obEX1!!BK5jktAyiqNi&2d|m~AH%hWhjoSX#yrXsPpRt*{y-3%v}cT2-P^jyYNAF{v*5+jmQEA7 zbegqpf?6tU8Z7J?5A~XeJ^js?sA!gtG%r3fazi@HdD$slHvBuFh1wrERyu zigX>at>k!6B=dDt82uj{Nk(higZ42dnN0P_Pm&3UN0rhe!HF{=*2Z;kc1hv*ZEGZq zDDL7L{$|CjFcXaCn-1~@oILrmvi2uf#O-n89hL3f$@5xL@8eYbr*G=h4 z+gwTnJ){I^yui5A`gms z^}d=Eoxk-^Toa@xeyHvt3}A~rP`9K38Q4*T9*P}Mw>RAoFjY-Tq5#v4{vx6vyT zQ(HE~d7|f-3MZ>f6AQyZ<+THXD4~W%?x`ge2n$}#J0#*Tnn?A&GUv5*<2CPn*ES%J zf^u9Jx!Q0T(IWL++vDjLWK2x+em^UY^2pjlEMJ(j*P7Ri^syM@s%d~-He-uES1|q) zh=Pq^XEeb*+|}09;)%D0$`vix4<&OS9TdyEZMrt;$X|c^G@mX;OeUlXui2RSMKaUq zgSgbk(r(;1!~Q6#5s+}9jN+lP^wh;Z9b9Cz3#5W_>5T97#b@deEpI+2Zm*>TdImuE+2xsiyx@a)c0LcC)SwVPO`nRrfXcPD2 zoVl%zrU$C#+L5Z3zB#l!6iKB(B{eA6{M#3ms)RlwUa+_o(H$e3YTB+Y6@V0C{Ie3} zM`~;x*H@Acvspfp8F)D>h8OgULT5F@GsM+A#t;ZSvjHCBuORrA=kk10EL~|O_cKS9JPjb6vofMGB#pIJe?>|qnn<*|GThU10N^)9E~vOHin-GB_1kLEEHPr~*3s>}l>P>qwC zNr|K)Ismz9F!e zrq4IUc6IY92TxDTH5(}*kccEXqmr|!vn-g5n;3pdeZzkYzq#pJQ;a`rS}4$!`xiE6 z%Zx>2`3#W{&;d@y%aQNTZ9S2(ZM^nO zsKHe1&4Gp*P1Orj?uv9e;+b13zz~)bH-sVkYSg6Y0fY;RG>=)dSamwKTWK7``eYRujj+UTbfxsdJkd2wg=H0kY~Rz$nEeD%FUT?m-?0Ubo1~p~6*i z*$(fntFByT#sYto9(?;9$vuYXc6d%T1-J|8*=5I9^m!1`aBrPu(U_l-itX zZ$Y^{JFXj!g+9-sPsXc6E7Pbti^8l;>0kB~nOnCpKBa2!W)ul*7wg7ar^cEwR-|P3 zf*cR6{^zsOj~MK_sU)y(@fAHQFuvCY4t+w=>Nng>svUtN{ex=?Gkk!G!k_*Hl>5oh zuR59!+Z0XEv~R9a3dv^fAL34JPtYk{wjtqnxttYpx(N9knjcBvxR%D+evu#!aqa1i zp@zYcI<2iCtsCAlQvucfyOK4~;e?r~bt7?R@4K8ANWf`*a0gpB({ZG;fpbsTWVOtv zGHH+Fhf|*Ln?^NsM{UNmn!f})+WW4Npf1xBY)`hgediV?XmfhRK^&@%M_m`Kiq|hc zgb))Yu&4~VN7F*Rc5J}(ZiHw?{2A3rdh{&n!8!$1xuV76QY1YWv$g-?mcj@tyGz=d()q^_7R<$^kdr)4REz3*;;q{Q{~zzJXILF z0G|Hp)!OE8YX-~KO6S;6U#!&NZot<@__MC0p)d{_w7d7)QZ;L8aDraSrHH61d_g7M zla?#~T^YZsSK?2p&lD;*zVWHW9rD3IbU34MZyhu^PLjm92xoV0e6Z3dqLqx>a9X}g z9FhpFq}2fofsM5gIwIxT5z@UskK0j0Rfb*!VvURSV?gU!?3q8i!?%QW9jwd0NZ4|7 zreE&vV)TCgP0V|VJ%X6>(#j=g4J+!!>h01sx1}bmV88Y&WM?{gqim|m4_aWztxzqe z#W4E^9q#sFK%ni z$s^%(4;^=2yTUs6PMlznl@cff=$G!to;k1GXz&7oKr2Hy(06nqxNmSyqB7i$ElpX} ze+{%L|66;=e|aMR2PV-n;xIei{#Dh_U0nIT+D{U^kr#@C>4NxiCET%h|%f?vzrSv{FY&bW!im4LngpyPAaf!RWS54AMv`+E5 zXfJIuFLAJ9JIeE|u5S(1Jr~#0Us!wF8t9qKqvSKKPj4ei-hBa%W9R1K1XJ?z&*yTg zmI$JB=-A-3ry3QvIA77vp$w5Bd9>& zor*^leJce7*B74n!XMyg?P}o@G?`3biI2mrFTlB6eQ(B9r!ZU~ma^wd!ktiiE&KSa zO|e2ycUw>frH8NDWBb;T30(bs@i-sj-aVzS0q)$C z|B?3AFQ6$OWd$}x96pwHzr3}mT7DD?)A@JMW3*_zJ0fnQtTHfBBKuiNcX7l^bbt$- z{BUmN@mSjG9ro1RSbByMRN=OP>;6%9LTTYnsEX{I=#T$1t_v`XE*sIHCcEP;xrL!8 z3kA0%$tdnRYG;&Ql-#yeLB?~`zi|eSxJw-F>Y#@}eukV@ecV3t?toU}e|E6#T6EWR zXc0Nrfkzx3tT3>`x%KTRtK{9f`o*bds{OV29~?u{o4dZ%OQWX;>`I_!suRnkr$J|7 zR65QtJhQg0r6p9~?IT-Os+AWm`inKz256}7FXj}7b~Il2G0NU0$jOy0n&^b_y=@-t zcUzMs5@f$~vk2r*aev0l^Em8y!FKqT^`3pBvR2>90~k%f%*u4Lvhe45G9KI9z4jDq zzZ|!((RUE~?*ua(`Z--!*o1DMs{;$TaNYst{qT{lBrr{7IaZL$axJ}tD-j@Vf= z3hxaVB6b_#V>S!ojohWXQCI>xUw@RV*V#(eiP&q`>+b@uN!SgzSkk%7p=l9EZ>cPr zeP61cqcSZjqe$_MO?O?lv^5Qw_gQ_rJ}d8Ss7np*YzkHc7magpyE#B_zLKdRs9dGm z)VQ_RnNO!jJENYn#q_VNSQNO!t)s(hoAys(Y*%W($97xG!(nchPiaGDkj->ZTyT`n zl=|E7^^T|HT|?cjNtElCL?ZTYJ~u^j$~+n%?@qGaoVY)iaU_1H@y0achjK}I2)9p=Gbl&>oMMI=#j`mKCPI}ymEb6TTF&~64;pIv8=@nFw|#2M|tyfBNA14rKwPQ%IDq*%0`Pz=Cuh_R`>34 zJ%H;pcZ|3in}`2~*Tew>Ns_55%j!Z&0!cmA#8mjTU8?95yyR;O9VHnq*5Y3Mah-kB z`N#A1alg)g;tidt+l`nW{Wc4-^E$PKmZ%|K-=G)MRGJ&IliJPvxw+ClOoK&`KvI!N zOlDLS+v0UhR5`1X*>LLrq>20za&nSBF3lu)*=S2&p>1h#&K^*&2Yh5p-G~V4=(Q>- z$w$vegz(oJ+euZ$b=l^$R#69EOoPW{q(3`(BT6>@)pe+%3x83&txsY3ydHVOY}=#3 zH2aP}!4$Jua)2LtPCkiEa=Ke?MS7w<(p`1~1nW`#x+Gj9{BXrPG_4W;5;+S5O@SrU zxT71lhwrOqE06Mg-BdE^%M48nGmvD>ZpLc*eDk9EC96V6x6aBIiopQ0Q7f$T12qv& z-?;0Gh?3&MilkbpPXKVfS^WsO?v_k;DP6F$FVFT|MK?q7!|@-Yw7tUZF9P$}TMg;$ z3EIO6roo;^V$BL<-(?|syDauHRHaVseM9|?XnjY9r9K21DpHDimKmoU9fqBs$gb)z zw{Sm|_zIecI|i>-^7A}T-IQBT#_i9ko9tIwPP%bqO1W`M8!HA&6_5TF%hTSVPRfOh zI;+_|!-PoOVkbz(cu77Y_3GaWyj5B^ndD;^>RT30Iv8ygi9J-bC#VzEBcshofg~J5 z1g&Y}?UxfGpPe=Pp)2)R1~YSKM{PFMt-QGxzn9Jg@C;|D&A{`cw{OS5vD&OOQ)!l>j zL`orGhHdBW{6wI8q%LNi!)}^;bxq_lPo;C&4yP`aWK!|ghf$y;B^}W|pV-u`iOX+r z{1}9bWOCxI_Uw!>ZN(o{-g{AeY588z$iE;8BV4(Kgg1&sKy(Ss5AI~DiA)al%bH+k zmlI()Pn~OH-RC&dom2G&K#5o!mxy%@u}jQaJwPBfn$Au9O?Xze^Fle$TJ2(VT7J(M zj~N6ZneO8{5vz*|zMHln6#;(JyWI*{ zTy&#B^-onjGPChTAf)qbcAckba!xgFU$d-LXH zp1qsa97)#iW7-^0&--UId_V8kIw{J4NA$F54V)|A2y|bM017vWPI>i|&j&$C|I)AAdh2SDP02Brg`XPg~gzmJS zc-qGRI%aT$nW(X$r|}uj2Q)OheV=}Q$h=mivp~^#DVxx6cU~D`USXN8u858p?QV2T_@$C% z`j-DLVp*RFa!^UAHT4=RHjQT8Zk=IuX$CNzpa>T6#^mR|Akwlihi_>sqIX9iUOPel zQlC@P!_L33hoM1&QIj4}!ygH=ehW$5=VinsuPcWF2S`8|(P zSE2%Vitp=pOD^c9Un|W|y6LpXJ7XTlBUA7`lRonaSTJTUzCD@x2!dX`gz|B@SALry zx+z_NbZ%HmCc;*&Bx&BGzGpXBqF*^?)wJO@B3`U7Zz7p!9%mo+!1T-b25nlm|5ywh z7L0)V{ujZ)!pB4~oL(iNHXCIBOfOm-pqVr9idBK#gKJXb`abz3 zqJ)yQ?HY$vW1G+3ybxi4zNDRrnF00=hIC{gmy}j#_;|`Db0YuKz%Zktn)0WXsFLaM z@gU`*nq3bClCGZ%ur?W7Nz?|x%nq-eY8PZ##EJNBIm#5JbRlX>%Lf$dGx&ARt^MN`yC#JyOj9(7eZKnQGMv$k;5Hz?CXBu1AU}bU z9?>sWd%|e<3!453GY;wOltY@AH4iC#dig)N#dA^%t=nZChbfmEf{aaYOIgbA@whOura!6}>$dyt$gVoUG(E?t)C!0}VSh+!Ob4Zq+iViN z`8*A8=w;FTvjFC1*yIQ~H;#>n*pj06>3YQFd)58O-1=uX;3}vFh*&0;tB0bibU0!1 zFFVDRXUxFbXf<}r(EdD4PZ~_LG@8KJ5sB{8Z~;f+g~T4GB!2Mx_UHS0>Ev-MolD;` zN!RuY;`GPi9#TCs3@l*4WGjkwKLUe8OGH(rYNw9>FWXUUlX-XFg8<_{VR&&&y1b|& znr)MLWYj=!tj`so@Y1`VmMc))q3KLqv8W$kxW`Y%H>=21_Lr4NTzbl*^UODYSHRU|WX&FHdWGw*+`)fRWbK#@ z%`%FZjxWDY;r&Yz zrkb@nX6*DLh9>TG%rRfh1P<9v2?@S%^1bif^#S5&S_IUQz;q*Yf98!cxa@IpFi`O~ zoD1IS_xn-4wPVy2*C19S)|Q)1C;M0fb%y?NVehye#9~?DkZ1*f`x#U&Uv#goU{pTvL_64=f6qHGvHb!cTar@$RTG(7Z$ww;>8(q0XaN=qr z%5?9b;G~`3ai4H$QQWxTx(fJw(!Z=%6>skNxEZG0m~xBlBZXo|&nQEH)|$`tfEeta zCNq-cJL0r(NM?C-My?r$Dev)yOjw50VYDDhX6qMq`4(PrF^NdaY&^?wO zvbKFaS4Kx3Wa6kwCIRl8tra5~4~1_#7=RMZT{6MveMg8faFo6q{!1MQJ>#Z6^KpaC z;v1zGEEUzZ>*@RsKpk;gfa>YnMy~9xe;X@aO^c))K#CM-E}hqF(D9crw|8s~C~tKk zJc*(~8&z{Kkzm(qHz87|XRBwk8Y^G(t>V;Yl9DGB9f2Gvk;^ z(0tF3xE@Lz)smO2u{~$FNW#GwPuc+>1*eM&>q3*LnsG#-WGcET=ZIz<(xuzz!w;x2 zZNXnh^m@Pz7cc+dfaUP3M(#uP6%%(aPdCc{XSc=`tY0tfcb1)7YDYxrJseIGhEh*|E*hh5%yF9=h9^sKK*$b_OZnhIOSgb zw5Gak8MbfLe(>`un^;_lU*S&dF5!NO(sRkanY^{Ae+p-O#&_~%SBNV#>whoyzkjp; z_gkYw$Cf)`Q*46a^(yQ9RXwykc1}0Y=}}jO*W*G__m1%*Yuc%q659C>&O-DbT;|(d zi}vQ{v0wdB9^|?59;H4-L00|T?&Q+ z!ov=)*%n|0*BsA_bT80f_kA}CIti)rfBqVj%*B=8uhN7%50|!CXY09+Z0V=_g7SM_ki9yz zqu0s?U>8q6nJVPgCe_#Yk;<$xhpWie!+rfkt=SXi<8#z9$uHUjp0pwRI?Q8sz|r+j zg>aLG13>N z_rP~_Y!cUhH@CaJ^%J(2X5DM$3|wP_w?=q!-KVrBUfIqlUkCW6U=he3ENyg!cw9UJ~|Xb}-kdn`{5YzcTNjIaA9vHgf2qEYQCz48N*$9-xZ5<_H43=GauV!rQ+R6MyV}J>hYUp zB)p{4NDn2Bh>4kMBpe3bZT9-z_qpe*oj%sVjpEIic0A)B*coGhPCe*4D+&@<(?`p{q(AP5qDv!Y9s@jjRy^#S)F0F)v zc(cjl=r=4OzBes{swm0=1D7bspJUqK+2Cty@J!cgOWj}lE+bkf_CbyG4QY~YM~~Ym z69C&u=_@($dz8u<@qU`ciiA0BGBP5GMIgaA-4Ak2F1+SQP*JAcpks)NEwzFco3EXQ zSLir^kMWfZ?{zR4(fC}##Jm4M!M=-I^>S2(uYHW1 zoWD+XL=xrS5LeSYj-Pler49ZtC zrBWvwi_`-HIXk{^L@$Z8CODl|I#PKo+o0fXt}f?Q%zJ~bYs@)d!`IT$z&hEGkf%{W z=KgS3qlLxy*}+K)7{!Q8UIGR;uwpWOvauRE#p^{Btap%|(H;V@YC(*QL8cA?&<`g~ zj448e<&Js+wu;u)o|3X(^0g>;i#>77K~aSWhJ7oPIz*#K0wJ69k}mRY6R8P}U}mY6 zwD5d``QGE)+_D9ZM}tE&XK1Q4#3z_rIqN$<7VS6o3$}W)i?_V|n+XH&%b4$hKpGA6 zg->=WZb3O~yKLIrLPu$fh~6|1;|;AjO{>RvzL$@uE!dDwrNBWi<6vwiP5J`=|rNcR9b`p~bl4}yB zm?3Y#fiR|7+8@^&M!8wivO?^UskO~w55pY{wF@qVr-ECOQT*w+eCd`QCnlyEc6mC|1>(JjTWBD^ic<)fFeRp4 zek@0Tbl5M%{Nw=KjC>}u8?NV%dXnw6G?AYqRu-N4#oLH5KI-AXIS9 zBu$ML#r*y@?;9RIx&u}It8TYfrDMlR`ZDW9PdTPUN$?j9z@r&<$&@r4&r#v$PVzFBBTYOHpd2)4-dx-L&&NipGuO zAqj~O#ulS0zyje5udIjOlL$@+7e?NwpdaYu&Ye43I{@$;i$2kqV|irch7)>IS|5~#49yLzhQ7{$N! zeqv>Mw&|*mo00r)AmFias%6yhm6l|#1bnRTS`*wZRIaqyB;Th;K_*R)Y>1}v91})= zf^XeF#WQWxw3q-x2iLiSa!;W855G+4e!nd7wNTebQ8BM^9bZv33nF#shtV9r*m&NjVG9s_m_g4vvyZZ?D?%XJ)Kc3Jho}Bq3Z+*gU-Ijt za@`@PJ^kTbiDxYN>^T`m^9lrV_S9(uUl}|^6{C_N27K7`^*MDyd20Z@uJ;je!0N z4Uj>(mp3#yRonG=+6a+-0}wCq%(7*XWxP=apB(IfE7*FL^rDR|GdukS!kVb2SuYB1 zRYn_K{BtIwlGf;fv$o(%*L<`R>!iT8$iD_0}wd0SJRYnQnr3H|zNpHb{Xo+rufT$>7rJ;XStp2EAtRa@3X{rE%%`7B5+ zoj#I_sstw0$IxNRG#8YPR1>+Obb{Bt#CMZbMEuV(+9O4pQzuS}{1jb&$`Sl*;}zTO z`cjNnTNGRx<~dD8pFrf{hfyGUUuXQO>PP}hg_AEs2JJ(nO1If17KY2?EEz?&GrkJG zS#0dWfzV02nCtQ{T^+L}a`-osr1WP;xMse4o0-Bb=6BQ@#~ z7cPVfS2;zGD;g_Y5)Rh0Gr~4Q%3@`AAt;s31v>)+*LsyWvF*y<_d!c6Go%H$pgphEC0x$uR`S zCkIW6Sz4?%Rg;QRYurhj>s_ zxMn}0U_kCJR)=TtliQxqvnL!C_`KyysbD-r3`@r=1Ij%l@XEcVwW?84G+@(zq<}^g zAlqL`Kx>E*AF;!$DOMxIMOJsfONUhM(VrN zwP3?}eOd%ww9FN{_7xovkoCR~;9j1rYF%W7EeD>gWV#*VQN^4oTS!WN$#G6c&;IM4&~sbzUF6st#%_9kYz0AM)^L!);|A< zK-42bhoSDNg0KZ@Y-Pz>SCQH5&ZVxG9QI<0EzZijqt-##+zY~hA_Q()_ zzSjpDw9Gm_ViMDssVUv{1OcCD>R$||sSdWE&DY8}4vh(6UiUa+dBt};NjAG}VGOYW zo_hTD@(@mX#UVXd4LCP8`Ct`sm45cDu6|ct@%lg6_$K-GUyihuTP@ZbQEk?{p&x~n z{{HiOoc%v#$p5aW{6EzUf87R>!O6ET4n=&O&&cQoxqk#fk;r|5kuFcmsw_JKa3VJKGrt;x+TgAJ$q$brFOW=P4YV4#6#v z_`$0y`8+*u8pFSKN?kep4V{={)+ucuIBzNG`_+A-*-78F27)$M!s;4^1iMo@EO2-L zJPV(BFvQk0pe!|s3OJH#`4iW}zDnFBvHP*o=H^ZBj4Y&9e=4;$OnP&}q`TAa@KI73 z5`QP8to_EnW6L^Y9uB1p2p_%RpRgwz{nfR48V=dfv$WpWU%usL{h9ex00^ZTt>kIV zoo2}d{N5Bp)8xpk#Wm7|doq_MvoZ=G`NJ&Ip+!k;)HHdj4<-qTlq8fJDNGr2a9a8B$Ta()iiIQJ7;Shly6k~;0 zPN8PZzW?kj_d;VfTwe;jU7`GJi!#ZH73SQXtlay(mC#gZw|kX_>MmP-{@=8XiI*Qk zx1q0V&N-+{NTd!1cs*IQ5dL4&PRvPGk{v1^p1ireHO9Hm=pgNXix&^tqeT2$u*A~I zd2)P)FD(*Y8xhnF-$>!?*GK*k6<}M=Eb=?%cFWNwAd)#pDkpqyXB}GcD04O;$+~E` zut=eH!7rFOyYr-{@tvUgh+-iM??vI=Xm6=7(jv_nCRFic-);o`%FK+WG`!+jB1;Uh7q&5HhXwgVF%~{8yqwr*d9- zI88J6huZV(mgZC#faz_^NT3mmbmg274o^w5e|Sse#lTvkEEn$$jf5tzj2R;{t4g}a zj{SMuIoLM!zB!S=o9(m5`p@?gCIdFRLKMXAD4^Ie_A%xf$8kF!j|YU8lfY^My#JC0 z1(|VR1WVj8ypwL@mcOFH^JXLzSx_ zLXGyT^mDZZ27X1lGDW*MzJ~cSkF03WBxq#=dPnHAA0Rn)KY)b*+iP`|8Q)MA}Ndd?U|cJ!v{HrFrjWf@XSPP)|u$=}kcc3&`qDKS39DDSN> z?u+{;$MDaXmYJ;2dSjDI`}K%#F(tfbxMv++LQ!7vbl2`S|IBzeNWQtFMGE~yjPk@? zc3^Q?q92f0HkpvV;!!J#n`Zl@l0MMZr_h#3>>D)K*wRxgD^n;RpvEx!31#0GRU2F2 z9k(XYcEjk8Q1{r5BVCKR?VZ~kZ|X^9=k;UEDN!k5J5T`L_g0!{iCVBlu;f%{bm^B> znv<%vgOww`WulAOo6z`)c)IW)nItXvES-HCOuGsk2Jl< zfBnP$S2++Zq7UVzvK=n*S$v0U=+7H{%3nR-+wIq zuaM`<|L}-w<($U5lTeSek1tOXc)^UzXL>wo&g)cs`u#dHm9BsOe9XO-jZtDcq1)bN zB8H;wWmZpjSRJ<3X4&{bb&;!&+AG0@df1FCel88)|47P2Q&W`JRL<^Sk(Ss8bC6^h zhQO;T|I`L-Sb-N;&tk>kJy9QqqeTUn0}~an)ysWFq;BAQU?M1iG4`m+Z?1fZ7xvCh zjaO+>PreO}@B1VCj6fd_so4RcEkMnwHAPc}=24}Ql-cD=EkbiuMdfb38+W7c5T$(Ikxt~-YV%Wr2?6{cD? z`>e1($h)_xhUMtX1g=_xh0DPU)}buf7wl#biygQ zlBT25-t3+Db0MsT0BHD^(fd-iTr!Ftbua_%a6G2~{~&zpP4!*N%O(g{F>#?l)fp)s zNIvXY^%*V`$nkR2%0`(wlKN$}8tS@tw=`fZQ4FcN848U%|84E@uJF>0G}nB{3NtDT zq_2IkXB`OnF!I*i%&mRkGp?=X^;fcnAdl?8*}akCv-;?E3!^*%E_naJ`Rb`HOGmII zoAF)Ov*P_9YcLe-GY{BHu{5V!5)%2%Ud&XGtk21}aQ`=aQ)F=`5zzvKZ1t&b%-k z!VW>Fb!R^`AQb8?liF7C&u-h1vr8I4+*j_)SxG1>o}6x# zXD2l8&Do4LX8_o}rJkaej)(Xx;oZd!D$=2A9PF-|sh;W6SX^6Msxhd_BdzFh)cpO4 zR%yzoJNf>M<>fXE)1KWGH(SUq1HifA*wP7a|D(%ysz^32I%&@33RBhwN}Q%wTNAjC zA)Bw%6*E|2r&WRVa%6Q%hD){punF3{|6wN9FG<9Yo!oxVOT_8D9;I6P4t~m~_=GKr zn~peZK@3Byf;u3gqGHNmC_vGPT(s@#!X#6}n$c9XM@4Y>wVsugGCTeiRyRI?U0UL= z%;mlIQ4HUqSyh2BNI@woH5^Ta7*82EVjG5q)&WA8ln`3ob5Iu1IEZTl-HJqrVyDTD z=6!jws~j`L1h8Jh_~^{D{ic=!X5B|=Nc>CU5o?D;yWTEeIG_i&hzq=P`&H>tfU=*W zE1LxomGTpIDy(}`CEI*`0MsLsG@qs;HE{wddIpgPio`hR(wXfEnu)}ayngiq^w<^8 zy&#`d0nrbPe%XqQ`OJfqPING5<)t|Bc>b9>5_+E4&_ZM)eKN(vTB*+Ui-8-=LbGI) z`Mz~OZ{0B3h>7RzT785GQD(B1A8KlRzYj4KGAdZLVq8_9jtOb82hL;eM8#u8hezM=Mc2Gr@kp3sJx4wulaQ9#h6pGd?L6WPb7htREO8bUn~&g5$Cp~B z?_btntyx-}3D^SdH6a8)BU5%H^=8eIIc3hnS{pc!uxNhY;ohOqgHyv3B;$Qc**|Da z$>7X=^RhG7;Zz;mjoEZ%+)om5#iAq@N(z4cDwCnc>^EYk$9|d4V*k{ONkt;qipVaB zXM!Vj-idki=MT)kp&44d|AE3Z?u|F%@?CwT`u_2ZzI4)*z=?+-K*>78s8P#9R822~ zfW0yP@DB}?&Jbl(HJW5moua$uWNAFcU~%g7%Tk9=`&$lo+hJUG>o4uY>ym1#d&^W; zZI0`h3leh4<1wt^SoUaI;Rh~XX5xT}Bu`UC!#BjGfZInx2X+~o>GBL9O%0q_l{8@{U@~2g<9INNa;nASg0bdy# zvr(io`5CVHDEJCUD9GWjWXsrK@MM;gzi#vP9VSfF(@>6 zZ%t`MA!8(KspkxRBIY`qt=q8n-1JA#D?9B5p53)0WuFYgYT1VvZOxfLtOZd#2wk)MYUuKdN|VCh(p*)*>{e@wo7^R7F?o+Bv=o?tHp!L-j*sgpLDJ=Bn9 zQcPJup(ZDFppt4^A!iJ<)J`luDscp-B90{D;};DNF?>3{s?euSxQNm;o2Qtrf|XJK znn;FMJ*q_a^=K|rP+)Tm#;AJh@ka<^crgbKqQTQyG5WD7eyM)plX-Ih6al}*(`{94 zlGH2rfWN0jw7J`eKnpP=rg@kvr(%(saUUrMAf(cwidM%Kct4A#EcrAi=$$Q1a(&}WvD!z$su+~n{Z+0Xr!<((d%xY#cs2EKO5MM7#i` zYbdgIud?cjsO&Qu_18`Xx~bYR40d6Qq`&Ih8RAFeE0olJDFVH#j#}c`%envr zh#j^pkEn98`$(EuU}g$0%&NGSx}a$;p$j`7t`$o0?nxB<$u~8*-V70@WOs(r@~+JG|C;y&fo`;Hxb?_=HeR^3gZ;+z z&^jr}=mI(Y7;!UGn=uD@fxK$FPpRX>0-(!-3;Gks98+prl+*gxPG66l9+sr_h3Q7Y zo@-)a+BxnOw^@SUP3^%IS4nG@l*-@jmi5+>(m0C~^~vOKB*q20;K?V7 zz(@3A|5>Esh?11k=dA>9Z?MIy38qk={jPUqU!@nceWFumuG57yw8pxJesi<%z@D5@ z{P*d<$C;r~_S2iwdjtW2@pdvQ90PBIy4kC4Pu%zbRd*j~_{9APWU`x2)*Hsb6QxkP z)y7jlm&MbSlsy3ix*;`l8qp>wXm*G>=97{yp{LIH8|^~7Ma7qSoL1D-^FNvAV>MfQ zD|h7T(sGcmzO0B#-~oP#IwDWmN@c=!@0d#4*6nClDd7T?N(I zas!WK7Fb#y_Z5f*hHmM9X~e&CZKZV6Y22Sg8!g~SRu6Vi&%k(_B2N-u;!Rxw+I(oK z8mX$MmG)`k6FV0@Z$NG?q7^`HI%~s!P_JK%uU6N)GqDT&sswMIy8pjCB*_?Uo&vGAiD1HKCS$$=&<; z&Mzb9zThd9eibZ3zcggzu2BE$sy*@2P#js+7rtag(W#-2L3VZfPKSx(*o_3US5v1- zQ#WL3+sM2{qCh6u*@z-oR?Irf&hP0XbTmfGS<+CsP>hWE$nL(eY;i1sqAC}j@Bky3gG6widtXVyMX1m7U*qqU z1?3-YKD%oseAB%z@jQFwhMz6O%zCyvRb|0A6aYd5whh8wy7QCz$|y-$XT6fbB^Di?L_I)FkZMTC|&y!3`e+pSIM=Z%(XTX|^xMYU)x;@rSWG2Xgi-K!o2RMO- zeNF+(2V3eUKt)a)jsMrT(|BDg`N>?LQ`HbK{FAjDGH%Bjyy$`s{OQc%%EW+S&aQZj z+5hffU(rCC(-gj6&Npw)P#p2KEEyHbtF7;C9pZZh1~*G(o7ALhM0i=Ep^)(7LI=Nv znA`KQeI(fJrrpRPSi~`m$awc6Gkx5;Fgm1Y^IuRbC~W9$?T6?qaTpZvdxjqX~jvm_S3*b4kHYNC{&(1IJ zj%&H@2lF%&QumEWObgh@MKMK+3Vc7Y)?3D(k1*p#er}0rSNoT7-8}|DOW_jqA4E3&oNvW`bDZmwA#z(w&r7AE&}FIxZPL%zJe!3(B9QyBH0gfr|@SU|^PDWpzzKmo>u zM-tmGU8fabmd;zu5%bs`z4GWrVRvgv_adEeB@4IQ$88CgWvV$Agp`)7U(}UD{pii@-d1l+Kt9@F^M4vb{ZC?~k~P}u;df`r ztoz3(WM&fwPhs-r+Dy-G{19|86Mx{8RX)50GbO!DlZw+Mjb>X8F1&4iqrLZeuVSyR za`c)ekhV^O#&xHt=kH7)3kyMLpoag74RzBj+GuETJ9=YsGQ!VSZN%QBiOGHW_x=|} z+(N50_yZT|P1ZDoVcb2r=sRJ-xLj#%Y3t>>>$tpf zJ~j=B5Ap%|^zi%Fve%e7v)P8GU$#!qs5?|VS|p<81~*U4lv?pQkN>qz1yJzSOQg8se%Z8fy@-eN6tvKAbYrUu`#{_t-N_g6#rInRiJtw-_~P0fH` z^uxQFHBc2nI*AlZ`=5upX79RNM@omvp*Yet0sDxOJd`9qi6~%j^aE$rQs-xlyohk+ zjZHxPNbXZO6sC6}vT?GkoEhzqFz$*jzAr1`h@*hdpO``w75xgDtRg&^NFf8*jx*W% zxRtzA59vIu5MI-Hvz1jq?cU4bUMG;&{=55LAs#x*1A6*v%+NWkx%#w2?~8Lt9v>e3 z$~rYF$uX9?f(r{)$xx!)7K7{k{5%G0U#EHe^ZVhlr)<@HrG$LVa?4V%3Wd{kBskc^ zk5e+Ja?s6;!E7Q+Qr%?inHQjl=j5F)Ag;|}8@9!My|+>K=)Ipkx5ezeUE%*Hb zU+PC9VZl3O;dHBKwefPKMRFCmUn$Tn&wGf+ms@l>YhN!WUgkr8-0E-0ZNH2w%f@i=~J8zjsu8Nr`c2pTil{nTSi| zqKx}fdL43e~gNIxrC(>efWDKeYJSChgN)9&e zFc%Pog}?PmGP5|dsA_3jbMy#{vGn&|rORwAr@ z#&`byd5o*6v0*$g6kDy`4}k+Eo@B2cMOcb8YHG=U%JC6A7uF9$Zh_k443Snu(jNj^+c!MbL}fI zY6@2q`^CkRh62w+Evoh{UCtU_t}S-tK~guCbtDjj`5#Nl=lj2CxaW?<%O`zr@dXTG z7e%g_SCrfQ9c64JObPo{G>P6w8m7F>@(UF}QLR0>wzN%uoyF)kc2az`-sn`Fisa7 zt8kv;wCXq^b~d+wAczcS1e&HOD$J-9y1skID4giq8GZYrK=uVGD$bJC_UQYxjFz}% zSE{2*ghW^H9_!f2)KI4?U+U2yihfNeLn@3odP%Rg;)mU-f2eRf)gOES>{h47}%4)JX(ruJuwsJGsrU=boD~#rrR7dubnPgSs=OpWg zp%letcW%G>-SB!7xg3ecQ`dWjvi1B-dho`GiRk0SJ#f0m$!=JD^|++U86>BcidrOB z;}=e>z05h)LPp0u+Y1H57i|7aAbbnxFUKL3?IUj0TO;1xwhpU>-jI=xD7CqQkVi7FUvand_NTMJzEVoH*SbIY)8ua!eWT)o@hRlnYOz>CGB1AaNE%lHMF_s_dk4yp z=9)Z?q4T+S8Par6T)~>nsAFd%P~T7z+3~Yv$~x?;jPenee1v^ddOcHqs?223&4FNK zttd6Zib$c!+i<3IqOrDwJnoOh&dN72j7Eb^mn7D%-DN<-Ce){FvEb zXZkX{#==Nc5EkS@h^j`KeB*>i85+|sWrtem#t5(M4p{(}aGTe;r5EBvx;H{~VNkBl z_tnGoUdcE+a6r5h3=lsQNMLCFM!u|~HWb{(IZ|TW)|VVQ6QM6KU<4zYvd^sCfD@5T z?#Re)Ruzp-MB-o8Xaxow!fMangjIdstNaV6$ZiQEn|>^Shyd-n7Olt=rnFpEgN#re z^f8~=m1(C=0Z900m7vPU;;0iN&T_ga&D62Qh|)_V4yH4n+M0SE>Yq)DO91(d5i+6* zGKcSsgh{x0h}h&eyeHPLia5(5jjc9ESgT9MbmLy5+(^n2tv42)&zrhf`9wHHxRc}S zbtXG|6{D=T@EC2nsk*Xq9;74HRZmq%)f~{hVh|TyU|I@fuOwtPRbFio9nAI_q2?T4 z^GNi1uyl{kbu3^Ojd+VFZdcBf&ZaC;}x0s>@K zJtkF_FL8}ssFa%ooVA(DD?f9p#n{rLT_OQ9ObZ@1?TW4zHxidSfVioaG=HiwK9@W0 z>59r1(kN{L*mz>oh{)7Hkf^$DKQeW9M9|3ck6)zm=Mvh^ZH<&a7!gGBu}e~sO1?Lh z2)8uD5r)%U%*l7`1k){+3S4;if)-&$jK5!)Gn{Aa4t7(xCd36O(W(bg>&<~CCCXK2;GuOWjC>|0sF}s>z&fA=R0lPJ>5F)8qK0Z+6XTxt$@%U2ZjNkMm$Sa zx1^+2rNM0NncU6UzELPyM53#%&e3&YPNRPBRZNKUb-yKUIzd{SzHe~XMi7+ywQG8U zHkY3mp~@pY-7?1K(o}-{B!rJ3uHl;+M?pFtg>y8!6A4ytMs|n<(p-Guj3+OkL zB56EkP4@A9?L*#&aSezwava3U#TDjuq6z+SXuDNQsA7Iqn}O@;ipjrL=w21p;iKy# zvb7_!e|SVFG!#t){%n!OkZi(!LyfI%TS(_>v8=5tbB0E>trq*o%?e}1F>9nNQH3*= z>0PGsEt9{@4Qy6Yv@lVM;Nvedgt7*$qE0)=V&tt6;&_~k)1@WgWm^GEv#WZgT`Sh* zfaI882mMSOzD3*wba|f9tj6~L8qbcjNGzZtaDnD=pl&Iy=^7F(DWw4U8@4n~^2IdT zy4Kz|QU!>mb6x)lFuo_r(IVe_GknmhJEs+#cw%_A<4A&hw|nmOt@Tr$$AyuCFiagV=L^ME z+sdkTXrd&&%fa*%V`3`iUTJO+WGA~$CYn>6OC&mTq>l{l_R69{mu?fe00eV>-6QecuWdS^Uiwix|A8VBjWZ+Q zV5!oaq8jlgTbsvL{ytu*CJ4%}7tfHYj8bgHCIE=vptWnwWii+*S zBji95y59i5Grbr$jPqksP!uzCTgC+e0X^@$Rg^#`g1_tI1tbEgVGrCqo=4i-jS?5h z%@!)SpFjG-1Wpqu+3=N|^V8_piJ{VYEW!z{_dJoi*in&9@39quN=6@C$tI0O z+$HQQLdQRYR%du_mEzOx5r>U}bJTq{64t=rbi+2X8RG9WbPMyR-pgr4Qbjy|U0Eub z8qKaO?1NuK>>4f@0FWeF!&)~s9GG)m986|Qm}JjUwel#N&4~Mk%9k+;9uB;y?&m85}qD;M2x z_r@i?F(qBwAQXHV`?+TgWC4u*KQUDQ@2KW8eSl9Hn5UPCVzE$ylaF%LHGvvkA(s8W z`IggJO8m0TrXptDjh{|E-` zelQOTHLGL@UNg`9UTni%(iV`iwLkDPpPcvd@b>q=_1W#9R%&<8LnFQnBfC6vF^0yq zFnuRba#|Z#&#-qVca_hMd?D|9ss7|HS3(rI%<%`w3zAOr)TA{#xMLl!`g$6&U{9bh zd0RZ1Db2Zbn1`p{8?k=#LUFCG%goT-4$S^lravTQFuJb}&cC^h!cxNd9~@f_&ZD5V z7ZZo;Pue)x*rrV3nq~yo_;na@QAY=)(aJS<%pqZYO-#nnWj>IE4+U#kB>hs2f8j1} zKV^Z@m~q`g75@)|t}yynPeb?rLsxDA{%2jeXKpCb>^Atlpo{}TDKr&`h`l}0QD?)~ zBC-sNrs!69;QA}c7>vgk5_4(%+fVU^((3Nbdi~GixPAWa)3-H@`n+{-Y(5{@>60-{0^5!+Hr9#e1p1w2LyR zl+ez+zJ7dU>_>}T6lD9tFcDj@%U~57cSj_wgP4io~|t} zc(_WSNg3pWXQxWh>x)GKEE-0GvB6$KkEF1E##bF+vd|WN?;UZEy@AXf1GB(UXBmw# zzU@neheeMy?NvRbyqp*L7yKurwy7(A0-c}PT;+0-)DKM8b>a{#-|F0H4rko{B9SoT zLXaM7Kee)x;k%ma^N4#cDswjT0#PC+?JQkZhX5>1C-hRL4<D8ea7k3K1295cucC(z>P(HPWb{rWdtLGQ+0p~` z5Lg1rOFIH}Ndu*20H+FZt$8)L*VBrRz3}_H*t|;-pmnS^PzDeljtcAGb+B}xzHc`* z*$Hn0;o>pI7@24~||80 zx_dTtfUM3+$--r&fBk*tsFl$Yxoi_oUykt4sXb!as}LE=kuZ&w?3NNMlEcwSD43_`&0Y9$D%;cs?MN32byU&Gk zyZ21KDc!3k%=ILDK{rTlI;$BUWT#%h-bf>1$!XVRP+f_SWwcG+Q1Um|{WTd|#R~ib zsK3c~YGqk+goD#Uu3_#qEfOF9$J$)d8;w7e1q(A)4LBA<-z;OWCDlDazMyK|M?+OcQ##(+IUPfOk1gm)u!vZZmX&e3EfM|td$wBn8_F{(O-PNDXq z1VLQupOlf#z=ZJd6;Ld;π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¨t18{Uo@r=<3|daR?-8LTVeYwD#MAQJD3n~eXJM(@LA*FY2mc_n=c~## zR!pvYPmhB!V@z~E%ttSugR#DLbe~Zh9agvXXuZd$+mOhz9o9ryPvIe09qY90Wc$@%R^4#m zs%>|kz?(j5bI0EQ^Rm_a+cc1w6LvQgQy58HKayYCmL}?9OgJJ3ZNRU0dRxSN0y#)X zkW8p?`caLC*uibm>Z0 z+Df`Uel^T*5(0rmsi;=7!&<~D?pdsq9GI3m)Htrr2qg%aXuHZwF*L?$kKX^=Sji#4 zu#QYYW3klIb83k`MxYMWw$(Q_G#pg4H|IU+d29n-QZe(~E+j7laft8-+rd$8YiUuQ zBghxy6zal%fsr}*l4$l@(JkvyM0XBZkHtbA^Hse zAA~K60=Cppp=xP0$_y8X)^ye0n6@0PS3!kt4vvYi?y6~h0ZaLey#rlOxV5l*jN)=} zepR%v!tOwIzSeMZow}s1AlNol`x;_i`+?;e0%&Vro&2uAs44!o4GTf6)8-8pyCd>z zi{l|BVe%j=Fsch$+4pJnn4l^jW!Ep@7s&{m6ix5Py3cK$#1eAKJgBb z`cySdOanl;t<+AdFp_3`wf^YTVR-D2;Ng&_T(Z-&yg+d`(<39NmAdbSWA}A(-#dq% zExq=7y$8&7UsyzLPsSyoT^issb5!4M)FzUY=l!cn zYk8N1{Q=sOu$#g03VXZGpAw+|)ifwNgg!kD*ehc3G*Zrd8uajVRpA#8sx&Lk*!N*3 zuLgvk_jmeyuc6HUu?tlY#w+P~QTqk3+4ApuHeg}IIOANN!VA48I<<-HevZDYlm4GK zXq`K@U#f5fO~C>45!swgzd+KeME|nI|K$aoY46Jo&L|h^OMoT=q82v0p_fImXnmkb zO(0GWtM?)GYLyEsK*QAf{P`uQ?F!2R1fQA~Kij!S&fx=oU3hddt{Quj|@xOfV z|1TGqD$5)>1wF8^yhzLJ0sMQVr|<(f6|$qE;)GHJFZW&t&jIk#LTOzzs*~TQ*G(H+ z83mlD&;Ne9{J$JX|IGY%3>u;zIS^_)%5pnLWufW*G0vCV{*+zM8^0)Q#to`;pXqO4 z%oE{_Fp1v~_I%$=5o7SyjX@J-ieQW^*9=UP_tpLM1Y?;V6nICpBxX{5XcICEmXFsy zbdBtRY)kLN2@@SLv^;3t~3Td)YMQRb}a?qy;_g)X6eej6^0{fB5klW#Ek@cv6)V>v5dB+(`mFCN8I zj{N1@^KI;(rm}Nn5r7O`yhWQotfr-f%ebILWJ3VO+6DUSn1!K%J22T~gfB%sYuLa3 z<eJ>+2I2rn(00)(>85CpF23QiN2*5nHq+=o<8Sk z=@9Z}U1}0vxb0ZpZm|5d{AT%WssaN+*b%;3`3o!Jol{fFhO$GB{fERYk|M_@_p3L7AO_{wyKkY+zQtFUg46e>H4RrYsczc!|z9sK=|7)8FB`@9LH97bLU zf?0=_ON~~izj_)PrnrJ+68y< z6vE0kvBuP8pBu%zfB$ z($Op7z3?T(B%!gPB?Nm2#Vew2a;jK1pIE2LFL&E(oZwxju%t9x&aqm3dUaHU7kk_D zOkXtLtPXGo zr|okm{k5-xC`t^t5}KnsQz(rdEB?``I@8u#Qa}q)k5;-gHkUlR?Iq=s;tG7#X4GnZ z_XO7A)Tvj={fb<-XRJxe5y03|zuPj6+P5!$ko55Rs0E#Hdvx>~>0>#P=C+hLCAn|1 zS-M(n;JZ5CJXKMz=FFLei+M_N7GFw*{IDZ%*)x?2ak}>&t;UxZ>&x80ll_GwyFKN{l zAVgdcc5H`*Ubf(Ak4IGe$5+7hl%d3kspX1swstAxNZ2hT#?$SFRedAFyuIp7Lj$=A zNZG5sQ%u@HnKHe7*HOOKr{S%55i2ehXEXJ?izQN|&Qr25;+~O-hvk;rOH*i_GIUql zAUX}hMF(>cEjcWAn$8*%!Y;`#5R^hq%;ELH0cbEthacoRojYdG{+Ya_c3ilBZ6&rX zpwB}5HkRH7{i#~717NX!U8YGwa4I;b7Zb@G)svt`r3mvn!=X5|bDd}{qv@+2-B4za z5pPjW6(YxaKH-4U)<9DHqvS!#WlS&$&m0G!u;dj^rH@;^w<|z*@!^{M##EM*0i-Z%(Y5c;z%c*4#0X76*w&hy6IxW%d~tQETuikvL1yk& zZ=)g81ShPvcF@$4mRB9sLPIX%9XH{-skz^qJlbv_X5*-d%H;ueLaQvz1O^caL#`B% z;GfUW^L_IR17t5}O z@4m2l(3s;!uu78^HT1i7zH*bSq;UCPm4kkn%(4fyxFktS`IKcc--6q82Sj5)BtI5p zhyy`E=+73phnH$xS0fZ1Y7FFvX|GsQPK6a(o*QX5`662PW(}iVQ-Ymbxft4kRC^rj-GvUwMAEaJLl>#XU?&>*SPG9#K)ge+@B4%jGR$uf-PC zw31~{3ScF*_UuwTaJzv`hP6S?T+B%9%9!KE7o`JvH{NmE2n(W7_5@~kUb8vLgpCLTxLe%1#49S_Nsd9>|fWMTU{Pe|e zBIE!jclN?ha_1>Z#N@mn=TL{EE?RAik<<>7BK#jInBN7lCWBpDp4JceZ~|NoP1S%N z9Qt8e8B9N7>d)USnFv}Pw5O%rtQ1Xa{hFw0F%=9$yK2JV8Bn@vZ(@S^)<%$tm;tmP zG%loDrn*Gb0beK}R%3xSJ&B-A-6c;N*Av0B}Yr;_JDq z$*|^Kc!H|4J<|92-b3hl3#YzD%q9%hO->?M3fi#`AxsmIq;PN(#_6@g{{%7rROQ@c z7#+#Kec%+IKniWxw;>m*ze7BadK!_qu!@F?0MNG}J_Nb!dpLZj>ED!o8%G6TZ^vDm zB%oy;BQ4RNq1+059>;(d^=6Te_HgS;j(+Wb_thC8*Z!^9@Kc$=IC=Ug@38tn3Ig(V z5u%PY#{9l#OXW$J(qU>{d4F@1>Ywi@i^Qu(E zimxAV@X#b6&^Z3sf$U9!jG@a~f($9;@5g*NDm+Rd>qzjbEg)B=O|Us&VR3VJ$xQ4t zVC$B@WW_7OzKLjQ+ikkWZ4s-&SErZM>uXEomJvKI=7y2&4~mfT6XUSy4czBo=|+I& z=V6M+$dLM2ju?+W{uOj4Cp{oGohvs|k_&by>f8ESYYTCksgK0suHE~(BS{p7q@A>` zM12})`}Hts88r$qhYz`Iy%bmjB2{Np24?B<*UPmI&;JsyQ)C~t!BnGc$Z|WO;jQFI zJU8B4`KREI3v1D53!f3MF!Q1r+^(F-n0@9T=>CIeuBa7b$UzY}k?U#=HvVS;7{09y zC=o1l9-?N4#36(u@NML@S0D@(Q8D%&f*&>5sJHhAZexW|c?v7>$>{G2vksX4SD27@(og+wLLGiE>C zqNF!R*HE}tj`XY2Mi5#=H641ev?LXn3!60jHERxJe*5xi#y6 zofLvTyNT?D{?5`M*Qy0X&DP{+2EdhIutqem_)RAH7yRO$eRj~hz_^7vBTBC<2k_Ze zp9420Wq~dEZ{#?{ajc_UIyQz4rmQBiQ;;5oVeyj}B~81bVe><(c81sm+i#bcpwWg_ z4RIqMWm~R2iHh;C0V8i`1t2Nb_gF!^3>H4KJ)tdE8Jbg*X>!?MisB?zCFF4C@g4hL z(iH6;Mn&l!jA7ddN=(OFk-f{yAQ$7}xa|7f)`hjIuocyHv1qC$ePrm*bINHA-8Dm_ z8A9^xXy;4$+THopZSRza6pF1R!B8dPZ06OcOew`pxdd}bK&_}R$Kglf7~H9Qs~|KQdsMKS+~3PijKn1 zJiC}ks*XxzsUdC!+D;A42Ch!XDkM}811B%tgkF{`eeckT^pM#a9~YHpi3%3%&7p-; z;^2xU9THxHy1oJ_$!2#H1t?r{4YZY&`iFSQ!YR4U7%UV1tPA!SfGr3G5Ytx4e_*I# z{)l1ZQ-h1qxEi;j|a#1qCMPY%3Wi6&K;cH)vVekQyox&GGy$;R;%xb zM(_X0g0Fq0SK{X|JI+;ps`?axf;GQ-`hESFYYOT9#rzX{MS=4-EpSSYBfTfK@iR&y z`urGCHYAlHDSt9ZH8`C-9L1Q6I{Rr9%6e7-&+r7K%yM%_I5zzBqUp^O1exOWf)-^h zCAPcZc@`jlwe_iD`AY!>}#zf2O4 zHkE!*(_`*Lh4Q;saUbYo$$hnSx8C3W^%~(9d2#PeH=7IScRZ7x?gCqTBsyzxQ3w=QRa~bXDQ}O zU%Ef2&+&5&d()oQFS|P)i;3jYXXW~d@}*pAiO;Jb+PeMVKWo2!#f)8l#Ajl&|KiF;(DrVU&#wK*C`W2nn6$LB++`#co(&ClXUzdx=}uEuc&1(cKQgsZ7|kBPXm}#MbGU;o7wb=p0Y;$k1sS*MIFtgNE9Rwu& zTv1kG%)y#ipQD$++h%95ADnI&n+Lj>)w8KFTUdST9CF~5(R~#fXyAQu(xek=?9G91Fu3Jl$6qQRWbKf>66E=@d#V0xdSrgTmZjw1 z91qt@k1St~JWqA+%^VgUayQ0szJ19%xYh74Rs(AU%twWoN_IRiiC*u`iy7UzKMsHM zo-glCYrD$rc+@`u{JE_Vix>5>``hrNl{?k`d80D%{=jcxR5o-SLTa+iT77JAud_Fk1H9PvzUBtM;BEkv1ASe8zZ=E@0QBdOrA5`>R_-+O!>827nVo z;6nSQnQmZiAjqBWm5O8&+4b_sc@gx-A4l-Zua7T(evwJ5zCR!O_KmZD3NQHi%5-Do zvQB#Q@1L~$t3M9^|DpfC1^>xgpv_ZIKV2*Y%@)Gn({|x3hUWOO>Pnlc*zw_%|CZkR z+z?Sg{q1M|xAC2CVO9~p8qfZ%uKzdfD*B(<|Bh~R*CRW6>k6kfmD!RSVxmTS>?IMU zgwYhL;8MHqQ8A6`-lhW*QN`5o_11VhWB$ZQ*dUwQK+Z3|=4?V1_w>UW2STAgUhFgoEyIXB9Ic`Z>3Un%!99}O<>6Re6gwNcb z(dX+;C12gaK1HJ$EWLqIaFP!a;x&CovfkW9&02wlnb19%Bh_5ITz7OuZakl*LHaw5MCX zegv*^uCQc-i%O3fnpw8`e}aCE!>-?3s`h4zW=`Vh?Zt;tUufdor|*-VUy;~T5=}4X3BHY9avh^>KIww($IQ* zF}5eM&o^1C>e3Dsqk0s5sXx#+lBv`EAjl!t8ejiRc~+@&*;42`bL_=Qc@}6?o_z+; z4LNvx4j^sf&A9_0EjF$0ZF!jxsSc{Vc?3ZK8?$ptNvwUfs=-Z|6(g3mw#=PLYDtZf+ClPp;N9R| zYHR0NZ5yHT(79t}Z~%3jlFy$@R_E6){VKODmwhXh`)c#mWh=At;FXZKemKkSBUZkp z=z{J%h-6w6%GDW+I7rmESWt@3TwY^0ME1#;U9_tTt1*A>H-?|=j?C}brsRhuzjoeeKu+Y)Q06r|<-u*Sw`RO9BBJ_r~2_8rR^ijcagsXdHsOOXCE04;CQF;nbY7 z_oK#%hhYG>h-BJ44;R;%Fi7TlF<}0|i3Ul0}#TLiUGra`}hfWS| z-l^$ETYI15hEFv)EB%22oh80cEbM3E14BIH`I{sq!ftM0_3{)KXDYOde!>gU^c!!9 ziv5KHXzZ00!N-|>|6av#cP>KW2*Sh5Z-9%W-0XpH67YcU7Xew=`9ocnv_s8mhL~9I zF-PMJY-VICug@Qg>Z{t?D7rH%mCj)wI(0VOr>co5)JaP2-Q;N7{-GWEfHYS{W!BPA4{U=nm#UDs| zfA|+0?S-;(W%G#B%SPh$iHnfkSyKd`VDMG8fgKwlwVxvI-RfOuTYmJ4eVm**s?w}C z6U8t1k$)36>a4d&l@g38bf3=ZLkPUJ&0I9#-|x-^YihqiRT)3k+NZDd2&y-p*Qpwy z$x-P~F=UOK#N1g(#J#W~{j;PBi-)ke!(m=ZwbgPWe2>*3BB?xwMl9#ro)yJKvt1{k z&;h0h)UIGsT-_1elfx8G2?(`xMbu||Uw(yb!)V8#1(7zJX#dQ%H8r^`EOonhO)#$U zI4l(sdr1{LLL!Od%KKZDXS64=ax}MFgsHDY@VjI;qm{82Z$kp_JvRyYEq^gcHXblG z(~z;xwHFX49w$>cWGrz=5~>lP=YvYmW>Aaug|kVBp$k5gnJPm)6U(FBq|MorP|#DG zJ8CbS(0|eMX3E*3a!PXmodog)sxHOxZeI#ER(UHb0GA9);>Pxgoigpet75$Tn9C&K z#CT#Vm07EkL*1j!9|mmmveGSXtlh!8)~Wv9eF@)Z69C)oLqct_)4qZ zEF20j6P2L}(+h!k*3axX&qU)+OS+^~40ZXJhIxM*vW6w2N*!QAiHNLjtM=R>wucHf z{0&O9Lv27yu1+f{9|0Us9Z(KIvWt)S|{`!J9?B@ z1d0_dB{z-Ds78!EK&ZDe(R(CvtQ5v7meCA2f=#g4UicDywXy+fw4%wH*Vp5GQ^BsE zKJp7#m!eP)?!2Hz+P7USf>e0qs~;~|Hq`}qFuLqA!_F&)^1EN<2U)B;aSUe2wsUX0 z#lMtRYrnh9k0MTjBB@N5ln3r~$uC8Z&k2*t)s3}4J1)vxI% zruNx=81$fyk#3kDt6Uoi$(2A#rUGpXs?*wdx?Y#%FVSd4Gi~6Sl08QY8!A#TisF+z zh@iuBmg6MF3YeDK9X~Ho!N{U_x>rjo>MPOx*It(XY$!n70_}!?va?LzOWEG1_OKjC%Qt%M{$ieqRV~*GzGzZy{l4SLJTs zO=KCT!3EL6PyfHR%&wOSZFwt&-&&n#9p8yAwsnDNUG3Xz&Ey*?YLK-XVp=&Iqh`g! zVl_2IN1W%lbF~J|H0ugLuqj75m1-phM`#sBNrUF@G_(Y&%@wixSP~xW>;rkI5p5i; zrV}0>jKp)g@8B@S(ae0dpw{PW9{j4Qd)*;$K}c->%Qwtl7o*~umBY)UButJUU$IDL z7S$aATd!W)nm`;FBvN2=H3c}jxY`VN{q}b7XY`iS9j6Rh?Boyg9_KM`BuD2im@YGF z{v*9qB~3-YQ5>=0M+yyMt-yf;+Lji&Dg*4pL#@9IZeK&q`R>wPqlw3oB1ib?f|}2x zh9~RLDB;W1nIT|Jm{6mDp#E9wp|N(*7R)nQt4ojLg?)3}T&Vmp3?~?@$wg2e+U+@; zEVQrt?I&38UOGqaw4fc)7{h=c&oG8vUNB5H*LW##OzB<-&kX8WKNeB3uYPS&EUAwr z`e|Kco_n13;l~@7ZyJGOzZ%KE6og5QbGY}Myje2%g0-LzHZ@Bv$k6?0d$yfc!!dBr zM38rpK8rk=tq?&6N%lvnMD!wmxuhNy%ItGr|_zyS4Tr zOXSp$qL*)*FNG~}3=n(N6JAq4H~_@Fi};eM?~*5klc@~HH9M23K9ph1RVBC zK}?56a+Md^m0Ljy+eq8Mv3rZO+RS_5wU%zr0S1ey@WG^6&JMRn8md6m}mc z96MP4J;}uUsYP7nvRF1t>hNm{8!nx;k1jAE#jZa7xA@dY-0Njhgj9)(P{d4221Yzu%cC7+ON?K0ik+t8ae#^b6+Y zKHHY!M^dyWNLs)Uge|eT^U~K(hb1QzGpFvx!zly`!c6CF)^`w%ge{?(pB=gg5u1+^ zO>G)nVl9_wCvOf6Zf)IZ!1ze3yp~$ZQ!sS%w*d9w`hCnylysF)(iw17%*QUhDu-zN z+LFN&hLbH@hVMujk{j;nXSxZ|PJ*XCq3!ucy1T{DoH;pd8Ky!iDJheb&|2&ceV=HZ zt>E^VZg|I=EQ7coFakBNdtPT#Cer4CT9Yv7NpYgl$oB)P-Nh*9fe{8$OCozyj9=u7 ze+R~5Z5ZAE%D3Ax6Z{B%Od`dkc8xI$p7n`D0^B&QDS$WCp3t$G)HLT__^NsI%~(>P z%R-edSh)zTEUi>8{Hr^E>{Kl&zS21eC7P(3tz_dOtLxjvctlT0VV8eJJZ;vx@hSK_D*i@GxX)l za~%P45xqDOZR9G}somG_2NU;+;ENS~V_`SA_43r|Dvp#d#(D~5v zZZ5&5Kk$i+nKTp?uf@WKe`)CM@vgy46O`^+-U7dvrVmoU7gF7YU$*Z9>rxWPrl}jK z0R|KYRJ;rrheG9NhiWn+4m@$b0AUsjvJW&__Zv)M&g5MHZtU6aw7FACLu^t-#^c8J zI=s!rh5)Rx8MbQDhj zxJ#IrZtj9Ox40r&@{ZT~gsf*+eq<%vx0%nP3F7FN%FnP8DJCY4?k=ThFyE-3#cSg4 z((1_+y$6jaS|eE7;>f^O$~89`=bRr)GkizD>Fhnb?b%=L^B`W}JjKM?7#U%b?61fv zl$#u_IQ;s)kH>TI$1>;A2b%8lw`Sd}m{%mmM1?W)vfp>-g%e|uL00k}99sb1%|@ht zMCed^5k#V{MUdP$W+i_;N#0Fkz}ut`5d6-! zxT~`&Y6~XsO-LF`qrPKCPK{wwSm2rSCdSh<>CM~QiCL|lOhJ|Bjqj3^7wo5*w#n)O zW`6~et)CWbV0CV0tA77>{|~{@Wkpi}d(h4=B%}3$0c`X7h!gD?Uol@-X}C$r{1l&n z^q94V-o?mS6RGXa%qiMRzA28vy*^kTmb`A?j0BsI7)ZHB<0fPn=;$*YA9%Xv@y*0@ ztpb6_H_t?YSL*O7Q#?0^DBdQ17xNyp=h>siLfK#zv6emsBj){FJ`XX-Z!%KB~R zNjVbL8FERR4jU+xZB39;?yE8ndbAM_|Gua1M3|Y4blW|(lOM^*o5GV*ErsKNRfuk9 zBy_YYqO`n3a+D#x;oCQ}T~#b>#ks_2{i6C0)^Jq}rsznq(twNa1TKl_ItKM%hn zgv2FtMiq6G`_zTQpkczGkERoFr`RcSV+WJ*fGyw`L9q~HQiDAUf~;>Lix`LOBh@RC zYMOML&@c|mZqL(*V?F`oSbbrB=OSDnsPm5vHyD6+LDIo`-SAAK`{_f_5;s4tpUxI= zzNS5hZL|69blro^Q>kgM{~Y$J1K5265>`pFu245}VX6CrJSU}0S5rS-RLvBWSC!!M zJ(R!|Gr0mzZxB(|Kry&cacwiJw|)luWkXJp&}dhAQ7@#mfDa*+4>pY3JH~ztFB}u& z-$H6NGlhOM9~Q?C=5UpiGhTjfDt6}3z_%yo_NtMe00EQ0P}4?j&h_Cz>M&4(sISlN zOmpOwj_OI>?P9Vceib#N{wSUjWW@H8#=O;))gpw%MIzu9Tn$8Qc>INbdf>aTJ zg}6_V^P31magvUVi=JrLB9q|jBbW4w+@EAr)&CP1|Hc1;bO6B++QvQP{&%^gcN;Ay z!D-PurB+#>WV8AP@CwQ1Ap}o?!7uYF!or#cu$fOLN$AO=Ke9XiqAex4-gub|7T}&A zObYo45T{1R6iu2ZY3q>0Mxp$+Y+xtd$AUy^U=|jtTYns>1%tsZpLzOfnVJXcG0Fms zOm)fsFhO*(KVz4cef(q0h3n&a=@$0&CYn0d0{=$@9kw;~5MGQuUTsmtL!18WPK^m; zW$SHC+p$drV=?X+NYk`AIzK2eS*7coyurSvyRO<}JA^)^+GmKhl$ZTUFHZA%ftM%V z=5x7TS^1drm<^$kowm+o>w0+;R>lRkU$l|lO2Yr8b6DRj^c%RMyaP=uuFIJpMdnCK|(of%V2D5?@ z^~c(?%yYX{)OYbOADkI0a;6l)n*Hjm2+I|$#3G(ouXBIpWgGD1ZRowBRp<3^{N<~S z2hNIdwFan|X`J~ECR97Ay`r)uIw@7Itq;qla>|VdwY@wpc)Z1~#3jXNox2Ah5icfS5pHAq;C6V}eN%3WidYV*S_FE4IR zR4*xmq3tOHMfY8wb^i#$hE8G^&fRW@{~^3BsdBDUC7a>bs%%mzCw%pe=8D!XE(nl2 z2r|4ghuceyy%Ig`Bh5o%seV%z4$2_1eS*u9=03o>adY>r{;(Q|R2#>6GM8Wkn#QOwn~p{(-HptiZ+jG^nX7B{D}A!X zjaXvyIMz2Uhh|DYWgbNIJ2(#HUdS1TY^%cM4%5~1q=ysUkiADfb3CozDt-44q0wI@ zQFTLSn?S%p(k0SZaf5s-FF1(xvs}phoWJHMW!$vz(3-^^$u~EOK7|mp=~#UXQ=qCF zT6B#X#<2p6q(=sHqSmLtG?FGYu>3=;0P?(vr}Z!Q3B6xBZm#ZFMoxkV+sB5BUCFu% zG}P8;tGG<3csnzM@3UNThPm3sQK&i+kOS5%{FH7l=+rgB*br69Vz*1Et!2*RB|_%A0N6|4%3~SLy12#I^$0xR0OKj^El8&B8Ic%# z(6&g5$j^AxJ?-Ogu)|4bk@qeH8&i%w4zi9xR9Ed?cPuXNRNtQ8A*?+B)jfgM{}70O zc(2-sOo!M+{FRb!Lw4Q1?F)gPRi2xSI`>s!o*;#1&cx`mUZQDIFM>%VCBXVjd2t}r z1cx{9C+{VDIi?&$D&9skmgex`{>-T}E^6JKxl$AM=Qh?ImSO=5n<|>J?>MCO#C|xppC}nvN3T>*;|`4@4;QC$ebx7(`A{E5^(pX! zA9BtIY@<*VYUvn&EJZTcdUl=FPwZl_Bt{bYY2cc}b7_{OuJpYuChch527F1WTt=Ih zc}-_dzM3)>H|2d5_5gLz*rN-HX8*ek#^F~R_@`_WD(aE!0;gCH^!omKUUmMS9l<$Q zY6X_@L91)|H&qcz2+#>D)=A^mHUz8%Y_W0^Bo%KhC>s4#(z-|lw-beU1RMRVatVm7 zbdc=M;~)`VA1zg*MVxJ`b=b`7V?ac_2%JzNE5;hpM z;4<pP3ulfO!R_vP>eDgCr_D{uF(%yTF*c0MzTcGer6$76MI5pABQsUa;u09guch!sCumh>3tNkxa2%0C5G+SWz=braxF=Mg%bLy3@`YF;s+>={dIG2HP0cD<2p zyu0B-p5iQki}L}S(vWt7%xF26iH0W9_C2yE#V{6d-s9-+UNN8AX0TKts6RVm@Yujh z-*)p*V3=JEc-YDPVC}dxsziI$&iI!HuH^)r-DFPUjipa6fdnE3bhI_ zJD;%ATT|!Q6vY_3xYQptbER3^4iOTrvl`30Xybpbti3U4?&d-%xZ14EijE%SExJ#= z#O!sfzC*1g(_;!OL-C<{a8Nqc$sA`#2$(fC51BWQcx|*U=mtCsr8dpW#qcU-e*Jcy zU8h;7Gb}1m{?>_PX^1U6DN^s^db~d=L|yXM7L7Vx8Qh2D@Eavo(9I9623<6Qi%B+u z{ef9RjIi=-zFL6lu@voYJM`rSXJv$GLqhGjbs5(WYy`qwj|5>iJ zL&j9(O8v!R7{o(5cjw_-1}_CNmSR?4Ws2L`_Xi!&MrLH&*G4_{S8vU&t}kuyL@Ggh zeo3~i6C_+xxjsS=JbP8K1r=hPm}Y8SlL{SJ-?-a>1IlWBU z3lq&_QFNPqY#-t__sZ9j$0u;w4@KDXmi{83Qc-h#818vJNau`e>CjLlo<2sMF1Rr$ z@31lESvSFmuJ(#$vy`watGzMFI0vA<4>n4fojG%q+ZTAb-s-H4GARwSfuM_gw@DOk z`eijolW+vEeXahj;XB#)eNCm|CN+aZGt!i1{)jx5C`k|{6w>?#Vy>E9FCT#A$Oj>nv}d%kXh|R)ih@}ia$n2 z+HZs2caLo`M0s%ho5r|Xbe?2-&heSk?$Sf zr6)vVQWp@3HULM#OK9T2qnZmsgBu>g^6ir9qWok*+0?K)0F+zw!_}huG96d6GWaVw zL22C*J0FAJ>e;~1!L@0v33ld&-L#qF!f#7+tcA64nZD-emL=T6Azw`5Ozmxv$(tuM z<@0SOOvk9vCjir40*Uj4l9T8QQk3UlBKfXRiXV=;<0#Ap++2K%ONKsx=>Gifv?TYeF%KUY4$p8X&QEpcGgOUC9`3(zK9Lpf zyP+w6ociphqVSb*+NJ);qaFoUDk72&(^FHR$2j}B?8t_(k`&3gRg5~q2{!5nL%4!< zVkBxtfx?xgA4}dEo6I~|E#FU;a&`6cHjign`ta>(YnEF=&A}_~EGe27EdF9$trpsX z4@*(GM3kP#@-2Be`uhR|+U{=e?JKr&yb}`D+S#?HNLYp#LU*}&SgT`W!q9T(7lr0= zVr+Ici2+WukVj&LI$uZf;zCZ@BPx%qZn4KUWNF$-R`)pE4hBT`Ahd-Qua$G;mh=)@ zic-3v!jZDZL=2h=ou8sJ>5{m^UcGWZB2K z0?YR6*TChZ;l-NMk=$k+x^8gi#LrDp*(XWw0mQaX73~pq9Ft zLd_mIVo3?dX2Pnhpm*Ggi13+Xywnt|T@}NVM}0vfn(p?GzF|;9NP-l zG@DlM&w-lxM51y_Usv|3w77T6DK1*KWrMonueL`w2eIrGBrPx_nntCxAzKI7Rj~lT zDvv-WVqgm%f$V5qCf(eQYv^Au^2`I_12)!$kxf#mp-qu-JC2a*(bH?|kD@#>G2Ihq zH6sueJtfl?O6mYq-Tf6_20c8Bl?0+s3w2u{lMuT^5@(UbnGr|lr+%5xu+MZOF*Z@X@?1YLxMUdmeU?Ej*xXCL6wZ38Iq}f+ z29E@gM$eM&2j>^#QM>yCqT__wh{D2GA8@>B25EEcA zjcO_4m}W8KUf9r3Uf$t5BbL?L9j&qW0*^(^{57oa@HuF4OCb!}oN;^egFBdS%r=-A zR7GiXTUoR1^8Z85xusE-31ujYdgMAiBN>Loeq=fbvKn}xZ?MI9JX&J(EMQ~UEqyDL z0&S8(ssjWvbAp^(@i-=E@bfWV=d!Yyf^_)P?rhoOh-qk<~rdu z05h$r3Gr&IZW)r`OX{g4J#ne98!5!$&7_xL*HS|>{xSW!p-9ZRnfz8epl0QETD|D#}#OFP=7g%H+^_Z0ly@|X@y_!O%xZ7988ZI zX^Pc;H{}i5BEr3>JRY=(LW3hC-I37NZ)FhrM+19>w4^S2>RLYhkQ@vq>-Bm4s+ij2 z$Zz4DJ6PhK+gp?D^bl!s${s`M1se)B0(kVphV(9dS6S*tnK;nOTSyKh>A8zyUVP}< z)~oVXSX~$qRV6=EV%yY{F_$M%0fUWSwYu(2EBaGaeW0YvgZm{ez^MBv%@4>q%bDIG z!=&>wKrm-xiuP&bm2-^fz&DJ`jcz;~&S?(k;jQ@8f2%3YCEeyCI@guR#T-mAnv<0C zaJN>wvgTy*wDW2n=yFfbr?L|%5z^MwS+#yn^tJKMRA`O0L}?~x)D*rk#BIRXZmK9! zF*tKiUK9Rh+rmg|VHqFq>SAKSpAZgcjPr=)1X(`YjdVoEoU`TjX9M08tdnTJG%in# zA*%-POXn-nVy(zXAUKL+FO1-2Xa${`KeY zAD#auZZOrXR;B!pG(pklwZPF3;`pTT%4+h@Dqsjl8XV2BeD(@Nv8u#u1q26ey@heT zFDR#TOj$6QX#ND={Tf#fAMwB`&)LB#Ef?75{7R|IMcviNkL{C1&Yxw2k{KFQVyuLC zNX;viWV>dh*m2WR?Ez?`D0ZLT1<2@o#W~_wC0gL>t{F_O#pbwMr-7PQnheGh?3t}9 zI6bfV-i~yTf-*2MJLEO~YNpV65|Pvop!TVVB1?k661F<%ScRwK*l~ObD32l&PE<@* zYodGn$P9rwwnl!x1WPL?c*%p@*XWFN4E@Mg)&cs>mkUE@mpMj%(yzw>*lmdC$8n`_tW(h5~ol(WL6F^`$wPFieiZu|t?~0 zc_}emOu<9l#N72rQ)UW~S!=WnMm#~BAD3kU=7>VWdH$&Lh``_2N1lNr$tRDE7mZ-V zjjrjQYne2-)(~#?Pm^Q~ZMlnlq&*p92XB5JS7b5 z@HkrXn(kWPJ;EQ3n{X_G4DCf}Q@Xu3Wy@JMpxOP?_IRE|)BkWM{AZ|$|DTXR$Tha;Y6Y= zwJo1XCC$EhEUG&HAj$r7W|%raEOFACN(8C=>`$7`RW=>$&cm-r=uK@rkKl*panJ|` zU;>p}O(IG0SKD7@W2)Mj-GDei@H^9eb$>-#2?Ma+g_j|P3Xgktd-<7sQd$@`#aKN2-Kk(F=)p&adi8>YkG5$ zu(y;Q2v$~`oern?-1s*Kdz|)yaKHfb=>G8;^Yx8UuQRsj{zlOE+xODp(_`DCGRYV4 zVDUbF=&R@6Re4&k3+&}8SNQpdrWTETJY)#0rC9YX=z9B}r?PBCWeRIU zZ;-`n_dBK1uUpR(q}aJ_BcDK;*sAUbbNbR;w=fRVyoUPP{d{%D-MOe-(a+OoC$99m z40eJz$kGo5jL+YCt4`U~YrUzw)dof9Z1V8z?ZIHOTD7)Ys+tlB3NkLn%4{RI+fv|@ zu-fYD3!PX^rmjt@e(Dyy4YRrbYq@$q`|Z2nkQt(Rf`q?D)COnHq)ja-|FuZ)wAxbL z4cCNaxVQHoh^zcM^Sr+Qt*G|U`P%3UTyt|Ko;jtXzhEJLq+`@BOj=4Z+I`@!*k8S zvCS=nKetJ^IOM4;aJ?ilDKjB@KAyRlZz{?=OJtnsCRx6wiv=m817kkKD4v&HwH#ql zM-5uyNNNhda+QZMx^m>oZA`kMh-Gm251yeYn|4j!%)Io>CFmUg_xBBYxel79tP!!} zY-X~BBqal|@PuWgCUak~S(&mr7ufXe5arBBm(^VT7+<{~S-hl@%sa)%Sqb2w)mJg6 z%gLSe=#%V2(7VA2hqcpUI2ZvlL49nbglr6}gC&@?&ri5ss+C219H^?Z3`Zj&f*fLw z3CA`pPRf{_aCI~t$-CjZu@X#}nwiHbpYBh+8P8nZ>uS_>F36D#7t}EnPTYSDCdMTH zWDzo5IQ(?CNnX~>GVb&lb@bw-{ri>c{f4~K|D8IRsB=`%era!P9ULHwX}9>Q?iIP` z_9-lulMyXvxht#n^(*@(QGq77h~I#W+GTaQxQMfz?|_XIGG65{Y5T(hD-ff#gj9}J zUaepG?~e~I!2zvSu*lJspvLWreE($YGa%rAs!%qV~Kc4 zt?Mz(chL`L1zlQ28gU;JE{_3vnd?gXSgn#w70yy$71TLl*QCKC*xkx{C?NsT^9lq{ zO7vPa9GU>92U%^Fn8vg0oI=}^Wq3-&<-A&PUe7@kD+NQ8 zB}vQssUmr2zxCbnoePdf&{#*9XCZz^kOmRcPllYe;iav|&uK~wp1GnQ-B=Low0|-& z?8ght@Q2mk!`4xY&PS=Cw@cqpC*HEt&yZN!9j zmJD+Fwy>;Lw5~Y|{v@4pW=`c*kV!jOj-KTD&_4kTP%c(iT4$D-Ae2zyuelpyqrnYi;;V`KK4NDssD>FG~H069_&M?0gokU)Rt7q7qvpY!7ZDdU{>-+vS+rP_tG zS(rbJ@~I-Rvb9bQ;NCX3=Uf-9txt6q5Tq*>l{Ytzo;r6b&wpDIc3PApsiXgSTedrx zoN$Knn|;0D2wLm3I7u1zlq-8CYAS<2upCWg7w@AZ!AcL}2>JO%j973D3^z{C;ZZ5= zttY{>)tfwbf2$bq!*<2;hF6z7`kgXu)JKdv>iU>!Ep0W1(p*&uV~aRhY)}F?sO{V; zMeREtJ@qj-9A9cGN9S+`yYPHUbCH{EJw})qnfQ`hy}#rlvo3t?IJsAicf2cB z&U~de+)|ycJsA16%9=tAM-M`Mna%m`>}_8x`VlW_4Ae9!h=;U~*MU4jeO#5|pq2aE zq_y)4x5E1XLD8yc0L7o`3b@G7phZZ8)Pz%kBEE0#Mvo=L`{HO27erg@@&*vtDom{+ zy?-RBWV^sVx+3hA>7%jJ$wyM`$GjinP9`TtK4{xacO+$T5hf=^kvXOYrd}wkaZDy) zO}LeWG+kP)&Bg3@2}3$>+B3M;fY$4oCBh;(x+siU`uq9x% zMW3w4_@#~V?u3+gCNC?ur0%mg2{Xllk7u$aI+3u6fK-(yhVT zviC-yd2!XHy{w3RA-K9Kn$hksB5|8nJ}p30%ZxwmqflShOX*VK!UlRzqE;Mrn*=yR z?b@F7LGWS4)>_dEQwMu(P2v6rPwMKM1{^$Q&np_KNNx0ETEtuJa!w(jE^;Q=GPzr= z%?jnG*=$Q?ucp@VVeIT%HrrfG>jhcv`PC}?Q@XK>QHmZEbz%s+Joi_gx5#Xsq|9k& zyRM8C97mgA0q{L6qk(5=vJ0MCLn=7m0yAzrq0So$O0u|0iCXY1WLHt^{-zsAe$+em zX*LEdRp_lVAbG8?6ttoLxLz${N)8C#uxr-16p*np(pnPNwk-9%Z|!2C^cSK9nnn2+ zUl@*Ype?Oc`z@FNPl1wyHW+Db%(N;c}>jlkHt^0sSwsa!Zow;edel!=Vaoj=7 zHiL+*kDGh!(i)|Whyn)5U`-yK&L=mfVe_==l%NTO&`Erja0QZUaRJV%>OjEwx%7hV zY>c-s$CrLK6%;K@pAQ{AcJW3{QR30Z5UYrYMV}M%rBkQ}_J~i8T@yWX9QeYQyMh)#v%o}kECEM&wl!5ca zb+ufZeY;Nh5qp`byy#1U`fURE>FFrf)sZNOm3uGG8%W9N z>YX7Mw*nS#_oC4p{b4d+JYXzrlEj#fm%eiU{);9oo?Ytd&Iif6jS$c7F%;0jF|tII zV_$J-oL60bOXWA!6OF%xeQJG`jVD5u&nX#iXIUTRjh4a{?(=G$m&=cUu93fc=05{_ zxW+PprsZCPaIcCp?F(l&h7owyfe^sic^RkNqm=@cTbWWAx7!la%}YtAe;q+Eo)D zC6l&TNT<#1sg27}OM>)hhsw#%dY2TA?%W*}OWfV|{14v+NnTPgK!bLXNeI0a?ZPVQ zek(s|{~>&3bdr$3$Mq&1>zJ!Z%3{*<;p;wCVv<`)>HG|-UG}SP1K3KD$Gjoy%A56kA1-YWzi-Z8%Ff#{nvbKX2o@;0=W@NtSR zR=eFPv>bk?P$(R+1eIm-H!Rp$Ws~Hb_8%f!6UO`S-`hKa8eM>~wP3*Q72hna)xitjk%C9rA>+IQh@ zs7Y9CRd%OTJX@r6!~1yz;?5ILpm^eX6c=&%rBSYg4J5K6v$RpVi_&ChNc4;Jx{I!H z2S2hD)l(rhQt7OAe~A_I=^ly%!+C2Jc|?u%9!XU5ibj0+Ro$F8Q zhxJR8e@9nLFL^`413&+ zHa5!ZI1poqSe4!PvridSFXAH2VZc)HKf-o=(g(-mTr1xPUhmYSWuJd=g&^EK28>~5 zvt$g!qHH%WYR^v7wTj3wIi0CCc0$-^zb zu5FxGtQF{MPsdsceY2|H71$qfsuIs@PKTe_y=3%}8Lhk~N=o)pAa-^Nk|w)i zJPinR$jL)qn3S!QCj>*UL#ql*hT*mTb?u&kJ*O@vL^*}ViaOo`U-Hp}#38pfh6Go@4 zuZF`^8O(~BU@AbhAZnUkUi=p74uC6kAB-?-PKah0|Mt34;o)IGAi-hFA0@Ht$_ z9#TG@z5`p!r--KxjXlr#X`ygDcvUbWZsyfZ8$veL$-Y6>-tgghFnS*aYWWhscXs>z z?M=hxE6?j60{YzIY_ru)Y|SqXv&2inrs)LK7v1$4y~|XVvNbQTf*2}jgWEg|Rc>*# z#u|AtT2Jh-IWrt9p#I2Y<_^!=^x*B_1amvK949MbWDtSQM*CVP>8S&hdQQ1XDq5Ek z(3WN(y+tLhHVS4=xmQr|n^Zss^SH1-W$chRsxK+cuvvF2!CSp#6Fq1yh^h$P|@vTYM^{|S$BfdnprS&|&i-hlDK1>(OF)0mNZ(LnGv zJJT1u688uB4Mu|-nY4&-io1xwGh%Vdl2OvH&v?qYkz>)(C~UIIN24*2x4DwNiaP~r zoY+=UL)Vm+gXU$wE{uFDtg&T}jjNJ!$Swo|wOBQOe^WZdCpK;%;Q11*P};Jqy)SPob4Rg_+aC(>gs`e2TO8p zJ3&L0PP>nqBZsxPpcl4l6l!uVcoU?Ukgv0EL;buUV<1;cE}{?6I_O7LAA&L~1otjQ z%q#A0zA}%tQNw4HTTr-JL(h}JpSdBC4)X`UxojYx=Q_Btwooc(iMqhPtN-B+wu+u) z+bjErQ2rBUxDnc7xa0GUTk_?v>;Fh#`Kt6gW4mCDfJuM5{C{`f|GR0m2gc~$*2)li zu6Qs8-2YAXcH6lhI4Npu-1Z$kZROa9MeXj-`-$)s*>WQqenUws>3z!v3Al6-hx7{B z8y7t^RQtyVorgPSwZ7E|O2kMkA88tgH%NE_IaN5XYj4==y5%yhekBhELr@CG@9tTH zjq((dHIA)5mCi~{>HZG#ttdm+@-i9x992(QSoxE*OS`xbt6!$OBk<9%Uh;vHFovuv zpSmUfbTj+he+a4W#ME|&Oj5>WZ+oSuyzdo-Xv4OvXA51r_w%4%1Z^7qiteQO`Ykx# z;ouB1ey3wyzPEv$t%bC^UpfLY(2CpZr?5Wz-squ((^L<*bS*_oW_Q=XQu`9$7N;Z> z4IS|(;(@>Bs18SR`zCU7f)IxGTc4C>+SY<*Q1*>OV*@8$+-%K#dJYUumvdPh@~hW$ zb5g_CHq1y_s$RlbMmd?M8QQq$%t-wWT|QHfbL!F!BWbSfc_EkYt*oyBant9d1t>s; zxP+b(5-mBcP(QQv?|2^C==9%ydoa02{eNPv|NO!K7aZ=R-d_Df7>oahppi+ni2M)1 zTb#R@2RDneUR2@uq-DtZ z3Ub9yCO0?mzvYtWyq>$}3l!xCmTk7_pC*M!N@%?9NIkhr?oVPh2S+WfUTdZNWP8l*xK_J=$F878o1IZg_WzQ)nBEJ`tF9mt%}o|_(6ziexV6v%8{!SDd1YQ9fPP`juzvPvMSzJpcn`Xixxb0`ahjaf}%>swx}TG zuY$p&*U|K{zQzO5C&j3P&lI99O!vZWWSS5`W|}nv%oN;B)@@J2^{325=`B}!aOefL zpj{W5{p!=-%_0c|(PB;!GGW5b zc!|S}Tjz^sL)(7ULI+bHt0JrvT$!zIhUZPnj$y%+#GZ$W8ibDWzbUt`Ih$Yt{K2ZM zQ76I8_0ik&&$$LjR}rXT75MfABjL1SrdkoOeO?QEe6-c&zMoYJ!aKhQ|8l;}7ufh& z+|4w6>6013=wOFkVVP;|(hzxrF@U3q-uL+U#Q*eNR~Ld&Bd4GKcc&iGcO@lu6j- zcr|fLxlb*$mt2y^m+Rd?kgom3a{MV#3t>}6ZXYWD;I*9KDVemkFz_=)i(6o2G^g+~ z+-Yz8Q%N5^MuTk}uO@8T;25K_KV{OC#}f1eQj=4medX$t;^s^`JRne3cDZ^!NM=PT z_dQD3m!D)lQy@>C;{cwQbTg)w_gWWH1?^DTvc+#u&;_MgGaPiZ!z5WaABW#KkO#D%N?wz8B@| z9>2lBv|5FvT`1!J#ok*5#o2^`ngmOLKyY_=hv0$Wt^ef;)q|BtUQm7+`RB zcXxLW8vB=<-91}pFVD@X-TSYrzV7OJyXuwa@s~U5ET5-(cetN8;U6T$QQ$N5#ltEFBA*Slo$T33BPsIB|6`t^>!x$1#h|2~Rfld{Iv3tbw>=0o>bn)$st7 z5)9O(#CGUWz+1evRP&=n7IErdI!DCuJA$G`eLYWCZR~1NZ6#YSnhZuyynM?ft_~l? zoc=@3oE-&B`=k)i#Jo1mS+Ko2>HTbS zQ*^8#sas;9PQjGnLgI&&gu5>6%blZR*kd_QH3|3pVJO9+EMv>68sZFUtn|_v5BiqUMb)Vu<0G3brEZqtoL4c^bmZnD zd=QVYH+N^utv}C;INlJCrcUS!8qz{ykkwueYN7qKMJoRB;qI=x&+O-XQZcjo186)0 zYP&w-;$bG7GA+mMg5+*S&wOhmlq*NRKY7RBz}B3--Ud8x`e3j6__8)1<)Bl@ru2mXZ)*bmag)hUan1xn|KauT3LX6A=yStK{ItuuvP0T~ zl31if%y>(C^H>{r7c@u8*8=Jn804IV&VI>`LJt|Zxz)8jxUg24$ec_|Cz_}lkD+>= zGG?GlFgD;lV@kKe5|KqVS}Mk>GGVB_oX7X^iLm~=?yf7pXcC)!h@p+J4P-?~ zcH{%smS?&Fvls+bM@@i05RI zV!z7fqmjw*At<;(>3GMNXwjoeP3_68xbHlH8l9flbKGCB1gSvCQXyt;mX7k!k#9pZ z47e`k~Q!?lRq zZRJ!kV~9t4YNyOZSiA!8*O?)2%U@e`X&}%Uy5g>7lK>Ak4gx&Sl**O37b=>Qr37}V znps1SI}!*0B`CjEhFQ0lJ_=Rl;~Y|qvBP!~ELxCS9J#B((JlsG`lGwurz>ngp5m%v z*g*~#Pm1&#@m3HF59Eg*5uti=Er~9gmWj8jUL54d%P&11N-GJ~^^SX}V?qMfK+Rl{IW%geM2|N;dg|e`q=TBe5EWIMdRx`1__4`EcmMsa_IKyNRMs>Np_)zT)iIGmT zoBZjC(Bo{yw$>WrPd1v%E;1N(Q!*}-}HC^byY!S}21Wl8vn;^|c^x06DBni@YKg~Yl@eV`Y|)K@XizPosXBE=E^G1^fdzd6 zFFJkIIM#YbB|pN3NRp>Q6oQ|~`vo4_9n zWDV5!S4O2)94a?(O4zOb$B6y(n|dvG+!~PV7P&VEW??jE#$hk{s9|)uDA7J$q}@`- zMdV{gjqk=dN3nP-?yokbsc(dGrXDQ~6NV;2q8f2vMfs&sTeDrr5?RX1h8k?05WyJN zZ8CGq$-_%XDttgmim#>P28o1}?*rF;7ojl5A~A7LEA>&UbS=0wUZWsxXO*Lp^rAYt zt>?n2<-j@Ue5Q{5k49HpZZZ55tR_Wkr3WcKZ0>_k^$mSnd0o4B_2D~~z2y3w`QA~M zmF&eP8+W>I6Y%n~7BXdZTrBcfB%K<<`=SY`BDhV7&MO7mx9=ZEj5 zr_%~IPnw~l3S&kW3ABxwpF|OPPgF8TZ-}-3NTxRC#{stol6f=S>-i26TRk1T-Pl7_ zefE8j1fS15tv-zBD7kAc^iXt|>3+jpGQfmrPzv+T;yOW_klvJ4Uo=?$r4V`s!@(`D z_ulv7hzuvOo2u#BXnc*vrPeJ{Cz)9@RbJxJ+pZ{cbJ)qLM?8zC5zXhzvCmREJUBeS zcr;wNlkz}b?wnU_Ns47?4%#r^dSVqriY&&)m@qgj+oaUYQZFi@3Y}?FDzQ4MJ;qeJ;jJ;@GdZZBZCw_I{Ane!3& zbo#ZzV4pKV%59vxiN|%8s3+*EZRQ|@l2U^4vC!7$J$()aid2`0zl z^(Z_iJyLl2k`>rs?f5tHqY_y>Y66*55=r7vD&G^`( zW`wu=`vh>1jQ%ZtKgGerA<`I&>=;$h2tNmnKfs(Pep(s#rmT&XC!ZEJv73xWm@&qX zkHXhjG0YMH>|LDhRST2m){pSBt=r0~S%D7$l*h=j7>osnlj^Yx>bDjOYFa_a#j>O$B?e zljpomwy3*ImgQ$h*JZ@3fJed;U67K=Zi;45>GE4A5__uXC+b}LkC<_!5f0XCRU*16 zWn2mN=Vax3-=@5E=0vmZhy>m(mypv@3pb>=9vBpT?C^v|H!bTOV2x%p_^M^~D3+EX~k}G+nc$-WaN+L302% zR$)fUHyY!XS?BjtEz?0!UpJo;8P+zCwNrO2b>SYjr~*crr#hhhC;%498Xz^l4P0i!gY0SboJE#7V!d!lBtP44R+ei2n@ ziGYJ8-xI#~&^0~3#iKwm@l4Wa-*_w4oWV0i7NzG#s|T-@ysRai8MEPaX|q3_&B9Bw zOUv!@%*920IMIW%qSUKa#SY1^4MgboQO$3h+=$Az5p5jNFAtQYFj1WH zGg1@HLR{BN6PMhC<(_<@qLMJ&@;+;3YS!5oDJ&^gcl*<7tR9Gi`9d#iQ{)eE05W94&VKZP`N-B@2U?>Z^b8lo>l)`sL+Dw zib_&?u&K0;&up&k&HNH|Wuo+S>kY`@ZLzK|HT?AjYeMjEX|ID+G)(S&4Vj;CihHa= zE#dKDoZphw;vD$ZD+wk&`8e3!ja#{6_hc$Z$-Ux5xY+9CD=2$473Pt;QDnLDycXAO{vnLNUAp5~)_cGf;Lbx1HF` zo;CPaQoKm?jzS#2tzw4x=nq%|RielW88?jqHn<=MqAzU8D^-)h+yqr7U!}EZUAh){ zOGQ58@=aYvc+tv+Q*URKV&hlzo|{L(=1-~`5hMx1wO{_#VW^h^E~(bS%YK`F?iBBd z-`5*P#(H15Xc*9-R&QpLF8DfPZA^Ki$atr7*E3L26OxQZ3nQkEW210IY(GT=QmMbq z9Va$C;A$@{Elc>>MclH2$Ojj-%Ut4b`WT%!o+fanbNO+{Q+@{uj{O8>7kfA*BE!~S zBAPM3<(Vi4q4OCT0{<=0px0g>+S~)3V2q!#k8CV4WlA*sKK_#8S2okyXH0%C&G(sx z9kadgL{aI4PeqJedwJac2zI`)-ehRBXB+Zk#SDL^#|u@sU#qOWinq;yvR9QUXQ_EU zQFV1VH@f9YD+8>`rI-D2m^n`?OQ#TK z3G9DjH-P8S-{;c~u~)EF++2u4%WG*{lMtb+rfb|DxhII`ZSYC`?sE_Y`$2Uz87M8- z%*X55N96L0kxzBE)l_|H{5Be)T5a{2Ful zXO<+m68O2Hd*}>$$1gOb89%S;3xJ7R8gCouPiRR_dMJElO8Xb(+R5{Z=oQg#Mu`}% zKZ}yqbTdsic+?;CxuGh){RrY1aau;c?%oLMQ=*5c!7|RE^AQ{E@9bIU)q5)rVf{?B6)Qy&VWB9@n?RTrqo^b@; zj~Ly~RKx}S)ELYa(2cqDdhp&o^b#U7+q)Pd$*@ZyJ#V}CQtam4W^0*5dnzro#ISc1xx-nd35cni1twJYW;JgP zhoXnXLCLbIdPoJS;M-@B1$-T~N6UQ9!wyX5laZS?==p~phL)%hifi-9&P9AIvc zZm{hYpl0&w9sG2z)APdYG@PrU|CVaLtUeBdd~*KvCnIpw&W+vuWnxQfJ)i_kOE)x^dFxU?c)T81VFR8ICWlbC5^gvR5;2CSR3`R za~y;ag0*NV5&7d`IfLsQNNw=$KN^^{ohe5`*y6n_K+<^Oj7ztsE8|C{+=P?*8| zniAX#H@?~m!0<@ko~&^BmBDB9G*|=uIGKyt?(?zK&yZL~Whnfb@c^tX@!E!`CwKdO z;M{(Twm2bT*kr2p3el+|N9s+Z>mU06+{S>(98oH53f}@dC-omNG6lK1!fIXg;_6 zts_e!du1n;5XCMi=hE4wZAM*JgDm53@rE9mvo>yuHDUD10Sh*TaleTs^$*PdkW2*c z>FM338@uxDxT&Mu`$>vR2Q31Edxh?&2!Km%Sc@BzMLlRsPr7GzTa0PDoa;(Vj?!}hJ_5B6h|D8ezj608PDh39J&Qyt){HA#ki!^n* zzy13kl1I@%S27+!_+k^hnMjKp(oJ+ykpA23_=36e4U2SxFms4i#hBiG8P>`E`u<;z z3ReXamor18I{kWrL4!5G&6B}-kcN;Hb5zn7O|;zLV;i~89@A3GttU56QcFJ&ZKnOQ z9ZlWbP6D3P>^Ztb6dgV$}wo}ynf48 zX64x)`D9Y*F)YP!hk@n)ugf9@|w|Bn`(-~Pm#PJ8|$5zf&Sih(tiXP zmnf{MrJ|30o`_m zHoN`_?(;9e1O6s%TFotd@VPZJh~B*uEhR%o>4`;ylbLAly^z5sWR+8WsR zoRWco09s!xGZmfVt1>gTorC9#&4AZnN@02iK!UrFm_O#cL~=jb+X_3WKm(yU za*=FV$zFm5(WWtR+JqsekmJfZ&eu9`Itty8!|f2YEX-QHTct)jg;9H^NTD)C7cYO0 z_bz!Lk+9}Z<42+XGkJN9DYo!iWT)?l&ht@tpyVwelJ9$Ci~H8LPRyZ^b?%#1ulD4a z#Z}7}Cc?3EL!$bu1GM;z3G&cC#Tq}`v(^Q8(<3R2^a-8h4TJ_9S6^L@wkc{-mDAuA z8Mjr~)!PToG~mW2-hkDR>thI`CfbC!+3z@?TGR1%kxyW!nAI;c&r>{c2g%%ge^kEt zyEP+HomlG)E6JhBK5^&^O&oQZ!R@xJ}QVQ10p7unmKD+ z;TIXHt750+J6+ekj2jpJ> zMTkd!vHQC7zjGeO(^NioOyx~OLG_XV1>l9pW1{uZ+Hoe+oPst4m>bfDDi)$gq;9Ur>NyKFE&>5bwB*diT2B_xy4!=B@*5Wf; zu6$*$Y>~H(of+et-7t$t)kL>Rjg%C3P9Jsp1Q;4nMimaVo5Ri=X1dhs>qjMsU z*Y|%nwk~dNu8v2pCVkO2;CK8XtPx)v6bHPmvvi5hDqr#fbG(OqNA5DDCYSLjc9!-- zn)GwjtHkPiLLav1^KS@f?eEUWIj@{_*c$e1lXxCkN&dmPE;h?K!hb-iez&7HmU>{D zeFzidQwt*{DB0xl;g}*|4WQr!?ZvP44jqKR=d*Snxduf+dlQqI_5~KV*TBWlc{C6M z-FQ+W2&9tNSg*qW+73#tDHQYZghV24rK-poR01=5?Gr!lSnUUhjHXl9cWsv(ABj zT=8CJE+{M5afr@K=ifK=7vc?OGk~6+x9MF2cA`ZSRXG77um460^E<#|5Db>2;a888 z57ZY?h)fh<7;sIV1Qo;`Z!!-szD zwMAtLJxykOkl*c){o&f;;VgYnn@y~%0NJKw!ggHlA3kJcujqw=IhjIR-yRY(W^eI6 zYF`sou3`uHBCXEB4v7G=;Zkanu-T~=#KX)pEaTH$`OZKOC_0+L?efh4^ue~%{g5-$ z4u=l4p{Cy0|M<O<9+U4Num033aqb37zd5j6uzk z+^uFwR*fq#&LWa1-Hq0g0XyM^r|UW+7q`zMLd==i1v;brIHG)JPkft59>3x{=<;^I zF9NisB9Cq=^PbP^3Rn=$b?A>f9mzEW6XwLlJW)iX)Xiy@ETa36Y)qH8UfIRc(N>3e zl=trN=uVSor|P!jT;WS*_q*+JtW37)@qYZCro z0XRWKC2-5GTeBUXw)KR*`)O`7wWD6X$o*%Ce3p>0xH?h_6Y}zL`ueMzhi3I0Sy;FA zIm^YF-l~O`JKL_n+(gAm$Qq&%gJqcvcRrFyH>7s_91TM$SmwLK91;~XdC*iiE#*0q zq^|tQp&Z@D&tS2Uy8AogsPpZ~#dDcbdA`wmpa6?Qjt*q0j(Qe8+n;3?+-|WGz)?rT z56*9+mSk>l*Vbcxl2;U(yX7Y;pjkAw?t zQT2cVtOP53LCclYA1UcjY)C}uj!Pk>2v#lWDTyMltui%N6#D!)hgyol9DkSWX(;+y zuv1eT>(#W+(p`}k$|&_dSz}{@kCy?{+_0+f5~s-R&NM3U+F##TPdH&&fRS0~HCO^J0(JbBc z#=1jJkotCCMzrQklj(GbMvv{RFiB*7jG-~iY+gQ3dc(N;bLaeMw-W0a++Vpcz@obJ zoE*e8JLwU&M((oKN{qdo^O&%b;Z4(;l^`rC+nkYs4v+E@a0SEL&e|!>-W@X<-p^L^ z8|%t_Gqz&VSN*IYi(tY)FBmjZ4~*P+FB>~HPx*6vjT?^RY z{>wkh(jH8;j)PX;c6bR!qI;TgMbv(IttzWD4Zqo{f_!y38c7Tttqlnf$B{7RkPu*O z5v-V_HkR6jVu!qHA?EB_Kj2>JU`)w5mT>^&308GcU4zLrB6?PgP1S49%wj^VG-~>H zDl6^1>`Cq+Xpc=VvJuc2D3`~lZMLs8Uj)A&<>g`Q^ z_%eRTo>3Y_?L|y`a#SErM%inzj5ForlGM5n-e3*jOjYC5#2;ZSk#U=ElyqJ)!5r1H}5O zJR|+CEolma@30=ph*lpqu+SH3&OH_f z&Zu#E(0XJLqN04V8E1>)?(sM)LpUw2oiidBBi-i_(f6 zf~x@}lCnNk@<%{VH;bN3y$8aXA=RD~Sq5dUt*iG)k4+Mfh83l*t{K(nv+|7fW`{?6 zs}L@y>k?=s>p-=Ot29@V&d7Lxml_6IT_$caN3R`NqCbw1eL--dp9{es%gDMbZ?RA? z3JWmmBvRCl)oaVXLe5XSW=u>25i{cTeq(zLpgNh={Y6g3C~7HFGe%0n;OQ|6e3v~E z#PrA<*JOaW{hr^OLdE96?bUyR8z#ab@Z4~Gn=*S30iwESLJvM&X{fO1{iaD@%Fkrr zaQ;Xe1f#ej1sEbY?aJvD{eesY)^!Od7N

Tr`~umt5;lf?z^s5VIro`H-P%l~ge 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 ZAOB9FaQ^)_;C1{vo%?^F!*c$G{}-XHNrC_X diff --git a/luci-theme-argon/Screenshots/screenshot_phone.jpg b/luci-theme-argon/Screenshots/screenshot_phone.jpg deleted file mode 100644 index 8237a0368813d8d7b9c9db585e088db8c999ed06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467306 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�+7nJaJ7mB9sLzVyJJZ=+*$74h7n0@`hdg#0= z!;nM@&ZR*$Gi_8F<%q6f*LdfDdiLXA9x_9kp}+i4lVdjQB5_isNC^>qQ>Tf6udms0 zWp|Nm3+k;B@WQz3g6_=U%n(C9<+W4iriwQH*b`$9 zd-^hJG?HeQ@l{Ky@TlZ?w*mc2yxwznC#pL6Hgp6nKVhKJ|iu%6b_7 zRf8FCgYaQa1*s(Ku#o=Z?55Sa6F8$er76njJxrSMpmn@6 zXU|-V@#Ha*!JFJpA<&W#ymI%C3bXZuBMcLQ?KDRp27LSLG&+=SFn4|iozxmx_?;=$ zf&Jt);}&Xf^wD$nCg=u~oR%vDz00jHf9%XZwdoz_Fyr)+UzHFw#Sz-GNiWSN;x*fCl&fB{HET$#FeQ?ZJ z-CS)%R^q;UDuNp@m|ReN**n~Asa%p@DKjFIQoj0~NppO&E4vt0gc;V~3?eYc2U%Ds zxLA%@wHtry4XlzsP)YdCq%Fh1r3GR-Ro(`XbO`KJ+JVLH3Nala%_41R1tRI5+|lQ) zSo!=fPYd7o|9cwvzw@+ko&Jac>d=zEGvQ8PzEw7UIR@X}?KsJst@;1n-s?9UQxCNg z;^vjD9yG8TKPaBub6>@xu-?imXvz3$I2{4Sr#ZXvscypZa`_aoX3_pjl6E3=*!zUE zN2|Buq*h`@<6M1+1oM6+&D54YVlq*J_{hmdKQn^EP<}khX5PrS)GA|E-i&jfm~5eu zmSz;am%X2uqWY%`8v}Ncn8s_9-ag{IjBLS3gAy#n!`;~WzGzr3<*=DWf?1dWN?PjV z^|a;EWl|!NnU6CNc(43g#*?Eo4d+s+B!-e7o7uLzvQnI6nu5lF!hAa z9(1t79D~gIjf^U&(Q^r#D9Pg|<30vieW=h>F~VnGH3_!T5p*a$jknyVEpXokv2>X4 zOSpU5yVtiqc(?-;UqP}#>y8(^GUN~I(;nG@0mVJOYX0|k#0i_9Ypea0dhnsNRM6#^ z60-~)2sxqyices`A7lZG3WxwDO0M{MQA5r`s8FD8<+UOAWxzYrpOce0Iq%Zhf)i}d zgWWp}Yc+NcIV~YCy4hOCE%s^O+~{5~%f{*ILZS$$AC(%}EA1*kgL_|hoH|I;A4q-W zSj*b5Y`&=ZDFwH)b=``rtL8XOa@sK!8X9%EQ0m?kOXoeQTu@d8bQ3~gC?$PzoT8!r zz3LP#jAvSHHzaVMEwHO{QsaqVVF1L+1rQmz{c)c`TUzKN;wgZ#DG($GeQti(pO@VJ z$HmCLePrZVcT{kn$=i{5o@;`OF*zi*P7xi1@IcOEP4Au*5g_G?(_*+`RLci(`o+ox z$*J@V(HCJ_i8MN#Pvmm4uz*CfU!Rpr^Ima%zh(Bj_lsRG-!QoK&@qTVb@#J{%@it> z?DxCbjADXvcckSvqr#SONh?W1R3QFI=&v7eN6NL?jd92CK3Naex`&Pi97)(Is{Tgj z`^~#L=+up>^7~h}M?LI6LchW@5iISQ|A?`$x-@nuJ!-Mk;n~0cuQ%sEeEDfoMmlio zHJ`SAd`_UkOMmmmoxs!5&;#o?ov#g!KmMWJbJ`Em+|}6@|ITDOrF!<| zL~uKV7_tXtz-PZR74$V9bAJ5~CI26OuwS-m7V{Xa2#s*negX?!-wWa_XH3YxGfirC zSZkGiXBw%dt%UgpkAr{two{pNs8yx1QQNfDyBnWLVN{Jv2+JZfH$}u{u3UM`=e>EA zQjRAUs$6v1Xq;5yIOzS|K7Z(cUo+zTmx+T=%Nh8q&i#j9|1%UrwU8m_r2L%KW47nc z6&vRb--09hSDEQ+&0$L|LGs6cD1{RC7Q%IdoCnW-mHKqO9fEz-GR$ zO5yZ{^G~~Z&OG}KB{v2TA$yv~&kqQ}j0P(o%n6Ii8~$|guY%A0517dRG@a}@?--^N zCC6<9$D$eXP6xfkdB_+R9`5fSVkUJOgLXE%!Hh;5wvWb^VY=_s0(?rM5Ut?qEkM`62*`GsPhwvSDf+`p*hbQHWnh6hCVhP$BS(D)#Pv<%Ph+{p-T?U zYhmcy=vJ&D#4ObkO6l@2%k?KdtT!!##_macEbf6@c^N~~?lF)tu8X}+tLA8w_rRU0 zBqU_F$0Q)zb_wUtw$Mf2Tx0`VF)OmR>Ed4bEG9B@3JND~Gj!YfeZU>%m*mi8F9@zwCp@_Jr_UD-@7QM9A*I<8&sY`MFJeNCN_I-hjbX_qUbW zQ+EUw7+8*Y@W#QM?zePb${IvY*R%H=cI;x5nvQsVsu^~o%By@Gn!p={s5+7xfcID! zn3X_F)CkKZl|TxOoOoT&PYlJPXq74B97P0q2n~SVq(mm*QFQiYO4rNbjN0RF0bi?N&X7#hgT83_e4%dMN#4DwpY&}Q3v?8uYGw2@J) zsy|y_&9OolfcZ{361iNg>YwH!z;NF_P31aJCce5*l^Jnzv<_ zP4RN*L}zm!`CuJLLS=OT zMtbC59bY?+X<=6HiZzr1dmrscF%+82SgZiEB>kZ6gU79_{Q#hekjne?^o#~)w z^411$wp|J8F_9YRFLM(Sy^5`0t!Iaohf8}#7o$F@sRK8Jit4?qCJWiGR!#;cAcFgj zH9whxPlYm>F_^~VxB3E{dq8QBx>8xunZ^F9!Z}Es(quUa;s-F+ZCm!&5Kj16K&tbO zfsVdokA>_3V%wF~qJK)Zj8q>3?2O%#74C?by&l0<!UB9<&h zZ2%mGzu-LaF zBaxK({^{z-eP#-9M%ZJ!`iQNpE|;J`f-aq`(@2f#TZp(mfnwGi6r zQXyx<8(%Wdxl=;AYs5>dKR(hg)C$y-6+yN^Q-ulZS#6za-&V5x-Skm}^Ps{JwS6^x zd9-lv6}LxUvt?Jun_6q+w|YSgXE63_Zqs)r#sbfokJJDDryCC@_jf)MZq&c}uhW)I z`swA6>)t*Zjl66>Z~>=(`au73;AmRW2Uj~gEdRzM^lwbL zNy)9K=+PPGhcVv(ymc1-o&) z+8En+CVgjO(r`Ec$TF6ik3=zI16PDw+PqqCd)POwr2ff(<^Gfxdw2>k?rT4YT*B|@ zNPUYC^GQ6$4A{^V74u|;ubRE=R z4zM;~d1P+;FADwnfds9hvGuBT9$u~$FlK0?kYrn(C}CNDx%*;2M9agpO!{HpAIbOo zI%=?HE>G=BHS&1MZpD~NOrv8gSFY_TvBE#sS|nfXq8GNuUECIUIHZ}hg2^R1b8MxY z-lt3J65Y$hrv?~-=M^lAl1f;CNyn%$gE&CE-Y`Y4P84i<@9{!DQMc)q0QOa$)IyQ= zSeuSkJi3RnU`y32^w317W5_)~7GQ^W&np9!`(pJtkI7mvSgo%WQmszT z;Pa0T`HwC1f1pe7UniqLOd((YndG|DJfw}d_nqmY2kLcrIoc$lSXp5R^PW24XSUxh zU|-P{H7Nx}Q>5|y7|{to?-R1kFPP_^d({Z9K-ukt3N<^M+ZbA4v_DSd_98M733tRr z);I{_(`Qye(vVj>kZ+>h`WlYixa1nwUd5V7Ff%id^tL!EqfS!8%=r@k{mogtQcez_ zzzP)G8!!Tt%H*J3 zr!ea6RdtmUX}{IPMb_e5>|-(!g!MXKNhhiI`i182ACgl068zpq3fU>HR{&d{RMu6z z7-UFxvWH42TZLIKt)hXc?O5r){V%1)?`6In&_py}SKs#4;*f_PQI{O0Lb| zj=z-2?f>ej$yyoeV-&US^iRq_nzUJnMYq9W&83i93fXKR%wwk`n_3%uO86;_Dj)T^TU>ZleDmb|kKQuAc0{}5B+BrS`m4*mL=vKg+3_1G;$;1cz6Q6Jb^Swjd0Dz(`c=pP0 zrIz*C%n%*U8H+XJGlV!!^wtP?H$!qR-<}TsP&RqWXECs^K`U+VzjKk!7rV4K+oo|9 z-2x0K(W*jnQ$_CqIvZG*F3zy9-;`;VVIdG@AF z9L&4WCC9O}1%r>^oEV>cdyJ|GwZxHrzaU1(@a8X3_rSMA72IPCxX19d58ocx4oM6?cN=4b#q7c8@6EH&4AWoa*2ALv5<0~ zPJ=>hy}DQWuy?x4n6^p!ayaL$*jFC;R9|Y!xNf*bswRM?I=7|N z!C(T|nDljk(TOzeCeWpNGB6w&+;_kN&<{!k#!E~Rso0cBtCbHUcfVv})bY?g z%f2}EYOBNpdP06&g{<44>Chgs?9;%hg#gIdaOF%Bkk(jVxmxZeHV)DUc4Q92clJrW z!wcvXb0yL@+664Tu5twG-sm{1zii%7(Yr z2b0}zrzZ8)1hcQ=aN-COWo974VmHFR(h0)|Tpws7+;iKeX%IWRrCwt_rE=~ayj+&w z^quUAKPw7IdXqKMK8EQuyxS*DtfJTYY!hYk#whXX%qb_e=lnvx^?7qyD}L5ym+6BF z`!DWdtm;?1&O>61%i1Fh(fz70w-Jpb9+Gy{gQq!<9z`E%jKSz0zXjSmxo%Xi(NQ@N znEM35K*3Mk9Miy9)OqN(xv#wQU*-{yfsm;cg=o5h#+k5U-Mm1=lZD|;RkkDMr3iTq zTUP2jV^e^vM$f32MZeuU&apAlp3AM#Od}zTo@l%LG`{wRQQ9p7QEl+E%eRueBb*<= zRpJ6~o)k;C&E~}wj5DxgwF+TtKWATCuQDHBkSzys}HR4anOofdKJk%4;Z9tBF?L)4w&^4m=AbG@*9@ODx+x%|&yz7WF$mTJt15nZ z3r+eS5sp`kZaY7VC1k6l@C~AI72-A!`R8NgVW$loj2c5Idt{zj4b}y#vq*ugr1gLq zMP)^?pe)^a|62UbN$;vWbt@^7RgVxx2o^UH4JUK}JAiipC?&o8ln?Gw&swx+q#I7( zBHRcuz0F*2%A{w-FxEII6!LoE7mr8=L z9sI+npGi4%u%ujybeoP%4GdO6AiHN11eS3wlMOVzYS#dl%YxXw zYPE57#ZIw14ceWk85*mbMG>!qdi%Rqy{}ZM4XRVb2btH7m|s-LgaBWrcH4|cXy&P| z>D)5^mtpx$9Byv(xiN>smTzREqmVEG+pnt z&erRfcb`@HC;fhK5pUknVtM2BYx;ofEpbJ=*H)Q^ontGO=dE*u+UsqV-1Cl*9>WgW zg}c4g#X4SB<=(pfj8>Z49Z&cq$ll zdjwz4tOvHFEenYjzMcqq*O35i4{%|lno)7lx%N*`EF3HGbpI7z-K{m13CfI$yRy@N zwCO*7F$f8L+S3*>!(-O3AOg(5j#ru@sm^3-70s7W?DHfjcT$3rrhjYdkoPp4^n{rP zwTn4p}i6!#d|(XD~4a^B4W2rB#mcE7Yl|6{*88(tf7z7 z(Wrc1X~Z&Lo#LVHJ4LnF9f_Qa_HG4mc3$;bwa^6<@W#tg3HBWws1PfHC^2+zD*NNX zcc$?@d}5$n1f6d?csl2URSY7VJSip1UmOoVsSY|iHF!e@G5b|Av~pU6EUgMoZlO=P z*$)t%V|l5CXQigipUcnePfLOv7vr~2&1cSDvFDKEbVF|_h%&HB8H|CFN;~m76+|Bs zc*9kGkq;0Ey}>Ozz5scCgx%uTU9uiaM{}T`CaYQI+$wnozE zhKe=i!hyzDVzvg)X_sN!W^jSE|3Tc?%^#iQChwlB(e;fX#D^lx%q*SDZgEA7XzHnc&6+!ur(E8pQ9-(U16a^ z=KLswXB%k`f>xH`<8|~J$hY#8)})2ZeTMWTTw$)xWuWdML#|g|9%jNNW~qbQ%I%G@ z$4V5uD%VUW!UStr5ZSS-F4flO9WB&Q9Fx9ug4%^fC|{@Nxw!TVPE>@PHn@{G(~%3z zOVES`)YbMvbFlx*;@{K?W{U+Xp}h^O6}eUr7e}1??>jr(>V~@t_bytvW{idxz0VaG zm#d-!Cj|ZWJWp_HSvV&VJ6m zqYt6_g0}1Bf^(A|frh3#F9!ZxN(HamlEps@X+Q0=x`GbKPjA1|-S6#T`huY);zTNU zaD&OXxBp0Yg(IXoX@H2GxAD#}V+=fnR)Em&} zj6Rx8=^i<32r;+2iIv&-@+X!rt zS8D7pZ0(o#X>7IPw{z+&D8+_X;T!gJX1}x@(iIhml8+lRZAVMPGoA2NV&lB0Q&aKyfS-0sa-E50`OsJFM2#CjB2`tT5P$3 zIe74%a9t1dw~Z}{2Xe(*i+9(yrgMH;yE#xaCAJTHk*B2k6e|c(-JuOZIw^j3bQ>=H zj#3v2rN>p>n1rph!Vj{x^+6;+>Y&y_M%DyCA*8igdB371a`e+)z>1=ikKzF7!v`MfT0Pw^a93o3cscOi;RAb;dtE&O zHj8hH)it=du^QN$Wa<{#d2Q_0HyEu+Y^>vIN15@~b_Ltl&oC>hb(A^Y`IeJ!X0D!f z+Ic^pNOj9OkVBSpj6~9~GubzP;2w=9+rTBpiYf)=0kzJ=>h3*xl#uyY^)`Ja`@?;l zKwssPVNx%{|AqS`t8k?jFoBM@gR_F}2qb&MTy~~?m*shW_2{h%Zax~tEHh*td1#l2 z#a~OeG4e033y0)ee`mVPn9scP3|d&zJbMQI&h)ZyeuMI;YVYh}t!nuQ+aG+|5OH90M>5UD-py`i-{w5tZ^tRz;8)ydE~3L7%p8)I`kcn(t;x4%@K)@A76CMn zm?aCrIDadA)3R<%sHZ6s-5Jz&NOLu~$EjV))Us`lB)7NKAwQn2R~K6xuS}Zwx=HQQ zk9OXoFtWzvWEv6N<&HBFuU1Fy889@l()fhP`Qm8N*|sq#Z=8xW&q#(h>PixPO5bdK z=_77s{Jp?5GzSW(03)2zb6s!*Aajdo->&CEzj{D?K{GmYTpfpCu$ls29ki#nAnT4a)7OpXHSAHUCvCrFM9g@|llLyrzM0H**w#L>> zJSbnHdhh=tu~`Q12;jk*^GqzYM-97+TOLtrsVWc)UGGg7g-ss)IKpkUx!M%&KaBLgt!wbrJx8Y62CwXhtp#x8+-E8zl!UTbxFasqw)9S^iV>DuRwqN{YhK z=KjZb1%9qn{Q+3%5_E0$G z9vW>Yb5|-ICNcY5-}IZ z2+X(ALzav4jsy=G{%kCjAtC1!a_dk9+7!UxVKI<=L(9LN#(uj>y9Ps?=Q{jzcuQlp zVKejkgQV+U{~R9!rRt3+T?Z`z&lSrmh^bbMXcWu!maP{H?Oe1lOKo&q4wRb61Ub{C zOD4z(W9aG{8VOdknav|h^~9^qJC_y3N3Eiw+P2+S%ba~CyRc3)MBNI$#dB#kK0&qD zmMtN}nsXhQh)Mz50sDwR(>)zKVr-C+!lfg}Oq>NN;1iNGK9$SJ>}D? z`8LR(E$glWHTQM@7+#YsUWFH7hevJqlHTTyNMXn5_r{xs$~vdm=%}ft@jZ(R{H2>; zC*5aqTV zx7ERhwOUH>y^r!c4eM@(Zh;1@4>P0ZOBAOgkOhX$(p~S@S$|;&mq+R2xD>Pvlbp=y zu39U&&S3sE=|F?kV>e3Nc})36bs*3XM!vn3QDzFO%T3?z2Ql-S>ez$av&+#VHW*RT zBtf6<56@Egt>b#M+6jo)t-Pbi|wHs{pyv$hN2m!oSoMhPJ@ykA621*>hs#lpS$k=7r;PEPLfX+HDkd#GUc+2%@Ejh4R04eJbYLadLjKO8x0#xe1w4jDFffvKrL+}Wg{JN6cQThBK`{Y%uh zvZS^;xp&b5z{}0XpaPuHyLWQG2*}NUST0a#LCPtbU@I6hBPtdXf+(T~MQp*v*@q3` z1Ja93Sfs8U>q)!o`6DxZ24GPO#@n60fEw`3*r!~VAGOPf)yvA;*%c#^t5Iv6v{uaZ zC`4i^ThbB3ck{SXEu%Wg{pD^9Tau?%6n|D`uCA!BeExcY#8tZefcpJ>@GGI)+c#_D zF63!n?26c+bz?tTHSGqEUv-`7S@tofYLpRlEmn-x5vyqaGC*{$NV_3tWctb@_KA=t zy{ei5e1m^~gR3T=G}!BOC*tvL%xV}weNabT;f8wLJ;5&(Tq9MbQyv`7CZ&K;F`sec z6XimX>1Efc_v7$)4f+j}iLIb);Y=ILl%>Rk=wP1UUl_u zqZorllq34pCox%us0m#X9?0ss&>`2SpkP|5U3Gjzvv9%>j>(o<7G2@U&4SJ@yDHyz zW(gm&QRTbx?bj_%R*HY2{ok-XwCeRs<-PUSA7W8Q#ad2Bt{EpC*Fib9NNWHsRSS}{5retVz1w{C(ViXg)0SAVX$|&oy@P|`0$GCsl37t@ z+gs^-bvT~it8p#&u7I?)larB)HX}Da#J#RMzHt1Qv`1+Zd0r5CbsFB?b}z zRy6}c636Tt6$s@clXx8YUz?*8bR z0w!kkor&>zu6=Q}sdVI=EPwEt+P6JLg4Lv=*`$#VxGJ%EYSc|TQ@_N}UA{o3T+=h! zmus%Tyk@E@Bg4$ZRSzN%pL2w|=nj z#+DISW4_vHJX5XkH|l)avTh~1H3hsj`kP^PVnz{3-|I{5+CYXhkHFXN=aRsEM96#m zl_S+7042el4%92X{$*s%uX++@m*IYv;F>X?j&_Mci_!KW!sI)6`~w)ps?07d|J z$MqZx$Q^CPmwbGn(Ni#;{vkg$`(D-S)*!Za5x?M`e)2hP&z27%!w*U%d`7x3<~X)> z_6rWiB8fcc_a5BZTGgX$_8#C``nxuYLPhjh9G-W~Exr?50h1!-4iBJ2$kF_$iAm}h zkf6+JeSH^907#bCNlnI8V{z5)6X-peWg%DxES=ai&|5L3(Swdj*1K88g_azIN1T^X z)Ki%0uX7sK+H#V?OFCLq!%B*JvL*a3WK3Upza=?#q0%?)l9qq~SMX~@aNd#jFx|Am z-Bn4Wn{qZ2kL8Myw#*!p21FNAy_L$y-e74ECk+-4006&CW^%ocYHd^`GQ^uNF5JWmT=<2pj6_a}IxQ0hPYc z&6)qc(8$3uZ#g3;&n91?>HTKr$BikV&52-bS@j3&Eez&%_T`MSMQ3PTE-djIs}l(E%U`NX#kLRij9%W~0(K zb5x5fN7X3PXom=X@SKrABK7vV8+g1d48&GEnGu{LWu2SlLBg}y*{z7qL`CN{F7yvk zZsErQYYlD4Wu^p;C+-8g9g6AeUt0p?bhXpGo#JlYP70H8>_t2adm;oK0u}UEaYRT} zPFe}ybM|9QFt5)p+MBveoF>7_)P2WsdKv4ry2R}&b=le?EMFdQKuG9`CyX8n!PZv! z49a!Tl^&AbZNCV(1K!}F7!0XAFYzsNz7j3<@NN@FwS)1W_**%8My``3FO!xO_|>9t zyoIW8r}!bQnoQ}8ZE24!`SPC2%OgXs<#`@?{Rsu*-179X3h>#O6xeDFYsirO)x!sG z!U@@w1>Toyq;ayvm`r>P;ndQZ0VY%wM)qmV2+<Sr1^W7k?wcJJlGKFmzbk@CTm_p%d;*8!UY3}y zM&}z9?~Zi+aS~PD|Mt@;%<+=*J1$3UI82hE{ioQOOHrw?s?DQd^@@hg%c7mo3X`}D z|8H0TabRf7?F#D}wpMr9j>j?Q=BcRrcP1a*e&hK%%)JHI0Xs~?(9!g!+??;9{@wB-m%ZL>Pm4Lj{{2=QF2CjZ=mDt?= z)4Ju4@!}ub|45MY-^BC&PMpcq7HF^w2((#{K*vL?bVF^vMckLaQ{vN+Z7$V0wK+vE zn^FJH#I(7W<9}~_&s%@Ec4SKQpc>DQ7Mt)3of!ERaIDAornl7OjGyKzu*mmYwmMG` zA4i;`ub8$_AzOh^mqo36d3;`?s%lH{WeWQEcTV95O4{$ zK^xIaSX^P>A$Bh>&i!OJBlZmjr|5n%deg6MHs&CB>CqVPOs(-@&GwD42Ae$nmfZ#m z5N2XBz+;33Yz!tuJ7c+#S$*GP_f~oq!5DnKdZV;8GID2SdigrH6LIirJ50^xU4Iq8 zdHwt|Ztvohn2h;w=u@nkxi2zFPrdy`*po%&86B-}_rq7-8;IvEWxq!_AIc&`Lwp*r zN8HEHqW2%v!ZOO#S)sAIgPgHGyPZ0CG{w(-L!90tKE}Kh&pRzcyG4zA_)WvoiKB^+ zjdEV!XR@%bw8!5kI%Db)f{}abEd`^tqAZxNte;<7m^Mxq)cleLm4)S1h|%3^ZPe>9 zSefM#QWlW|BZ?90c;(gRnYC01$8pS`zf}`B_{2cebA1zfu@e7DYtr* zjO;KsXZQ_8bqSoib=s=CMD;+s{8$J z!A~(E5S45~D&;7Ud+LagWVuo`0$^UAJ6;;Dg$DFXcZNU6F&R>G(AIbGcLhp}-Q60K zp2!tanC=udAB_j<3%u>*4H`}`jS=8CWI$|3_+CY@7?#8XP;zO1lAIQp0S3HR104O7 z?8XEX6D0eN3&#aE<5{Uz-lT3a$q52&e8>8tM5JpktrI5ze3+oDh~okkVP5I!XUkjo zXb8!DblwA+RNPA7CqCR!%JiCN&cp#?OVK0Da* zBj-P`UsXrVv!wX8^?h?u3nM=4>dkx@L%OSq06QCs)Zu0+l&g;qn)vPcC+f_}E=vM=dEk_AB^$FZ2S!MXOo5 zXCI$?3TK<~{%KE?f2G&ynnRLO!5^PTFwT>jIR*WA$)C7J{oSUz2PDOZOcNc)83Z^7 z8<;)I3dlR7SuoH*=~$=gAu?89ApT~&iw^eTF~b+uCk<&p10L*)#_L_OCTHHb7oL;1 z;Xl7RU9M;~*d#Eupb`wlCEet_L$;ZpVL+X(7%6@*)!IU(naGA-tWX(dqm+L#_@Kf8 zE<5JfZMp=P@|*tWsPs>>_fPBRbTDkz^*N_NK$8LEr7|3Js7eUA2a^{Lwk}uh4C#EW z`GJp-^yA)vwM|gtqx54W`o?PQq6>HSTek;32h3&Y;Hm)z?&-)*8sUA)@YCra12rjk zdOv#@9j^yUDitCxP2$|~%&?fWA3 zhVzLY(1&en1c0u2b$v7h0x3gcvvya~3@)x}&|JTjtC0x32!5ry)=e{Lle_;C&Nfv; z%`x%4u|+RDdNrClL)}Hx)vuW*P!5!rysd!xi~aqxvptTKE+_+>oJ$|smMuDKs^q)& zghp&smDcMi)k9LP%8H{<(%$iw@bot$gi(FE5=*Scg81NEV42FmfZ{g(U49A$_m za>Gr$b8K%`(Tp~EuikX;32|+VK~TXcCbr1mlOS{Bv*`flucRzZ3B_3i$_$CpEUg7@ z)Igx99VMf_gSKUN-9DmAKZr#UwxVk%FMp2;3VfjRgg%|EAz6Jzy2_)K~jl~yu;~lr*ezP>2p~}U0)~6 z_2XaOQ*FmIDi}SUe|?VKWpGKo#3okA)?}p<$t9(wr(B?IY-O6K=JrdHV+FU|&fa8M z|FPI80^stoU%zrGIMxg!mS+&np8<=)*xA{omp{Q2FBtFa*k|i^PwZ|qR-&gh@GRVi zSUFS>FkTt5WJ*3)VbSpcoScyN=exD96h+laFlvskv_JNE+Z7#Z$WL7Dk$ z4-6zU976n{8@`!B80^HDyBP)}l!4Ab%NAn*QX`$Qx<2~$6C7kbWMqAQY0?g}meod7 ztFdSG(HX>XZzQ_Anlxki_v&mv)J&9uo!>>jpK|D$P%HM#j@(_8(&E=rbiV}}O|$qI zFwhy2h?k=n=$XV+Pzy1PJV&ROVbR60JJZqgMR|%V-hK(ZLFNH*DY$A=q0QWWR;%>3 z0Y-utvsmDjoS!|tc3M~K487;7KfG*>ysD94fO8m}Pr05kEZHLp;+K3EomKO^FUmE8 z{e4Ppnc|^2Z_lydL?$ed|BFkt37u>f9%D zOC>gC;e(4P_)1i-1M8Q=FBQfz)YieyYe(_J3&pZ`ir;I^r@DCx;j%!N|3ueG_P&wT zE8o;CFI>x6(~t8F)X1(a-RxNZl2{V!7(`g`**mVw1+56egzRrHnd-i^>bG_%B z{g2lz_swFtgq!tS>-+tDeWK&d1RtYy797yM{=Pw)O0PS7mX>1f&+^2VKX;0rX^#)M z8}GgDdPs`mVjReSN!c5Js_SukX#S>c6!hcnR=h&dTsl9J-2iAN?dGU15Wnv+Y6(Tw zaH$In(Fd$)AU32#Oz>ee^F{(vnFe zYlwF;=soSdqFS;QzPn)XTVwej6ub$#E@?)cP(XYY28?+y=NN?3pk)sG9xM%x5L^e% z%)!QHy;3NOk*TebQ=>N)(Mt6}8yT5m13zepf3lVSgA74FXB$;;yGipd1bk=^V7blr zmXI}9jqzc*E%dI5bMHeof-I96r_%hd%Sxf~3;q2ZR+wHOu%izsKe6+KYvAr5(a}t%i)X$7YyMA6y~dMtAs#|q zNBFV({G8BOUDbBlSCVYHAXBda(jPpJm7)(%;@K_S7unFe@gM!_$jg4mCvYQCumokta5vY(MLs9i{Y-)VZDtH*yKdve%ZKM5-w zTG56r&a3YMn}lpO^?a_&TQh;iVi+O)>lUX>9BrCSGbF9nhQ-QD(8eehuhi+1alUbVwx}Gi$!!z}DlTo|$Z1*XnTp2ll?RXzgyA z^>f<^`7^U!?Sl2?HDLlQz+YFJ+tOZtr()4*jDNjO;WywElX}m~G;9mKjaqcm4#sIO zi_Egxgs-jcF}b3@G5#9+^OsvJ^S|_;Bi{eLXot$ShnTiQjQL@d*^bk@T{j~W@9iD+ z`#(D#Xm%3|+~E?Md|N_>J&a3$C@}_yZD+EVKC43~=wB^$H4dD=?W-JBW_6oFc{U3eqt17@`rqP zwVt-a`4cL4na5+yWQC3njlV*@aUPTty65mEirclHYr~Vq6W7<)3wR4dDV51WhAq^f zio&8DZqptH7jO5}5)uu-Vuj(_f{NhPcwc{%8T`iB-XgCUk2S~Zv?JMI9sQoulBP7J zoKGYB!B<8sSMuFFuKO`dbPgJ)8B~3w#>6Y5taRfzYXJ+xIx9M@1phEnTSJl>UX?`U z(ajVV%d7EYI=w{0VyaP3qizwlD1(5(5U^E7o8#sDVj?^Q;Na-VBiKGTufCoa zhrvqWg2aTy-yY%R%pHh*3qk@PUL!BgDhW^DUp6(72F!-Bs1>a0jHkLGnUY(XOS-1k z!$#R+kHcS>r3ZF+^wItQz@sQ@5MDO+SexN5> z$MEa2ZyiqjMo@8VnmOP3O)jGnm7XJWycF@;TY}T$FP)--MyU<+PvnBIp9fm?IXp@S zo_MvGcR)k)*dkxZEUb9_4%}UTI9ROuRimPB2=b3b3Ke;cG zUe@g{7Os6ZrSih^_jk1fA%Ze^ADlIfwehYQo=#AONL}=3J+FdDlh9v~3k;bbw zn&wm$cHT?vgt_HZLs4B{HVlRyt(G{Mi&tkFYoHFTSCtWhLB{)VsXDBW9I20)RnI!QWX$Z1%T~nY*OnaU##Y=3nFY2?%-8$g@Qvw)DZD6$XNH6cYuTUrsb7kYUt9}@ zTb1wOV#g3CMAbe(f_mvu!C#wS;#ub2S^DHzLF$+h5$dq4U|oV# zob6*0diKZ8!V=a7!(PQFh6B)CCw$D7|8YUa>6AzL@X~pY{=aSE?x|n!t@DU+p()q@ zZs5Pi;J@Do|F8Qj7>3&X9$e6hE;}GCbwG3HQSA0lre?^7=e7 zoEY9kg_a!jx4b}E zr*ur7Kbl^03sXtKK=uRK5;tL`=dmIy7GY^hoC?rVL88j`(pmcL(l>Vc+8WZ0ReXE3 zoKvv*vz4kYw9^pbsl=O+gQQ$X)$vZJoin% zolQ1}2#&^`oyb;&63@4Kl(fZJ3}&ZU6GA%e4;SVcly}#TKEC+Un!n3{AU( zG^WM&oRz+M@M%3`YO3-?c?Fzn#oD{yc4lgMHs3s|{pR5ROE1~t>BX&gGR#s0uZO2z zGloWY_W;!(Y?uU9L(uA=)2Nr@)=dse{?z~rN+-HAJzXf+K2+ERIaHgSi$~$jY++a_ z)MWG$iXeh??s*GX%N&yF0fYD|s2TgUvae7J@jJVUliEkW9B}B440_V|1AXQJwul)R ziegU+D2ils~38zUP~d76%9fu7ijsllHrw1simMw>0yPo6Go_6?fU11a*n8 zvy2A?mzWS!xL9K5b+2$6Z2M<=RkgO}C?*@su5scRV$XzOWd8+*@vC6rKS3@3Q%PEX zgIZdy&wf318v1&MKDK+SD)M#VomusAKS6ImOqS3PtC@MTg&Z4xpjT#wFU%f|!RHBE zxH%|E#iLL`bIC6YI*)f`J_dS>1gk%)Fllm*x|~cjZ0Tw*9A-u7I9jbu<%GSze$rGj zU#_OH{jI%##u7Yar5mkax+5wTZkz2uNnJk1Tn%-yjN5!v_veL@ zS;0j87FAe|Uj8G$cdwwem#;b~@iFHZZ zxnb5PLN=OM_nu~ap6h7p+G>yiaW$kl9TcgyU_qtzP*eN8@ZuUZ=``Re&SAc< zPj20>ub->GefyKlUC-c!iqEDWymHpdpV#_z)!)}35fpDrWp}t4#e4G44HmKTVmS)n z>bxFUPK>1F8QYP3sKgqeTm8rWH4lMa+9;r#WP)YX;h@n}s(Lj9p9)m$(eP@=R$*p& zcOaSWZpSjkjQG8c=a|;T@l|Bw*Yy6e!_OMZA1eTdF2w+cCu4rn)>Gn`z`ZfwXrNHR zgrbPOiBdP|ss)P|)-1WS{a&$Ss*0=Wyiiy3^7V?|?vwi@rr90}RKC9!gfR1-_mb0W zg12>>_t^SN&}Zc)DKwS&4my&x65!r*(SL&(Dj{oe8d$-W`&{6$>v*tPg@|E@LtW|c zOmBfsDab>G3RQ`Ema|^?C_<0W<*|<*Px=HFX&QGkh?6$Ba=0Hha+)?Cs2zBHj~ zKb76n)eg%5>MSbs7nRq7j246)I1m(OblFLm&!`iUk%^eM4yrN&Z>1?ec;_*$bi#}> zmy|P<-3G5DEOJwCHpraa_ppWrAXm<1y*}(UlAJ--SfdF_w~c+UYII0LsRe@_s0nD} z5>|OscBX1y_AT{wwc{7KNR4_7*%;=YQZf>G${6n-OFH;o?>PU%?DF#`GEfCyIkSSEYJN%u3x-_r!|QJ%U1bD|qUP71>?- zAyNvi@ueg?QLV8`!&W_XltIkiuq4Id`Y1i~Sx2$C)O^@jo0{J+=Y)KTCE%C?ZD|aj zMVSVobo{y$FPa}xOS@`#=PPluwaYR$MXl;QN_pLS?x;y&gRH()j@Ny%Qp4Sl3KO>& zW+UF-LTsAH<`L=^ZTwbix>Sb;>aS0W%UnYnsVqy{+@X!X>)|S;nL|}XfGR$+I>$B0 z<~Irrg>4{$1^l+#FuSfD|qCeKCy03DT-6SfsTyC%@eKT zx&jwCRb(UUz#%jA3cCWcemH1th4bv!I_Y%ICydnYJB|i6?dD^?_Y@FMUI`0dmp2&D z*@>nl8OqVt2Vq$FGG1C@9^md0=VQ5HD~2q#D+8}m69a5-v8mPknhwSe@A#Frt-;@OO)FSPXo6AX{U$cV6-_aJ25|^pawg%)4RCy2u7f7j&gZPJ{Yh z7vq&idBa3C2n&PPW$#yR1U>Y%Y%^6f0GE#Lm-**1k|=%bfZiC6V($b5lSj0bUD;45~#ya;;7_&WNoxsK^Y zL-<56CD!vL#8ko}D=m4pdvtuiODJ7T&qwIb*5`+XOG(e`j&|RA zrgi=(lXz+~7XIC*82uEnC1yT|T_cxxEYfmP{A(^+YB&@fWcRiXtG@9s7RP^`$^7l$ zhiZ2wX8C)qlxzX5edLFon$U%V6Kf`PuJK~R_qqFCTRzGUg(B9OAV1d86D%%aDSgi7 zyu3E*?ERtP+*!`qO5fREfUJfXSRh;OT_)-8I}O1GHCEme=>GRrfQG}iQbdhv`SG;n zI|DBr9mIWk_r&zw^F~DQ&}*7J|E~r>jL}^ zy9|zvK8=G4!H%L{`;uq>uJ8Z;*PjB=hZ^W^QRk`}dbh^WC8)5ErrZtvF})!Cx9!XL z$R1?{g0QggHa$0yjg1RVTBkAtQazql0kwc~XW^&0GaLC!Q58ggw;b9Xw?x6m>jzq_ zuaS>D{XN~_IoSDjDZ5W_8IXk0>K%6-giErCBLH^5LUYBsd2q!qpL_e zDl~;@&VVpIR*=R&FT~pw_%{2K&UCYtYfftv(+0Qg)Sjlg$EeKfh>2J)?jjKjTphYK zWegXjqQotrIY9>NIbrV*5{oF61{QP1F#z!VhmK9z&RDRy?b_>kFC&T#Q$vo)+GGj~ zpdyVqJQ!@fK0uajwAIYh6rL%te!M7j;4}aH!@)SJKaBLkVZ8=nTWe~ra&KI*;q5(b zU9u#Yr)Q9#Bt1Cd4Z$+8Tm}ywyQ0wTUPDixiojeABaU+s{d>-PB;1&gekKT9IJB}3 z(xf5iU=Xqmi6g+siWD<;A7fhzI0lCz_yat3C@N}(CpItOMPwYVsDh0X+>+(Hh-Y8< zHt8X^*PM&HHzA%gUntfO|3Y%}JdgNV)%U62IfT=I?eUy)INB_{C4bqH2vbrCQZ4VvtiId;#Z5WR^ z2%+{XU_Hg#rBc3X#@0H#M${FMD{PEV@xCXpKoMZh`SH!W6yD-O6}`&U{jiJy50;zd zuC(`g>)8FK7#h1bot-z2zP8^$#K{@y2B#tr?J5pYmr>b(yclxj8kpN{5lB4@=BqFa z>54PZ+cDNsb+om*w=***)YgX!Cb=G)j{DJ!+K~GZW0E-p;o{cttnJVQC?s#PHO~cY z^qDTXj!*kMySabBdYNM;dtyPgVQ6I&>XtE?qlII8X}zEQbzX5bXEe|DX1^mpLA@q} z#S|j-G$jI{t1&qw(OYVKk1}9md{3#A1}6LHvd6&Drlp#PeOG6iG`X_Pf;g~oS}YHZ zRlWJ~otbPX(@(Y|D^bdYwt?4`V%(Kk(m`{!E(~)$D<>wZLWF~+Vj5J)Qg8o^t9lfy zZvCaEv@7+&O=T^=JFz!8ic8hVRvs#Uf(N^yAozXGe(q(WI29pu#Pq5;A z&GYlJcKO@GkoH5{!OWCIOMKAMoJ;YKf?x_D5Ip%`W$FO+}0W~Onnn4?u-isb(K0c-V zat(@^@UcYvr<&3R(fVtI-2r%_#NNKWUeS}#YpzG^cid})0^7|CB=xHY@@3i`V2b|4 z4D3pe8Be@zGAjBlhcs-w+LcgXU46}%WN4la17zz&PFyi$8iFpFez9S3jL_J;lAP3Tf&#^v z5c-_wanroeg}C;R0L{?Qtr5UBi;QgttF({lw>rruI}s3VV|v^{e%p75u9Mbd_U(wj zr~I;C{*P0B{53SeG4LB=iuPIBb{(CrH0$O^duoV z>~l|VG$~ipG`Gi`seWUH2wZ**{A$B`!d)w~n4TjL5-$4Z1xZ3F{TM!$I!fe%y0@z_ z$!)=23Fb}PBOYcJpYot;&NJ)0stcuA7$J#6mU<$|lGBWAq@!aR*EfCGcrO5OZSR3X zX0w9DAN!jp;w&5Fb;5j${O39ZpVW_;ubbacY>~R($aY+*u-4y)bIC4BXGh`%tEx8ahHh%GhD;dnMgaDuUPkhM=)Qp8Cz{*lT)JDnTHw$BJ z-in~FZ6~=uR$LxWXv+CoyW4tVvELTc{vCB?#Lj!f;;hR4fdjA1n4WmoGHU(V?I&q@ zchZ0Q+Qm}Iq-1{T(fl&JejVvh2PONC=7$AOo{QD@`q!DMY%YXkImj7XI?J)CFw}Jh zWb;_i84vOzhRI!n;W*abvUEC z`R*4*v}?hfk*LlhrIeMSl$0xUZz-9zNrRYE+1TP$XFED; z;Td=h0n;UFf5K8+cWH%QM{&@P)1W&KCei_-E+_uW#;D;TLHjY8FUi+9vIQi$d)e&Q zsUBmba}Lh?lgSU79jTrm7;bF-E(Fd#HHcLI;6|l4Llu+NTw?&bMR{d%oJN+m%$+@U z3zZF64o|#P=|q_`GXZA%&kNjT2KN@F%n9a^^e)lzdK^NCfuX0wB9{B$~kNVmdlmqX9DG( z3srCLY`TIM$?CFW4Dz(x+3V9>67iUQ1Pp>R{FkVh8WYwdJ4R}}Ok#DBYhdu$3YCVzNit3FJk$JwL3BBPOT-`r zSx1mt3>5yTG&x+%q=7VCoXy!BO$B+nhu>0{jWyr5sV=TkRt_$k+Zg6(U+V#NIRI66 zj&t*U*??8+mgWn^=wSYpze@{k{~|5a|NBy}>3>mLD0pUS0uaFu0oSFTKYHcH+==|S zYRH)TV>prT`=61I`V?A`KgY5Ph8_$>Vw`YmD+YAGVOxdwwV57ba5D@W8w{!zqo@pz z4N}3@DAJ>&qba@4Jke+hWlu*hV9Qwn#7FBDmLG*D=&(Lg(|za!2usXBqTUI4D-wq4HW0hH(%AcNl@`Y!F<4n&XOkU<;a~t?ncqF%^|KvEK zpW|!pLR`xxaj-eFWtVmD3-hMc@Rz!b`w+hs3k|E%-(2~phFB@uRPjGA09KhkRJ)nn z&oZdv9--!u;Ja49gwn-Q*p z4HTSYe=P*$-mTl^MHk$m8jr%l2+)w- zj(nLjG3r;38~p|K#^8?TZeCxHb)A*Io4z))eQcYLX3pZMN0*augfbmS9uS|gIKPwt zv*~9uRhyRWii))W7y|IAWkes`!FWRxpa8M+-NE~CQsyk^P_|}$GWm2Cgaa2Am(8G=@E$dq`2%*WsW>&FA9V5yD%0h@At zzOgR1tpNStKGiIJZGde|m2Xbj(+w3y*TOAzQ;eChQZb5i9E!J1<7JajF}F_dS$QO2v13?Ky?JA;6~lY*3823#3I zSXsAXf)p;6gmb}3=4DZ{n5JNwqH6WZehDOlw(P_1iF6LiTJ%SXpZb#`i#X+|6vk79yrbAUU80ER$TJ-uzxQg8(bzFe@8Z&|7@jIzAhJoWr}q)W+68 z)Q$M{@#9>K60~H+*B(+RDX^7LWh_w>HPhZ8MY?ZjVl>#Qb^8?$zCAMOsj;pgb^vuR zUqP^mTw(g&*n-wry?2%h&m-5m=D9D3Wo*if6XuLS(F7QF!^qgG&Ce`{O~SHdESo6M zVg!lJ?B^TYS?LW76eo6#s=vAIX+vf4&`_@LEqn^b2Tl5C1t;MxljaC-4l3;h9{#vu zRcXGXt9gia=3`c+a2({jUox@jY}g#L zRE}PlV-f%~VE(SNJgrL;RFAk&1)D|(9)h+(P7d#4g0$d66f;vt9HTJCcmF`p#xI(b z2y-|}9@TeL%jqIZk7YVr>8;0El#$a``XY=$z;2-2LYCo@8bnboG}k0Y#TK7`dL*++ z)YxIxb?GBkTn=$YAR`J$6_q2{PB~QQFaou~y#fU%jT*BS9N;KaMuNO-w7-b32!(W_ z(mu4VX*3j7Fd%WsAO4t-i3fJeFBUhJuaCRUC8?O@e* z0#MGB*QQWO$0}_{b1FCCt{bIJMo%U+-nR{k6m|6YTN)qP(*j90VB^Mz@{ z1i;4gB39f+@Rjb`z=JD4UbooU$oM1AI=XXLeqoN=>Xx$IFLFjzJe8 zRw2Vk<;et&OACLm>#R2`5)8M}+4cY9x-KE^p0oIOI~wRcgZ{74ozawp_JN@p%_uTD z5CR74GLyq2##eJKB@P-dV$MxaOA`ri$bxThzt!azE?k-wn13;8AzJbMKzqOt`p_S~ z8mcJeHKH`{Tlff~bU(7eJdc+7U<+F&`PqUJ9rphChvUEzZ5?|2%06tYe^n8i{TyGb z^Nc`eLtuT_ID06Y#(@;XPV{CSMZ=C+_PXuUjsdRaRA>y71>j$W_MS)kGRQBrUZ*9# zP1Y80=kBW{7eaRN9zp@D$Ln|Inx!fU$N`*y%utzOZK+M1S z#A+0lMz>HnMv)Y#a;Ug&-|<=A9L-IkNs*=T>$(=bqt&hmy>;J34WC@u%L=!W@9)lb zdjfQqS+n|$eW`4=n_%9Vm29E?0|0+l?Du(%c%8!^_t<5uE*1FhTa-;ETN*GvlRJEkpn#v7h1+DQ7nPG-;x{crpa;TH)w&}XC=ss#q zCaEJNiH&*0;A%e;Xqg63jt$6`<4Z%-6SZW;ozw!XtR0udqp)(zY_E>*+1J#>J_ElB zn2tw3t=RAVZ2PQzO|aumywLb+i!Ij&3DQ-t#NI05TRHnmwncQ|mg&=3Ab}e1*JNYg zPO0()RWaorDOQc%%FdiUAB||(Rb0j-)|CRyVMon2c5vCo5U?;|6%`h)jsddJQpQyN zMfY7EW7zafVXv1G>DyDRY>Qze@s{Y`RGTJ#GGO;=j!O4K9T#io5GZb(56viUkZZC zp0P@Kxf5)KD>3ZVN;cgyvEv45o9}752FJWZ3%VsDO3*F zYo}$w#^(b$)6N}SN`T53F*;f@U5e=!jfInc{jG4OmgV*}caYWl?h3fU)qO^sgp})@ z!6!2!ln!$K&X+Y-V|-bA!V8b<%r{37Wugj*>B}sA@BAUu=?>N{1CJEX*$Zzw8k%vE zJH8|ZE&bjmPF-rM?bLuYug*VI)YtVMDif3}xzAB)aCrG%i&d>&lGY7sE(F86xG*`U zwBJ5KTemSE*1Z$Uu;if0si3ktB+#b(hAV0^8q3v#W0)SZ{=tO~W)AZ-EbwnR%x?c{ zYT{2*ou$hJjU5TFM{cR2TQ@WDtUi(Fo6WR^a~i}oEYI2;EH!lSaHn1>;n!r7oXG?g zzaQ{W6`Y+>V6_|U#-P%Qy!ACB%d`lO`vdtxHpe%=j*aCSstf5Ng zEeWJU_gI=IqIdK1JC&E5q9gC_K2()={78BBbDln^yff+OebIJ)ZIVrS!*QI1ht?BA z4N}h3n(lb@SZpn+IGcr?eP)(p8-uNbs+`*8teYtpw|&8GfPL5mpUX_A=fmDrAKb0c z)}MI(c3scx7rdf0E0I$FE7n71t~D~EMfCAIoXt~|B&A0*W9vA)AnXrCUr0TEEJ&(! zgfuRlGv(HpAMCHiZKvb4JhyD}X&B_4spv|GP4#BNeU9Y#y02Go-{ky`CpPjR?sWs< zIYg2>f~56ZLz2UtYY%_N1+(zKelcWy+@vozG(u0=R~+S3hL5Oasx`Q8Z0-|NEXj(C zNO6A+XZDu-LKBjs-6%s>ty?`=>sjvG?(0UrrL77R2)0EFV})+xmkAonMDt9i0#OsS zX`@<^vtn^H&27WfpI)G*sdYm1Z%xM=1Ok zrFuT&-SVVcWfdB%o%C9od%+7Rvx5GW{iEiYMz4Olt*!j*5XnVPZwC zCaQSPC)@}cEY?R^GC#DF@cCu@YN+F203m6+5Wy~&VIDO&{&-s8CC2Ic%W>DH zdV}tJ1?WC|K^sLRL1H~!80%pS1~r0xK_(21b<^=O$V>VcJQ1+T_gpRdQ@yg=5)OCT31P0k;c+IF8@&4F;qJ z+XHCMttw(+3JDK$e^oBpmfHU`R&p5iV_$pX5@_WTLs0bjh&nj;);G-IfabN(UncWg ziQ|{yRWtnT+IRHdn-=}Gl^5$4A&*`=&pzIhWc(16aJ$@HfY2BH(&*GxFhc8hPqP{D z`kNZ7?VDF~<3zsV2U%7$3>rTmiCTC6-j`R6`Y6lVoBvZ?VLN#3_SYA>1a-+V|Cff# z|Jv}a^|UIvdJAa4&h+B9%0?Lu=9qEJ4&XxjRefULS3E5;tN!+fr6f@3H$rw;zHYG? zFvba343wy%iruJuGA|m%nV1Y;eOj>UDa3P{x2MFIdN^*eP)k72sl5y)*W81eF)^zl z=Fqt(5HlP!G)Wz;FyEk|GFI?ef4x3K$phf2~j%n8?QH5(w)+My5ONKXP_`UX`f;Vl&@b9FF%0HLfQ^2_iY7e{6dE zaEl|T&Bt0amluGapo|E)k@lLIn_6;eR`s58=$DM`m6e^3bagI5F%~|pF^g6be_|{I zpeTM09QJ^beku9{ovW3Mx`VBcl9(b;LengglDcff`ip{2eB=f7t8Vu0D?38ay?vzo z@`i;yFu9TKvv^rR@bKDts=sM?P=Nk(`&uj?CgAsh3ssb}YKVx>8pfXP4D1u0)N+El z5Wza*c<(89G^md)V>)B{(~{>|s#mWv((LbAM=IG*k^bE7T{ z7}AHmy^bGo1^^d0e_XIZE{^OY?i5>ZH9nk@2gqbOr-zDTjmTEft+wl#gEW{#htz?O zmizYSu8j?o4Pl2XJ-dgcb2iH9jOrG5QR*))jJ#F#xd!yNt zK6!a95qZti;Oien#+1U%gY5-JJ=-FLr+{<9YZxbTbOK^Kv<^qBj}uke&cVcowTpRx zJN#o35xhBp^B?PK50G&&GN2%3hJw|4MZ5Y^uS1%Ok8`bc``S~Kp_c7or3gbM(qD>$ zXyG(R=2JNl*usfPp|h{)$I36rntL$+qL(r02ui};hNN0xq@FF5v%j&U(69OOP^W`> zn$008_XW8HgG4VD!{^ewWiJatW+{;*_zr>!r5w=QH2>bA33f0W!Uwl!n&fa}j+=4y4Sp-c0m0y zZ96@zZ-i<7|Fot(W^-CJW)`Zjb-r^La@RArSgKwVNbJmY`wV!HF&-masMy`o)ma}p zx%fuT*mfRz=%yu;y?x2r^x2L^w^pxBmB@%ynm)#JpXX6g)sUj}Gs>=sQ(bq}92!kZ z3-oqsy8|x^F#SmZmTy5Bw5h9!1$?B`7+cM+byhNiGP6QyX1vn!K-rivm=&+rZ6?Bf zVJsM^(F(<`OnV0p`J^3o&kNHR z{&zijdEn`hVMDIzPv2W@uWwv9hKndHR=KiyEn*IS^Jv`>A(|uCmrG8fJzq5CUgD(n z+!qSBKjRcSbi6_93TgET1Jv!#|2A-WIkv;DS#eS^KdD1jO~mfz39y&_^7&$x;G4hC zEtCIiK*<+7+902%H^i{xU%#pK4e}Xj|9Rnh?3-S`8_g)|{B@z^=HrDCI|hcyqXx)2 z+AX4; zR;o#oKOiGw2qYbPjdwJmVTR7pV-99h1Z&6%$PF9RAkF7r`A$EJE?nag+@foKj?b^1Q>NDT&$gFXfX;-?u-|e!V3`-(*S~?GHn1KnzteGsGBcR4< z{mb9?Fuc3o-c8D&0u%J%K^l zovDi!;|L?ctL{mC(9ZsG_ zjXx*^Kb?TY)V`$#kf{w@@XDTo zp{&6HR*iG|h=yIhWl8^vr|y|aTCDjnL~U}FWImB6jYq1E5&b#ACSt_q2Y&il9Z!Y&)e(6Zuv*h{LDaUtVHO1y*>wTWTu5#ayHb{O}LS0T(Clm_mH2BqD zb9@UFu2NI5ool}RJ?Cc`iPgA!3do#%NZ#o1eq>J-{mz*pp{(CI(i5y>)K=GbV^~8( z1DF6FQijc$S-!En!Ei3@ov>ZvxAz)pz$6RN%p7s4cjO5en9q6T&n{k5BR5qZTUHpnFi(4C+Z$XdHYqXZqGSg7U9}c;UiDg{m&;vy?;Qi_1T-e{ptaywgv! zY3Hc(#80K-$`@Zng}X1j71h@Um6x*odBHq@>0ixT7C0c6Uf-JvAT3k3BRxao{^F+q z3zq)zk9Pkv;i9a$k^g5qHrq?T=mbGtn0X0If%`v^laXKvR> z$viRDc6UW~HB5vQ(L-WA1tFh2>aqFq6v<;((RLfnEDQ?#tuMpq>44MPKF{z3u{auA zJj?&J?73}dc~4s4_0o39S+*?3!_Im;yHBh}nC;_0|HoGRhax~=&z-rP)03%;1E1?& zmWW;_@gKRgG6ioe}4YuKpZ z^*+#9A{qI_OKgA!Yt*YLv9ZoC4_L+|qj7SBeQx>1-zC*0L8zxQt~xq;BJZrW)AX19 zBf0birEt44kNU#GGwhu>!R&1Ol?@$Mj#m5X<5io{8&5|e)-P+hxvQF(YHpLCObXMv z7dF>#JtRoB_No-~Kc|1hS5>vcSbTrXpUR<6JRDP%lUhhkgT&?FL#+7QXoZY|-~;Y} zh|CX>>jrPkoT?HM2Dtj!`U-hb@otV02eHBn`;IcG42r&_y|dqBy^ifiu-j5vHwPI6(gB^FD}vI?F~01$CrZCGI$-SKURd-TMc$D#w%5AbB_#BNB=QcVU0r*%^T$IbX2jlJ0?R*RWUYnT?f9mTtIql`F&$)T;#o1QQRQwNC zhgV!zT%yq}{!As+13jjaN;4a<7Pike!-T?w{qv$b$NxY~m54q+d!am#&J!xhfXRf2;Bw{l4&LGT6{8+bB6h9$5aBI#_ zSJG>+P%WOtks4Rpc00|wOO!nhn*i&1&8`>N$K|65&u6Y3TwBY8!}i^O8*G`1 zrVUYN7MY&3$6BtX>1VHQ>^DoR=G5kLUtG{gD8F-R3xhhpot=c4axL!)>JP^S{qc4T z2NQEZ2lgy$*m7s=Xnl0s_QEd3%yN1&Fv)EVA?=BbS-V*DMquND<2E8!t{^mEcxJkO z;o#q#jaX|56*-+&0Op5@qs~x`Tras!nw&j~DY9(mk{gf+7OH|_B zfVr#8;=4Y#cucqYKvnH(dBYywJXQTJY&P<>{DWe<+j_bclEN~d+qs#RpiI_uT>hUI zZoG=AH_eFmY?~4c6FUCoOfF;jVE*H!YH#cLDIGWFO6yUJ{Z)U7oA37cq&Ie#`#$q$ z`;Y7A3-P|Z<%|90A2<4cb9D2M20m@p)y!U5p7Z%EetPjiz~1b%44rk{H2<*Wa^i7j z_MU*v!9dh^Lt(#<+0Q|)2mf~TGvAHf>mpsa{-pxh-~5*5(&gnf zA8FLiX_sXhnpTn1Ar-ZeWejCT%02-ai(J79&+|Jsqa6|=rggf%sj1 zwl4oVk5szCQ*!Z^fM9WO} zM`j-vVV&PPAOqV~eUFCkz)~~XzQ5loFIBr9gpo2POI-vsdQ^#JdmP5c%Cl4n(qKPg zZBiu61K20+ahX0~k2=RvhcQJzA>GDk<1s}npa0tGa%M8v%$$ZTn?dxLLBMSw^Hw8D zJJccaR!t2uj;pweLm!?eEE!*flVcnHtm0)qk{v&ik9ISSJxN)q?yULITw?FaJA3L9 z*Z4X$qhPO;WNQC5TbT86`vZWw;Wvv#GKbzYwy$P{^n#8?3c*}QkY)YEGVxk4P!Vhk zHXjB;z{5cEO&ZXs*B|Qd+9t=wv9cf8Y^n2%Y=kVzY7Mk`QWF1YBf*9|SHFf|=%+WI zP6YQjdJFj~hooz!oc1v5w4RQSL;80Q9{GRq88xN+Z*|2K%VYUYDn@X}LQl^&QvXAn z|9ucrSUNU?NuV)n*Psga8nxP?C^qPh>~~=O0FUiBZ@Naap}+vycvFAoJ1J1G`1`=gVVUB2`HQ^Gx0>% zcg7Xnrl@10vIxv1HkZ}wyOoK#tWZuTDwq6txiTBnx4C1vcV@tT4L^C%h)6)}f-t2=8f*6d<3UgiG4Q3jLPD_O>Tp`8l<&mDaiPv@!f;#z0ncVcWm`oZX{~}m<9Qidu&ln^NNsNHH9yPUc(R}{$gzt+Nx|c0DZ1TdXzrRqcF410X$igeYC#BHdJjq`G^wE@ zHIzW;y?2n_yI*GZoHMiM+xz{_e$TtV-#Nc?@((LKE9+TVShEHI2k8k_Uyl_;)-Qi$?BECMLec9LI-a} zlF+95nmd#(4iJ>23q_9mMNf3P-__5)XlqnS3w`RfY4t0$+UFzNKLp0j|3neIe`X_? zD-PQHhfqcVRXIk-qMR1*(;*Lsm4@TzWW!PB$fqi} zGZ|LqK!mHf5=H3bap%f)W;XCCOqU>ne~<7D&lq7uprhlk3s$mC-7fvCH|**<{X zpK!cA4j+f3_eJf7dA6I1!GciOml6^_!U2h7MaD;Vzl6y%OtyOQKg?#y#W+G4%s}O) zMKfk&6GDtJa*=F7GU?qGuy~;z3?S%r|JUQ?G*QnCT7NhQR?9Fxh8_4RjS#qTe89+6 zEp%Xwp>Zs-fy$zZVzSrr0zKx;pVNt zM-p6}r3~OW*2Mt^Cs7sg)-Zwd@hPMj1t@tu{sZ@AN-I-~Ze%=9&(a(2C?bFqjOrAC z&l;Zx^`TRQPB--Shq9?r1Nbpz!1~m8q2HJbYdu^Yj!PG*f@I{B%?p#!x*d_b*5IH$%`w$li(9^ zLea8EqXy6>&O|O9wwHBaLTalFtJN!rkk%(lDaSiZ2#{`TI+n3xe}*d|TcjghH)$E< zb;5MX+D=j}AxGwc>Ixsv8GhC#`8>nlY9V?}W}cIs&p~hg-tS$)|0&%*JPcatR%6fLI*>cdn!&X5seZC#F1y0=MJYBWhHeio zi6Hd^pdgU!7*_=RBoP*GtqqYex!bCg|0$iTLN!EEBGcQu{RvO`L9a6-Z`2}AJAN;* z`0zJxG4JbbkHzCp%;>GQ#l*BTvpW2mQC?3*!}~f|Yz9WUZv`7Qa+TwVbJ9HS5dg5||e_lZ!PU5M%d}*w3!u_#pdR+$mlN8JjYSsR9W?R=Cq^vt2Mu;DL&fZK4+*A4 z2WrAH3*y)nd|KZ3DBd?w$^}qjg(5i=ADtG;yTkX@gYGbPyAIM<9;U_hrYBQPcoBx2 zpXb4oW2UDQaA*}l4WI}}%uqBfBcB!;GFhQ?%j*4vOuXzC0{!RZwV!A?$wQrJim2;*)x7CRN4jGQ)gd2@s#7AM-hJAgK3a$ zG(Epmazf$-W)Va2i)$e|a}qKmgmZZn{*-W8RygQsH$LXlui4HwO%ie0*e2Ex0iX;6 z8=zD7k=FYWIdn^OOMlplCHEvM_l zS46n^To9}r7mwtO`My2UUP-pQOccB>3)~ybKPNBVSvrd=STn5*Ul2R1c7V!!M+wa_d#d0;dc?g$6}3NEU&Mn-dxTMpATK! z@1sLr4%*-x|G4$DzZP@xlODdh^ldt;&p*mL{$KB_qPY%%Ybq1edgIHvQ&N8%ne~V7G;AANlno@&)#nracyl&0RWCo=`;h$c0Pe5(_k6LrG~^QouuW4^v;LL3h{j`z4)e-ij`Kwi+V0 zL8PWH7*aMR^~#Vo0~7vcga`XY>Xj*mx^4WBb>l_??%JB_(9LI76tKRuT>Rg!-)$<; zPm}ijO!eV)t)&0eF97@!SD!oQZ=v)69<2S&iVuucRdRA|DvgEc%6yBOLoc`yn43Dxykp@9;$J!p6mU&%Ln) zr`By~$O0bH4g_IY@dSjgUM-%HtX>Z(Gm6u1d%TuEWb{0U+$%$z!fC_Jt4uaeWG?hUq*jQY`sw@UlC$n-zzyEQEfBFoosKvZEj_Du6RIxkVeT1Vcz_2RQ^rw^sd~mZPhah^YgOuw) zj%{iQ3HwhRS^(pT6h&{1|Z@(oZFW*_V4uE*Y%w;n64=wLVX3r2UbN7EnH7U?Cv zNF>aNln8E5o^C^6YUg9pQ{>d=`pr`M+k4^o& zmjmdpV=5`Et6C~O$Zfl9^wp;$?+j`kngxXlaCM;eiE@`l5KgNv$0OsmYA--c zoI20x^u!rz&I(c8BQ@pY)(aCdPht)3p2gOVVr>Uk~b4GWgBlfUO*8b?J)q!xbQ zgB&L6E(wk=Nb>M%58c~`z3yztK=g?W`Ziz&j&Fya2Z~kj5rQFfXu(mO- zcJ=%wkJGh2R_#ZJ?wj-6-`jAYHT*zf?SZKQha5V&d*(B*@{8ANOMDOAKXZ*6y5k;_ zXF2-EeCxiX3vYL-pZw$9N8DeMKXXcQn7Q`-q_hGZGjz4EnxoyWe<5Xp^KcP-ZM1Lz zmdg&{tg$N&qpRiJi(#sgdCvx=(av?7wk5fCZ*RTR+7A|bVik+eocE)1KT174>0H%} z$x~pN(j|?;lu8q614EwXxh@Thtm%=>N9}TZ+cf?X@k#?Aad&P`_jJ(U9o^@4%Z-x+ z5%LCs(a&4phj&(s%AP-azDug9Um?C#945F%vVs49Kl1NeF>0-D z1#YmwL{wn_$e)UeZeJobG9mGRvc-~BXv#8XZHqi#SzcG~xvhdK^G4i3M@7IiNj+7p zQ;&|4)L>tTuVV)N6+cnKQ*HJGlAhCs#m2asFL|>$X&Ww4?xVWPIKP6`{46ek_012w zse=!Vzn87-9Q7&p*~6Ny@+j{rk;s3w+IzU(&@gd@^h)s zXMv3xvGkugW*cKfh|7+Sn(q5oJ~$g4qj!w?MDrOB&kN5XU%`fR_rr@ip^)IJVU4_j zLitgjJkuABk#e~sD=&);1QW`2^W>FDOV#b9am2{L&>UN9js@m#U&0kQMj zI&MzhyN6B#bU1!@p2>|q8~(g8A9>Htw+GZD%Sd7TR9aB%Fn$0up+rL{*kEY}FC|;UWax4R;gyWzC13z|8%2~mY zJ(m+CQ#(-Lhkaafb;%u%Kdt=*vcGb8`;x>I(rR*hJJHGWXW!dc>wUf|vz|4Q)2EZb zfcbdg&vJ8t*84O8kePS%?;n?S*i!x0&lUUhU+Tsns9jG9Wp9c!t183#BBg$Q&P;pU zmy2bW=bDrzi)K*J1nH&~$&)OXD@5FWP3jGi+r;SK26wikN?aCJ_?`Ov8lMf`c7h^Q zZkXGge?jkLJ$$)SKWwh3d=lcDDn$u88T+jgozceBAL~KzuaMgRM`GH!Tx>jxg(%Ut z@;kz8Op0`r#QiRsAIMzO_>+&FG>eCgB%fEnAj0^&@BKnHD`}UA5=6i0e&RlVN|bC> z9Yff8%{Yo?FlfUEN0YF~xxgTL^X^+l9VV>B5-ucrDp{V+dRwXXeec7j6#2*#dPJMJ2tT9YgV)kJ<}F($rQ{j|XRXuc2zuG)nzON>dTg-5D7 z|FIWiV$ ztm!AxTC9U8{>>BA>CdsbM`D|&sN*v{Eqexlnqtt?UU0RUjU46c%xusHCo zvaF+Yd*}KC&0RKwutYlS$m-^V2_s!9WvMp14R?K5%9~W$vGM?APD%8K!KZ{PCQ&Z# z{0HOx+0S#x1zaQ{jP<^!_wL=(=0XXi)T__i&~!a=xe|8e#UYb!)pG7UTvKf)vubFU z;BAJydVIq4$6ot$>&AqTpx5kg6kEQ>T2=c=X?2jpjnnQ%*rxfR$=vb7Ego1LJW1`? z8R>6$6_10czk;GaZkz!OS+m??>rOi`wSk`|w5AkQ=a_uE_kZApimyNDt8dP0J~eHw zGj=CtS^pA78Ip1Q)3ke8K;;F>r^!N;PTjf-O1j`GICT=jE64z}avUt#O@eU7f@@OE z#yUiI^7CTW>bQcS0k3jMD$)l}KI>UzNpm2c<=_@sV9YJ0(3orXB9cd>WuU^HSd_lH1FxSG#e1V*`dK+S|cRbBd z<|v)85zfaUpq(kcCWL6tG1Ez^5E!+!s;IZMRg$yDEDGhNb6`wDm7SDK!o?n>SLX-b z+xg%vkh+#J{ESuUBI2ht&3xkOzy#HdD}}SRBYm)LVe#vnS*LX{twNxBn8V=uC=dyv zp0B*8bAY5^mM1^b_aDkHxAfE+N@S8N{4%zeJJw%ZO<_^(c&KIzWqf2p0#TAV)$CCl zq*K~!Mdp*O_RjDGRz^>}S_G$BygK}h+NGXp%X4>-Yqx41FDt=sRBG$Kf8PO`rI+`{ z-&*z?GW8?Fqei`CTMfiJjabt4=m#6lxy!QpEo}AkW%XxPf)|pY7D0<- z?LY8*x@`u|@f@J;!|tzB!b3vX$vq}6&{b|xu(-LUcRHY`~pRcphH>S{5l^`sKY<-s@;oX4H} z_0|0z?q>ip0n0XOx&TTIHwY!Gr@pgUy@^T1)=woqL&YIloUX$sLGfABPGvkQH1nDx zce2>|SbFoSpq;23WtGgt_OdHS(#iW*84Iy7b#j2~`%4Y|@$_ z=a<{EXd}oq$0_3(hRe3B8v4q(lR=o4Jb-!Jj%G|7s8ms-^iGC6O(K@ot>J)gXuBKa z>7x?yb`1OiX;d&p>-Y{fSa|MAG0Y>xv(Xl9+Xr74svxa)1o=WND;$z-X=RlhQ2Nj1 zbq5p;ib|R-(b{!(#dhOUlrskexIg!Hp1EG7e*4e8xu5LellpBIz8b*V0rh$JE0f4w z2TRfb1N-{ioOy@zRfO{TiJe!PmwI6u(p2~OB=J|jL&19Zg zsHV0=_giaFh~(gG*QC}DyudNH<6iTk9hoduR=jc{oY8zT5R~aQvr!KC-CSn;Jp%F< zbNOFjo&8k~8+^h6z8dceUC4^qSLV#HA4*ZV9Fj<6!!rDK16IxbmNS}s+lF6BE*IOc zh?cuMtm+{bZ5@_9i5RiwYgNJ7g9WmkpF)R~RG7L7Z}WFx9Zb#QruKK>!}{W7=+CRo zqB#t}vIXi%To6-MO%(AN%EB5o+A`(c!i5&m$hSa9t33q9Kap7NHJ)HF7WsP0gvZgR zlO{C#iZs{~380M)%V1oc9pibXz=mXDC5*|eB=>mGOM&F?c%u*#>8jKXvj#y$oy$Vc zVsFbY$wsbrPCim4Hs2l`CTs?I>x6l31R-d@8Ye9E+0Z{dc`5A<(jKG?Y__vq+*)0K zQ0(g+WW+%=SzB=>-sYlBwb+x8t({O(#y{S!vpJ5yoSq(#%;t!8bp$Qbj+V=GGJg$m zUEskL!L-(^t{-eCO+cm*y&o0KVBqg&*ftg3QtH8_$rO$UA^C<{pq$K9RA!Al)>rB@ zY7#rd*{Ki~&6iFVW^pYYC-L53gOkGBL5T(njd8LFTqcr1;Tq!E80w*t!*@d}Ct!Vw zUUftr=hjz*HvVv;S=rF?Q?{bSdD=F0GMOkwJ|Ef`{oVSP1|1z|_lLThx!{Ql`LyJ2 zI4WMpecQ#K`8XKl^dt99E=8>=lk&o?Rf#RzZ#+ z`F6c-AID2^@Wgy<*9A*sFGF76fEsfw4(}^8s47GxT3$$`ys%{j8fiFeJ>>ZUy1rto z_2FOZZ=A>Gd9glt?BuMnsTe^iV3qvtI5stNdeyPC_)~&4*?{ z>~M_o(|q&SAFDcvTdFyn3iYLU?~3$CE7Gv21cE107ZqCc8SGUF^Im&FIr4%<)ZUV8 zDvI^C6aREwIBGunNUWX^an)uepR{;SB`z-6ZD7MS8(Zr*Jn6h%I0_CYZ=5jcn_-^0)a1|xkkZ55~PFPI{DW$f^3zsApZ<(& zHvM7Hrsty!*+J??&)KqqE?X+KXB0mZqogy2dAy=(e>x5cqJGZjpuE9&9=#TQZ+)wL zQl&mM8D>5)V%<$PUMpvtjN+)atLOnx73HPpAvDCxNJJ9D>$-&UkSRM71aS*1bUIdR zf9#mQw(fE6vrg>39iOO<*XBr*U7no#By8=@fm|ufqF*0l?G_T=?Fm(~?HAo(Op&7G za+Ny%W^reH06^>b1CLAl?GVnBrMp7#XK3hO#X27P-(gtad>*;tB@)41=leOFC75Gs z5rXN0JR64?6qpP@CSz=(;b^LR?BUoouYBOF$z3^D?k_l?kc~{mx6CXY{%-G|&LB@> zYBF#voV{s$sr@+G(uLX`9yT)!I>a2V)+0qc>wTzel8%Jdf(H5@jUsS+RqQ~-x;R8a zQc^t$ha`yQjJ`6Y%h{MsZ(M(zb=4#FwSPOT@Vs7XGH1oTY;bXz9hc*Erd};IynBvX zD?XRA@N-h#eB58rsGW1+e2FFZ^!CmY@cV(sq0M^UK(BT6=m*}*E#7U5s}D6osExxP zc(!SY3s}{NnCyrjc*_b)Kk&3${&Y7t(8!fR+ScF!P-lH_Kc*i?o|Fek+c@>nJJh~n zEN`sNIVN74n9U!&s_}*W{jBfj`v(8O%XE!D5x8!erqMg{^h2p)_Fy^aE)BUKc>7t7 ze);o9cKwEj;RDwzX=CCUR=&lm$LnVZuEWza1>D1Nty!dc_>l1BV-B{RYGpFOvM;{BONHJ-a)<{_>tuX*hM4Gy3eU zu`8@!^I!t^)e^1(Ow@k+S=A0Kz{@%9AhY+nQc3ViSg|H>?3e9GB+r7JYg*{R0*w@Wown}+|$v90hu5@ z4V?c@w<60vFj6^5_7i)<^Y%|?06Xkrne$>cvoDqI;ls`l;U%T21I8W7>br_?F)t5Y z%LaE!x8ru4V#RilrAmNTE_n579S`C=!4lavxmR02{}%QaH;3BayE%scg=hqB4|h>z z{w=`-fujxDTE}TuuFmvs`Gc2FYsBbs^c0k+7Ns5uK2FJ6&|RRN@D@2JsGmE}T9dfP z8CtK}E2iSQgyWD0$(Em<;EFic^A)@12G=VolMHWbk&sZpcvjzN2+Fimg*YHo1FJf! z?>{x5upRIZZ7Y|<7q&1L7LFJ761tOIo{pnriQs~sWRlPwS=Rl1;^!+>Cf0h62b zQoK3sMB>`9>i%XZu2P9{Pw%->Ts34uf4fy)>^cEcROA+qBgt%5th#IBU1fWW27j(J zK;q04moXjkv>1$0&?_yrDENV=hv>QPslMmAW4}*>05_3fc~nMvXQmgm?Dn8Z#=z1M zYc}}lvEyCkbp(BgaS~wFeC|<){vgS09?UYoBR_&{$XjoJyb9&ye#>PP9W=3;ts`(7 zA6Jk(+06_E)kpA!T^=$k*MVt0wJX{ffOJblvu6hH9pm^=~^8{Tts+gg6C zCwWu4!KOMlGCB}l27?vR2%K^&oM8)L%ydw%>InDjnvzxH*^fk-W{HV(-Uis)gGEcL z{=3$g;=QR$^wflj7V_#<*XF>9!|F&v&!ex%(QXFGwJ8(?tNKV-^gK;7oxj^JQz$Q= zZ&@qTy^iYC=V=_7SgOMw1+U4ckJ_T=v7KNQ zdsbCv3p13aV!hH%Z)ZN3E^eT>iSP?3Z0)seV$NvEpnoySqBnm=yzm z7Nks)I|OTlcSOJk=lD`jvk7`{SC{RB^vE)%K(KaGJyCz-n$?exfao`+I3(I;M};d} z2o!Sw?1t(&jTv=^-p}sm{8S3W{hz#^p!YX<536t2cF8i4Z}p9z`axzK z+|egob1Pe_wdfrBJGN`S6F&6qlrLuUx+3}>+0Ay*66lOPY2*;}j7a}u`_6m$;Cp#; zkt7NCG((lYS{*TF^cNFZe$i59h%f~6OF*fx9D+^FN937m0)o5EV?5&PA9nrJW7wKZ zI4rvCG=02PnPf_>ui$mGQJ|povM=8;yD39*X}kzjKPj{;eg@(+h)y zDhC2pn;L;(@7-rR_3A0owJ90BFWyqq_~stIJ69_YznB`4DgPU`$e;Ib*dndJV2ein z$B%WMUypT)-;ecQ+2DRV)?E%CN@Sa4ch8rP6L+{m5zv#?h&E+dqYFs-vpvDltrV1zL0_<`fPbcxVdJ*}|4TiIF1@ zyu&u7AHLf|3yV-+OOIs?fJ(2y;d96(88Cd=Us|n)U<$5J*6L_<00tsRBE??<8#9a? za6d-0aT0s0iU{)4_=!8NCMvj5eJF)$|Kx*jHWZOF@H}$0aOU2bum&^LlDF(^$8#>} z!rR;_)lgXH1{|!3zP%EIxQ=>Q$A{z?qvFia!9q?MJbF(`0Q3zIa z{*JBm_7IrL)GX~;ex(M`EFqgQ`16;e`e+`*J2sTFIlxJ>K|VT7_*=gsuCr3fndgEU z{p=c#u%eI*jSxM46O)yPa3sD{lKwH|8A*=qfj63lJQyDbq1fW&l zdcF8juZJnRJjB&(jGt$fa?N5RbrY7XbqU(`d~Ks6VHstHF0a)O|F$&=4|bqU!FkeE zJoU`f%zG3hO?bvn_^Gz4LItaOARbBu9Oj({y*t(xQ`HEKrjlwUNB=D)u2s;kY?i2aZ#xCd-;OHnhppyu#(cA z;2`2!vST*eDaZ=rkO0aeNi(r;^hA`ak&10=UI-CdrHr=3Jt$5p%-r5w@xiW9=%oyV za^f&#=&yRTiCRKX&up)Q!*-0L?CU75;W3HSutf&eaZK5QMBRn>``^Su7>LJnQv7mt zoD3E&_N)|0oiZU zS2Q%gyVJk_&7H3HAGp&&fQzHIvkC^`X(7dJ2OLgr|E)GZcGH{n8*90 z)6MuN|M&u)Sem_WNB=Rg)FR#=!@MQ_<5mP3+xN$*C7aNfZ*JzD5Nw9gzgfI~c4O$` z!!ao0tHTdGO1%FAhNcFqR`K)iy?j6B;rD9MZnVRb<#CZLD^WL*~T~yqjxPv+WN6UQKcAE0=HfM(1%V!Tmw1aC%>w zZ|0a~rvwR-;y|Co)jJ=4;5qdYUw2*9ojdIYvi{CD{PSa$Pk%bm|7hO)$`gQXIbS&l zX_u;o5eQrQ%t(lwD!RQm9$dSA)=YP$qUrlK-}m}g{QKzW&yu8LFIElT_;jiNV*3{F zeqhzvTl+NSb2H;Y)A>xx$1F<)y?Y~BK(#GX0c7-T_tLJ%< znyJ8YvYJIr8^>x^mYmo<<+zM!6q#0V<{?{TvUEx?w1uhRzBWJL+2*=V(_*)vF-yn~CfyPa=JTD0GVCaQP;~gIo zKFYY*e1`7OW7n#SCNeP4J}T9NTD1gK$to)-v*MZfkuMHqWnTgAvP2f3)g@#d-8!J6 zUnah9STZFdrr)n2S)(5pHDqR{))Lw3IC%l6#Pxj?+WQk7mvnr6J6iYC0LBTeGO9q1 zPcz&!L}ELRu5~-aKf-1BmDQ@oa!^Zh zUwTiag|O>TXMN_)Yf=y zMF-zxPFGEci<13Pf$beA$YNy?c=gNHu!o+2ZfKEG)077Zg()0+@TsWgKy(Tnb#j!vM7C^FrI*OZNZabrR{Q7f5uC0wO2_AQ0gSacK*%zx z8#?nefCXvdf1qINu*tu8B+_;W34d(KVhq)dDg}(m=tp%|2{F{|!i~gz6_cM`@v0-w zkdaG`ZLh{ra~XFg7q^JgP3|I-we&60wSlIU<2{4T&x0%wQWCb$g~7BIWn-QN`>bq<0%*lx zR#lBoYYGkMmV=<0vWAjVLQsmwc>;z%(M8vkU=Eb}>LanTmckeH#jcoEw+#(7a+%Sm zgX1o(qC&b)Wn30*O4U2Fhw3WSp=!Y#`2Z!QRuHVC4J->B&Rn>so9U&@R66ECt+daG zb={-d@hDSP(}Yqt{U!+UW7(n`zrp6F_ylE?WDX*C1s; zk_q5|^@CQ4UI0c+Sw{p{H`If&6{A6g(19OeS&Ug!NJN(tH-UA* zrC3*;<;VnCHK0i`UE^#{^uv|}MV00WkXJ=i=IS&9RU(?N;12=(YYRX2?BSOCFV@qB zbIaOmvll|`%i#*&R|@_R{LEfWX|rFbJsK%#UG~4N-#lzHiI@%ErRGd&Sqt+P-^7Y2 z(O)3!-Hx@VR|nJlMa6b1aZUyPxhLxaZ~y*YzrTC@&RNKpepEQcfbXhXM6_08dv6`x ztXD%{nI^Xv@Ze;_G2`%--pT&2INyeOl%Y^oG11V7^5*Oewack`jT*PO66*NlAs^ivP z=xt;}wgQ$9g_ZA1dUp?F0_wrry)*)9B6A7puZNE~q5po~DwuL)e!iqsV2dvDTxVGG3^O!>SUbzDt;^l3qv6(xxp zkkYgQ&nuG5dydGZ@K}e$`*aMrMmh&*b4p&!*9twaw5t z>+N`lSr#q0J8H=#rFTcT9$Ypfw+_)l;KOlaSh6qC zgVbB?T;bN)Ds2=}fp1DhzZP5QxYiMDmsOU2h`=|n zI2WTQ=B6&4@C9g(^csE-{x;Y!J#b1ldSfkH_Oo&?DDyk7V)CPxT>FAgMP!3&x)l6&epGMBnZtkWs8SZh64(1!>x1~|y$2(RV&#S6Ew+GSkY-Iu%H z6=fCLI(5KjB;W#>s$un3AI9{S3i?6bJ4hUgwc*Hj<0Jl*>r{nK#*}gwvRlW#g2OxD zp1QJ&(82u6*s0+`^89R$U*gvz6p?UsYS`(U%EqLAxWK7o)JQV`_l67?C zrq3Z?y5_TYvYE}KWartBkMs@7=BBPyYlFCz+H~5Ta4`jw^SYWEsCAKLEl@;N21`eU z=4psG(k1BldI_^~_Lj)d5vY+U2^#%K_(iQ{5?Saz>1Km&8rZ1lF31PhdXA(ZV^wT4 z`&q=^l#p^_lGW7JqWUQ~_1cY#s(Qt$_OGt2HjNocx|n;u6skC&ljcl+Jw|^y`R>&1 zvD}S-$krXh(oRH=e_~+CO0D$wqmy5^BkORWV-O_;qX#bGij)kk5TpH~VcQi1C{wi-?(`eZOkA!B1>?-G%O z_0`83)Y>ac8saJ04l6(KBFN{|%cBO`7wYyv5z2wqgH{5BzIeW2X>_4KB7qSnN4Ca`|(Q1lMsTz1*MlLOfbE%{s zi)hR`V58|9JFCWYGF5=aE*Ex_nq8Xahf}f{5Nd__E$PM5@0I1Zbw!j>GoOvNX$_s2 zno^Exg9b{-efYs(romW|Lv$LGoHicRe#rc=BqyoXRJqG4n~&B>%SjOA$=4kN>q@O1 zwFP&R9USr9b!&#`qwhjWx%1;g21$EE8z2q6sMKRfrg~`i5ngIO%49*z$4p^^%214J8x~2~4_Tp*F?*>cqSN~Ei)X@pf9`xW3$-kB)D-iV*32Gdk?5I^rsaE) zlslWnwb&e~+m0@?HaKD(vu|nx7Jr`1A8qlU)~qk3itI${OfKT=om_LK7Y8H!QO;5} zk`aq{pY9AT%dHWjc9w~67F_w*znJItmvlKMn95?p|21I&UF20cTAF8BIDPV%a3tf) zN=8w>1Ne(tUgxK4)J@tIRS)>3_(UKw%*M>rgJkKAq=xOJap^we0FStD?)k#ElsNX` zB=6DQM{40o+1)HA4U2))UudR7MdR`dk2(R|pLvNAnwf-2RG%f<34O=NYILykK5I^V zu~XTUMp*e;Z;d&R$uwHsNg^vj4=K$2Q)IJ?ZZ#-t*YtxE68!p=a=M#lvT(3s&#pH^ zj0^(Oam!gZ^v+Vn^JHR6J%Ow?nV8o1*25J{WoA}P)Y0W|tOZ`-A4`LaW~>rT1p87@ z^LQ-Hq&aEs(pj_59N4WY-NHpW{`>2ezz;m{EI+TqB+`s#0KE+B95uY4%ETZr? zYOqzpZN~^vV!SnrNbSS7>M=2y<)8s>(ZnU)?iOUJo_y}Uf^v(4SSBnfw39h06u$fy z@YuJ%2aomtS1DwpeJ!@JRZk4Bt#jSBIAbi-l%T9RA1tePU_HE`AQc=pR_Fzzan*cW zMZ&5CZ+0{T_RUZ=N!@s`u?c^WsSeeiKUm9Hj4H{55X{PmjjT%U~QIDGNc(5^c7;025rnwNu@E4<*g|cE;clnY+C?FS&ncz_g33k4ZF`^9Kb;xev6JzDe2-Pq5ZQP$%nr4bsH?VKknB4o zXAk$`d3?=>?r2%*z)IAL*0Q|FKo??Lxp+Fp%n&VHm0On!09(<+{Djs*+ghAf%eb(x zJlP76t=mOd*eUc~)ZVX7D>EMpaUP`nh$H&I`7MYvis(F6$9Fb)*3y{oP-?Kr;7?!?;1JV$TlW)C?ph#I0L9OBUgCM@&Ql9JO{HA5*Cos5wAle0vqj1 zIa1216*U4pNbZb=z6oa6O_Pq0+_9y_sS>AfPIsvCTbda3|PkbM^yM8aXxmE zUcYDAQ=k8>{s(p7Kd=AsA5)Pv`D6`tMP>;PY7^{mzk%!R*2`;m(Z!_gbKojCHNS9- zxMis5$W8y&;Tj%)DW37G|6eleiYrr_?_o~>uageB{zj`gDmKGfzu!nQ@6{sYkQ(d@ z6y=n|uO`t!w#7}kjf`6+^~tNnVcIQryy<>!RTX@n_Mu8nKJP`Lx_ue3g-eoCu5YS# zjt=<{btb{29RB34C5c6tBK*J{7*#nE%Y>qgb>q>dEJ9}Ec=lvu9L-d8j|a;qVyPxQ z1D5GZ9m7i$^jUt&i#17kZ)-6$$06E=aH3&QtmB|)CNV8&@hoW5NkQ`f6Zf4tjRq{7 z7t93Ct#99nAQa>mGmIcB zK4rd{*H+%5%)P3-8aHVnjc}i|$?#Zaf=@e7Sg?<1!H`ir4BZa_+Cn%^dRF{jemykl z?=cky=p17QZXAHch0NkML%SK4a1_YjCzIFNca?17h-P*<&{FsLf%onZVz+pk zw0;h|(-#Ju4J8-zc;ozDl7E2nw}d)jJEVZNC`k^J>uYr06yY6Oi7aykH%7JZ4Oi@( z9xWq+rnbBmk)}A3_`e1TB>yczf*Wt=>}2@A$bWe6dcFaG4O+4WRW1}J9(Dz@4?cw` zt8d?Y$CV^zW_BJUG?4Y>6!SGF#Rh8r9S(0P_NLC69LbIpvJ0{l{3x8c6IWm!xdMsJ zkE&)!AEB@2E077a*Us&?b5p|)K3{0d=@1wk2XJfY=`g?Ha_%bp$%?$9Q$63v8kznq z|MRcg@Anto|43T9hU!U|_DQ4s7Y-l`bBHi{;;^kHu*N&>LYE_}8&2tg zOK1Ox#Ro2lt@rC^Pe*3b*fPaL*nA*Q9R~38kOIwlOA7 zW{QUPMvyPDNQBnhf13>+p45+j0TljE;`Qb9zj@}T`pRr$$7p3ySFuBiIA%QYn9G~$ zqdt5A!w%wQk454$((Rzrsqc@?J~dR$r4IvWCr-JlLa$Qa?sZ2Yr}Tcp;vJ_!hRF^2SQ>XOJ9H z22xY)){e`Fe~4M_bTEn+92on!t0q=C2dY=E`qE12@E|JL32_lM*DOvujZnQkR8$4W zROV%QgpViY;38wSo%7V%MT30sxMA`QoJUk7l&*z;61@@E-&<`+i`vpj$O)w5>?fD! zmsmv&QM>3TAZ&6g9xGa-?l74l^zM&;HH79NMars`oZ!ZScbJiNp`ndJ{iB2J%z189 zJ;1Nct6h?{pCY(d5js0t;oC_;ttRmVESv4D#doQl&L>(SP!F4KU__NTuEa>YLsMJ5 zrct<}dQ8S_RTWwxDC6;oPz*PZ6+MNN2`_O!&%V2ypvJ?LL+)*ot#Ndkm2E$VF{3|2 zg*@Zr{;DGQ8P=)mko!a%*#!)AA*66my(c)}w8fqeh!o5e+; zkPdzZ<~hWZL|0Wbv;X!2gSNeuY?rO-9ZcoQQ2+d{OD*0(U%Fa+k37YW;p@lBu_r-? ztc%31f6KyeclhU7_?aeBjj!(=X05HCl>GxZyP<{iex`-;;c(MM_iG07OI~&Geqa_A z-E;4@_1|3kT$LZSqe&A6@2MLm_=}xIuf^ZX;ZJi>eacV}?%r8Q%OT|2?!``k|i zK5VX2gfsuZo1yt?UgRjHQXGhhIDKU1lk>}8t?ZU}{}wCz)GHzxev7Qe`A&E6(%6F) zaeQg$b4Li2iHEGcqqAC#e4iG_Z5oMC1SxPGQ{E#`4uC4Gvw2Pn4z|OnJ^+$zHaLvZ z@Z|;-dSp_d% z{UOru@a_v63_${Lu;+>TOUC_z%Ni)@Qco-|XFe0|quR2@* zq&u`6(sq4$J6nG~Rd|N`-1*XoXx79qLyCYVFyH=oj^>i+z`7BYi$G z=Z5~mUeb;u1K67nyIqI8M#8#$E(5aTn~#K9^E(bdDSNLwk^6ogFOETmTU3!Q@*afN zGg5;Oj=235VV~+HulFCA$t-$MZ7wfvyIwwFQ1tdNL-DRHJWS7pw|+$`n#FB%PnJFm zo@>!zl<=49^;n)-rYx#+J|F3~b*yfGQ|Y)fjbqPjuh0f+wd#Fe=`cnEuI$QS{+8NK zIPOmew89ackPaOrS=bB}FZpet){8co?6m>an{KY?xLy^$EaCr$w)c!`GHuuX9cRW- zL>;?Ts2)#KYO-evW0#Y4XAfbjTq4-$n5Tp~Tw1fl*QbI>YA=Cgu2t6PjLXi%F z<;}DAe)oQM`TyVbu6OTm*QaaUx!1a{oY#3C$M4AHfQ!N+{uwZM9b4o|hBl32b+?gfCC>0ww_=5JUIxXsS2 zeI%#Q<}`H|yXiH8>k)DbP3DrTlWWh7&PSJHSbyj4R|hVS_3keY_?9XY$9(+?yk~+> z5DVj{=P&byb>!y;&tC?#YgzeFfqg9V_m=le=2r5PjYlQ%@y%~Gs<$lQnkwZ>%O2K! zQBaY|_U4t8lh5qvtK1YN-K3Dbnk!dlIueH!?1z&ZG+Un5p?o8+dJ>f3;crP1?*d@= z>u*WgY~3^McF6;3rIW}hK2vjRg1|w`Vfpsl4po_8${XU^J%~uCWWLLARtx7u^?QpH zthd;4upUdI!(s2zKDFykndb(-)zad<+k3lm%niGj6##cA;e(ioar9-H@Y}de4zzE; z?*~G#&eqX$19HiQb;G^RK^D&dg}n{@Ygrt7r-~em{fn+xet38|DtBzN#h zqY?VUGw`X@z4hutOI0ubBS1yYn$e8TFC(b);n&^1 zPeA8~Ky%f_?-wxVN`KEqN$mdi4ai`X20TL#Ht4&bQ@&rgSXo`aF8np)B=m4?;ksGt zHj8wa*yN`H{_S5M;2#&i{ONG5Fy?4*jW6-3|Il@xvGX=GYBzHyW*a~9#p$K?Ssn}i zX7%+;(O*G@)uhYe5^rLL-u`u-Uivo%Ynxl_`}14Jzg|Aoof?-#?4w-6z>bDuiYwZG zQ}&egF&dUTrPd8Z9;Wcpw*NMorChfO8!s>j75VzjP|U(tLGCZ)#1xhVi5Hn25Tz!F zElJ$Ed!vQ%Vm?dNJ(u>wzrC>w7kO>{|9Hxec=|nkB^-{m9LyXY`*l*r)Jd#bcUtSZw`<@zqDc@ zlmQuhNJDppsRSh1r9*i9*X>5-t8zQk&+g|Gi=wVJBJ3ERK0A){KFSq&6(u+)APDE4#WCgz~zwl!X0@*c`-~kRo%Ym|@Y*K}pk1Eb|iG=J5Wq zlpAKD4+KIN3$XhtRg+7dWhp(eb7nH;chh@3V^T@jqze8QT1^PR0vI?Anj*DB*Sgh1 zKFt+}IrOXgcENL==HaXR3MB>85sT_$9ims|4fPsJ4Ul3lCw>8L$f>eYV%yYW~7dh5@Zb z3OHz>KDhMC)%ZX8u?054ru$PHNdiYT6E~yMr-qf^#RqSVx=+g04m8#yCn|A-)yV`U z|L)ttdSY_5@|4E(2LE9801{FXIjrlP8@QC{X9||6n+|)>_-Sj8gKc%^(9P8jU(C_8 zZ)x*s0KPM?mcii=?vnZ_Ht~L^q7CZ?^kuCr&})i_#A`pXhS~4+B~Y>T$NOt_H597m zxSXCDic;b5D6XI&T1LZ&pFibTGb~`|6?2kox=Yls<%1)lc`Tls?TalB1TX2V>bBz> zIo@@RSto7J5nKi=2zKTnZ+a}p^pzIX)p@8?6cZ^5TAFI5tu66Nvp}eGj%G>xVn0k5N}>Fq_1FkiO<*?8jPT4>A;PmylJM(4eAPrq^Yz zA|aQUUi7E;!@#>2?@dBp{I&Mn{+z2uX_UCg+F$`je7oY z^of@5h+HGbM;)<%aL`i9EosKo5g1CP_o$!v!|D-n1UgK$A1u33mV8oEnf%AU__g0n zL?oggzib-Q+f2>b*KiT}@ZF;+~4oj~1pZF_Rw-pMYNiuJ9n(l>q{&asn zifR1z;bDnb@14I3#?7Bsmt{PBdr9@{nc?mWYsiA}PR2**zizKAbu_Q>r_$eo_d!|- z@K9{ZO0S+?STNSTsR7HeC{1il?}Ejn!^`PBKC1;jS3$U+@6R=(kdsY*%+0rXo#<|P z1{pw4q*NQ1+MLQpH=26->)&q+kr)PNJ#KXtUpCTvAg}fnoV~OAKuU1T+M3x%8f>kx zhw!O7tC>>i*3v6F-`GSCDKN+|KXc`>Y>S_6?I+D+di&ierYGM-6Mk6YOShmqGXPkPuwSv&OH zOkeMq0WeDXzImtD)))22=@FcN<{j;7xkf>aRC#%{ku?2zZxDeHCJ=9Rh#-P3WZh_7Uw_~fd zISZQH4ID@|i%fbU_nQv2*cHja~9~F&u>lkNt@o+4)-#_4Q$P zU>=AzJzIX7TaPlB$@iUKPhZJJKZyO>XlN?;Ai)UT!cg07sR-z$0EDmO^)^Dpp^neD z71AuzABv*nE+AwzH%PCm+huU$iTYaXMy#~}6~YA#{qkiG6Z!UGvwe#XoxjsI zih=ydb4;HS?SDUOSzEce)97l^23x>LFvd(QS~1}J*ubGUpD~0bv5Qteg{cExZyCs` zaAhc27!2l+e1dyfnbh#`8kTyZ@@(nKEPZFBog2j%u2A!Ft0=8Bf_?e3QNb7nJHrWd zQ|y`+N6W{UXvA^BO^~Z-i6`rp9gl2`7bIKmlzfC20iF8ArO9^UWoFLDL#@7GPwQLm zXq3p)Io{xPYPVXK={fH$Uxg$9)S$cxm;hr&IPVraWi;A9UwJtO_$Fh28gRes?B~+4 z&=400V(dgdXRfqmHq);3U9RwWeu%t2V9;Qo71s>QVa5@2?GChDUVg!6-JoFB@iEr} zVhqttcwO?V+52|0(Gq*#tyv{bOtq>t1R~7?3YVsmp z>idL;a+Wj;n;9-7s|GeKX5(@~e8F5+p!P&Fu|z+L<5uV+axiHI2whFuGGq^QXPh?f zuQsFVIBI-;jP5(hAj~8i?&O zH?KGu{*)*Zmw+}UKYImqsOY&ynwAI?sqE$bN_XsRZaA{7DIvd$usLQ&t_Y029-ja^ zOoc(2miW;XlUK7(#@v^ha3T?iKNtcI^5~`yU8aw-F%VWj!NxkqUVYe#t)hKeb&+&l zEfkShc%`P5Ujf~HdGY6AXsx7^RT|I0_%r0f5nw9Ktkti+Tq&Vpxz63V^?J3^CmUt- zwbuvMT)w)|@qud}%D*uYgI-7_tF7Z1HOeNCKW{hhvxZiFcmkgSOkdereQuaCls}cS zP4BJi9ng+yBu$5=9Qa??)1&DPhPyRuy}oqeCindFfNw1HfxcL94@)ZEOiE9F{%d5s z3oDuOfA{4m=fYp!2>d;bhjGH9R>iN02Qp8?ds%}!E9>dN|1@<|`yZLQUAV4|uz)m` zH*q|*k_RNg)BI^NJFD}#E%0qcG7 z6EDw-O}K@-LK_)b`t7$$Rpa_8aYIkY2|q?hnYIc$XuR-t+RCWAttGEn%KWV8omwif zoKktWv%Au@+-?$i4yu1vTF05Mvm0ervp5xm(ZrXF*%_00=4Q?i>0NSlfZ9jFF zn31Y_!+)xClI#RH$^3!6$qt`u^O4hf-@4Lt#M}{pIU)Fh9!dvSdd|(aEvtgzGsQ6R zkrIYALxkxJR?Po3FT1p1lzW6=G;TKge6ysAg5l0B7<;`Wu^ss^&7rj#zG&gYBnb?o z@d`?x51eLbF7Ij=#+O80Arh2Gr7nZ;1lWsvzx`PI4-%VOH&6!`4urQ&V14yMq9ep` ztA}oE=WS&QVX;Wvho&3c9&wPdqk-tHvA0;s%p-2wczHJw8_qKQ7LwVvmV^K?-bL|% zdq=_o!TVL`?N^;QTQ+;ud`m##CXDet4s)%p<3a7and8g!HxUZyIpkwcWI=<~iTqrB zm^T~6InX1(O|R0{T3CWRo&tzL8K+4`e?iKfeSuLMKa@mSzB>AYCz?|anV5yPpded} z6oJyCbc|xM7p7r;yhdQ97*hE;=ql-FHvJKIXtfH~0dq7)zh7rj+37P@vn0w@sc!tT zNm)|VZ%8dGKfRsAx&NTG*|`8DbeU!5q%<9d6pEWyy#=(vSbj z+XyXvw`VBYm*v)UNEj!-dsP1LHUy_O?WPXS0%M8`Mz4??78)m{d;2HJNc1%(*0hz> zME~)oJ9!jrR_~EW6v=ByE}c zsg`-;9JBQOUG31o4;!i`yn_*{>^2;a%e(Ln>3zXxPDAn0b4dUgC&8#vs7c;a3U|fB zI3w5RSL$Sm^zkGnfa2uO>_P-y=j3^JJuO6XH^Y_Yp&Z7U&A8vLJ&}VoE4L5Kpy%%i zG^LC1+L!M!LfN9Hw4yl2jl^vlg+7C3K<}mEKl?Ez@)h^cV~HybFRexD2$_iocILtHS*fDh)$vGjw2(tK-{O(PLz~xz+oYre(-;6MCbm&XmR+c{`7Op>&M@E7{Cvj@IPU<;dmZW?cfvH;keyltZ_hYhPuF9fjcqP_dY{YQIAQ8;Z*R-3-`81VMdkol6lxn zE{|6ibYpv{E5|jbYHWo~Yr1qQO0TNXryUk&nPif^`H3d^1r@d1ARs!zhd+DrTfiZw}z<77^nnQ!6 z7`yoRP|Q1f`TG^a@V@k;ZsZal8OO>i8aB70QYG}_Zh#j)F2s>n|` zS!@BO5@bdlpTdU(OC=|n4+fF_i0xihZ&b*r>9JN4-plr+sv1UURLp=9CWRfEoUOJm z`j8)Qpv(MoJuC$LQ!SmV`rK+Bc+H^Tu(=rl%}nJ?udb2cZK!jb`F;u)l-|jYfB7xT z#w-`YCkns|p_g8y^?&TM$*h*#pEc|cFQLNJR|;KQ0;jVJ)Q;Z=k3XNbZDj%Ew?lrm z5Dq;yj;O{wx%w)dZ_`9^W`a*-NUn}++XCtrcPtk##-Hcr73n0NOfuSc4XahqYV;Pg z3al$QQ2gRaDT9x@ zD|I^&f?JSFrmHtgdlEn^vku=cT;6YpcY3lPzd(Z^QnS})L-Y)KeS=$KPNYLsYve@!7MbV)?NH#Gb;6a>KeQ4 z?Ms|0>?vA+wdmXG>e9n`2V3ya0B_zN>F6qpxtf#MJ`Dry%D0bv$B*HZ8XRYQ@b8`&7n_O1}^s1EnQ_WYVMdsLwvGKbJ* zXrhXf^|a4NoRv`x)U!gGj=r7x%q-Zu7d4IHwVtioWDb45;1Qi+?>z_{R!GX(z^;uR zXm9IY_iJJlTPFA(#dNtI2PJbYZ4Jc6=(^Lv9Ie(m(w@Zlwe}!u@P68ZX+7j9MlsbU z6KS*%V`%KO(Q**rl1?((%Lfu{1GmwKMofZhC4UaUun<#_I9Zh)6 z;};SM(Se7ajU zTHZt})YKWpe-QdK+!$($)7%ky`m^?MiHL~xwvyfPiM5=2(T7h1X2QezgfWS6QJd2W zdyP5q8BY6hV|&{wowxf8s57>+IPJDa3Ws!1{jd4?Zf7Kx#8Zf_x9C!^tu|bdbv=@# z-VBe!oK!5GpU*U`ir9K$V~$j$-LE})h^?9gze`aR2mA=CB2QocLoH=i7gCbZ_BK;o zC!?$?!E97aU05DFzOvvxJap*;ve7Q{jDrvF=%!a%Pm8~whme&qVCkE(^LFDB4W$c!s~9%t zK@KR@Ibe8r9AD+J@M7ZH)h>qRZ23K~FPpTQJbMX)k6q@~)>TWw^=5D2#ggk`pxYDc z8U2Bwaxl)?Jj+K$o6B}6Ul=;)q!^_+GuKhblQ9CeNHm1pYzfqTC)grkAZ*KXBph@& zXR$-fxWRoVA+q(!D3BAYk9({_r(2i67KSTlPV7|1_*~!HrjEMZHCOR&BIl5H7~tUb z(OF`Mycr^KRl~hxxaUg|^brn`bEdYId~e_V;qHyA2)T!g-HodT@VPEyGdYVKhv0gn zxQK__(hb5QmGEXm8u0e?;c-cx;T05j{Vpy;?kHI!sjRAlKqQ_rNOPYIr7`wus1pf; z90v5$+DkK+;qy**$9OdtPWy(B`Xozv!PMbauhzv6aQs7mp3O_kZzY_?`S)dI)8pw1 zHQo-&{Uxugc}78T4})GPT*HyAgBn*+R+8;ZNvR6%#qd0Jv(Up(Ag?^_JqBk8`%4x; zh=o=hvE^P~oZG9>St37*=<%NE;Pl{qzb$zGu)OQlMo-z8H!}dYPrru4lqhJqmk~VU z=YlLMh+aOXAtPKOm23RW!h7rnT1}*Q=i?)O1{Hl8$(CsFmykx+*_dZROYYnG=ILTh zWM9jhxv#Bn=9Wm)*Zb@#(|i(^!xc1evjq>ql_&ZQK8jsijy-ZuPH|AOVC4=1T9*tHf9pzk%q3SbPIrLMQu@D2 zu68(S+Yq}_6cUrlA1g3?=siJFu zLt1YGB?pB%46OLi~8gHzdwJ#u?X1qIq#GeNfBbp68>aMuv)pQ3odds4qvoudgNZOwd2OeMA` zn*Z4LRR!-);`qm0clQU&$HeV|Tg%r;%$^6`@M70D?Is=^DW+B8{=383viGT`F`Qu8Q|XTI{!aOr72qT3CEh-qrW`3C<+3Nf&}+P z=g>`*Cvv^58U!6wadY1_4X{+QB^jE5oXWH{hxYcSLj&Q4S^TK1U;mSoD&>DlN|k*{ zEcns!;4Vc&c*4l1@gmj|ULjHl&`bZ_eq7M<5js%CQ4gKtLV(w+oLNoViS5rUd3j>09 ztjyO&IRUWfT2arNjaP`1KwDS9sLUu*>9d(Z@!PR}Tg1`L0RD0dGx625+fqE^>At0T z7C8-nd-j!oSHUijcWoiR-AdDk;X^Ocw3W#~++Ft?&VWki19hM=g{ZUiiN~R9+>H!W zr*f5@;?*+E3vVKmePHqcE8&?}^3z?!FQ4ltsTwaEb(r`@&V$$ zC%pH5;jJaJS%94WG5Gg?D}chadj_)VBL5Qc&?bmHGp}C2Bv>G0GncJVyr<53Pv}=3 zPNoiIZp$y~rN6AxkNW%?1>=R1F;o?d=#4omriauYy;-rmD38dd8iz znmmV%KkcxMj1npxuIg1J5y29i5YE*2HeBDt6LIlAo602h@(e&w2r@3m<)zqkITOz5 zt?~1Hu(2L7EY-1M+=EXTtgW~Yk*q-0N0%oP(nU%v7Hd+i`XTQ$Gm-PJqBL6TG)IJJ z+ks0tGnYDx^lIbEkJgrC59sRw zdxm=2C1|_B0mRn2&XQsFozU!aH5a%No-;N`_t{@im;1$}MG|1XRMpyPozC-NJwC?| zflLuTDiMD@Iv2SqzH9^N@KN<3K27g|aG5Hi+nY^DH0KfKHDkM9`F`lPFRz0`nDvCQ z?oqm8kugDO!{miUZ2!I#XUPI*iE(c)H5$#2z7dTqX!6<*=2vTN}y(@#)B*BZ8Uhb0e?b1diaQ3dt=QWP>unzTAiiB{+aA zv0lZaXcvgYyU;U1E|=lN?l$X(ZwsGkhzcj&t&2#NdsS?N<;kxle7}&OO_ahoNr((I zO8egi$MFUn-87?@7FSslO^IWLg$~lO6?B|Q-rjE!3VDB9*eFzmNt`|ZCnygo ziMzpc^jB(c!i*iIe$_q2Gf0C!H9)Ing)1uS&aaudpLoA&MBa`1R8u`t_yQwFZ~C{- z>Bjf}cXZ#sKzi0cxYmt+zwm>}VzodPn%WW^d?3*9na1=UmO=aK>bYm?+0SQt!>q&< zlazu;a)#92*oF}QttXeNW>VTabA93^UHUQ@94097#M7px)~_{XuqV_;>BhVuWra%! zkkV?{{IJ zAB*VAluSD3N|vtw&zz8-O0`xvlqUU#IG}a`GMB~Zwy!c+GMsq{a_}~Kx;42vT z4Kb|qs4-iHVTbISaNRFo;t#0-O51~$0?V_ZvSNw~e=PbUk6@-dqlahS3c10WJLh|@ z;!Sc5a01Yu{`q$G50woZ*JLUnkJpE5+NUdNLhcEI<*FpA?4FweV(&#Wf%3NKLdOd5tJF_nsqI@kW;f?z7urhEYxwPN za!SADxbOQc8*3Q*R=5zS3QLX5* zyY?N7Racem>71}x)PQ9>7$~GJ#|aptSAR?tN-J=ur5v9)2xhML@TqJMZVW6b0}vHD zNlki;vFiNn!g9`A(-Y zbb!5iN}L%Hazl&w5X4GQz)j9qKK=B3a^Z47w5n(YSj^(+{tbQ+|4I4p7xtn-?JK(e z8e@a>4Q$Ghabe*|%?Vn^B56m*O4X$*G{FWZVl(z9Z>ZaukNVc)w?3)@j`a4YkAeP*U;r8_5H^*D9+W!{AKaVM$^iI-wSl%9F)SRVe3Gk zDc+&&nz##fYu;icezG|4htlj}wr^m_|?P6`Kn2ltK<( zJJSS^JhBNoWt??6u~xg;+vwBmW0KsctE+36O4iMBVr<1w|HieUraB#^b9UrxNueVj zP0QJ)U479=%4fS({VR~#Zl+N?hkL6IKm447O9d@~)|Pf&jS^$mgd`f_Z%Lt{_~X}x zP2pZ64-N*U|C-e^TB++>^yJ@O?Dg94NVXG*KTxPIuMul~9TgmwBw_h+1K~x9-&?C3 zQ1+5~J4Yze^jFN@<^^QbIn~;@Vb?ZPtmgoKw}hDevn7O5H0S>hrOLmZvKKB0|36tm z!g(U(h*7)1j!&caUJA4nvRMaKUwnNWrbzwE1Fp+yYZ^OxGewwss?L#*gj`2fP6s>> z*2LUi)GfC({otOGQo3&;9nYu0z*SAlEcS$%D@RAnAV!yIx1l=&R=J9-nSXJ2xqbR0 zOTeeH#Y7y!%Q%mgA;lqnD#0ZrX?9fbATfT59JvC7p@1TYFSiS(^p+B3;Pb)qD!4%7 z{7-O*tlpBmut-_Zhd*Htx6<#Hm-}NC!a$?V`nTDcbgJ%P~zf zAu|CO?t^{7F+=u6sFLh-e~U;&g5yEGkNcuh%t}wA4^kd=ny6M~P?$;w1U8DjS*-2z z6fcQQ9CJ04t_#Rt&t@(F*Ve8C_j~TTXXWm?uFZa1{*oHTHlRpNenpK63YqL%jEg4Ip9fY(d+tXkt$BSq(r zBnguVj|!a`bPWfAT)31Ve4t)tEbP6ud{gF^aPcOBN>y5bK_?#aq`2$}q=J<}K}Cx5 zLa9DKI7U<2mD{zOiO!;gyq>V07-+XUMyAWuMLl3=0v&>jT^T5RoYvQ)WB6OmT%_pu zA#bx!&i2C7g`}^#Z}{7gZI1T&Jb)UPDZc-!j)L0IEV8D!-Rx($%TPn&F1o+UX~ z?HsePG1%;QoJR3Ip(6?m=Ag13kHXyBJ!){=r_{E}K8lNjRL>mTsOe9BJaSx8e0;UH zg?PM0XowcGQxUdR<}~BFpGOz`b-qh5b+LL>!F|P`9FU!Z*!9ufP<%ovrsp7w=bS47 z@;|RH&9L?5TyxsF}g_ z@k%yWt3TAH=I;D;zi4RcYiGBPu<0$x2){Ns?}*wGzjCmQUxSD9@f|nz~K9y?ank^7iRX!v|Z_=!OZrHxB z|0%LDF}<8i=|$0~>!ZQnlMI8$;KJIL=uE$O{HW*OGD?u?;2dv+a|Nmggu@?-#;(w5 zYX*|vFL+|R^twI=e82FEME%q5umRp0S>7Vj?z@T!HhGzy4{~R7x4I%zLS|K!71|-V zxf=?pl@H$Lq`2Aoi-}_5(-I*Q7L_#;UiB6aNApHHd~yS6v6QgpY$kK~dcd&ouhVs` zp#cp99QC^gN3{d{JIB73~?o>LuoVwFvh8Dwr!7p1o%9+vzdj^H?Z0SGMOAM-* zw&wk9u|eUHYV@lb59{lqwtNzb%S{Sr4z>i1^jVYpYtJ4$EhG5f`uOpoji?W&AhMv! z+Ojlr2saq73^lx5>9+?&#?a+xsu@e{A#UEQ|V#38^;*zjLN}aGRu#x01?7umBjKJ*HMZtoT~1 zz;v^17zfENeiKc^_AlVte{bNqcgzjIwJZAay@6-pAvi5?GqByHd~{=D5=MhrXlzeE`D73}%+8Wq7Rn82 zeQ0**9itWgl5CiEa-x8KFvUBKN}2wC0d^XaO_t!&azvlv1unMy0$Z4|vbTeO zbf%X%`pK6*C;?hNRl)&mf_zfiGGxS^+qI@k%%Oh6zW9<7jzTN0cD+^A7W_ckZfhUjy<-X5o3b4y>j+R>sXGxkaO1KdLPkNmfcuGR<+8XZQBsQfqz3p z0`9ym-|6w_Fuj(L6Cp(N-v$9q9h*C2gq)v*E~0w+25>-hYXBI;pHs8{_ZMaFjHq}D z+2j0FCs4gU;N_ISi~_R zz&2Rh%%!qQ0p^II1olL5fjD%`K-!-aF!6YNfjU=3_E-Lmb*9a>u<9qz)Iz()<$F=} zEeC2bFB(c775a@zK76x7FLB`^2h5^8`C!!s6uXU+0z_~Q;gI2(nGNI5knT;-35c`h z(P(gs_o2+uK?yuVV*L5jI3Pbh%ap2jxCmEYykiYrsurpI_C+XdP5-59p$ac+NLPwT2m6?XL{B36Mi07{^(>V5S+stT2&`)Nvh7Nc# zo;cyz$h+!gu~ra%YFJkkR5=6>UFlyaZDL{e|C3qecm^J3Y&FE(0}EIr5s2g{%keHC_D7|b|a#zGWyM^zlk zSyt8)o9)J5MlWqROt;%s_C45;D4e$}Zgs3jD4%r^e@?OTsa-MF1?y#l zYaHArYu8_i!1c2FuAmjmwE7f%M2Z@MAo|TjmqYYTDv<23OOVIK!5xkl%MWvek#BRK zf37mC{v+qB2Ffsaq>1~*EPY=#__pLxJu$Qst5D_JRPM**1WW*M1cgBn@7 zUr9e7(8NFHF?_>xTiky8<*Z8*Sw$%t#lrOa$0m9B5PtJXY*~OeXQJRIuMVgUhgo8E z?>S^TeL>@`NQP=ThChy#*Hs{^!(rmz?#rm39<*$9d_~_x(U=hCo6X=acrLlcw}-Z# zmbUoe(myZ<6(-k|JnZ44&q4R82OSnF8zewMB~ZIg_>+pD*B?Z^^2w^{3~O7$IH~e+ z85O-wa^MqI58U)7P+2TJ1$~rB>b4ASG&|f?P2{k|0?X!Zng-Gq5p!yX&=ut19hMnF_wZV|+T#BOywBW1C84 ze;?1%XTIzFq%IUgkKHy}4 zfQCK>3pF5%^=>2?UO7^JRt2N{h!s7>BGgd6Ul?0O7xU~3hkJx_Dlz9?rMM|& zWovWRFl}=!D#Ri)+)b(=S#NrK7wL$tw!$5jhL@!v+2-umz;_VC?b za^Ekw9qE3*aICR$yGS3>VH)Vxa=1VG&2;= z-R?kAAZpoeDo1@GQ%Qr!iR!U(@R$%>Zy7TF9_`lKYiBXO#y+rCIVxnqOCnK3LX-HX zgGRVoAKy|6&!QLOn&ybH*dr3jc}HH1v=`==;wvfvISz39<+kaz<^gbiH(5M99ah9D z+Zh<0AgHMeCBk{U!;`7d|N555;BLUQa*&`Q45lS}0@?STp33pb2@nbWTxT39?~JZp zxPxTI?t?ZL_$0p+W$MP2Povv*=#I!9*gYxZA?gUkJi-T5(EPb}74?{da~#>`dFiS4 z4eeRDg=+R1tX?@qd)q#I>`T6&9mstb+sKtH|5&*tQqfuLfraE=Wy;Fl!;_sm+h%{g z?XGix?vdQ-=6$j=_uLI-QH9!%Rp#k616&`q6n!fKXD0e4SB zq-W^Ts(eb}xptGPkHlX)=Zgx(tu!rn#w|&5u$-PBKDi*$16F!Tp-l76`QMTw>9iC7 zu%%49pC?J~TH5ig;5dxZYWTr{g?g#v9k|}3XQ;I-3hlJ%VB;doMr5V7#D-&JuZVoM zsD9w(Ox^F2O-@5@e0jWot+-z%I~gEM>Vby2Jy?D9q%WlqBj0U5fZtLufA;11I*yPI zAbVk|C}+@g67HY- zW%hnAu6zY>;%)v3Aa(e%`z6Z-YM=0`IUj$jQP?eq55reE1kPaW+dVaN^jvIBzh5AM z2OEtWP z<-)+7n$PTA23$C2nZ*xPw`)od=v}$#wevg7r+nI4lo5R{^PB4io;}K-7TqPQ$Ltlk zPkUsh+>h1V$s@vSM54BdX};)QeQcjvRzOO@lJQ1sYv62MuML>n)ZY_kb+}fPY&@ze zGysw_Z(-po6|xGRy7=FQZ>x2SvCDBPrS&`q4RG(YHLDpr9S48E08zPo+@cY6qftIt zJPc*IHJ_DMwli=Kq;8<;AZ*OU#(iut7=;LDWIibi64{R4R;{U1z;UosxYyEwEYp~H zQfZ`Gj-`8C;~xcso47qMtyn^v^Lm|U#bVSzBQUS}!KkdDX@ZtXv-vm0TvjF9*Qs4R zoUjL*@d?5pxRRQ^x?1xZ+?F@mtH0zob=KQ5PxBkr?0A|{72G>5ru{z;gilm(BT7f8 zc(6TJ(r+bgvzb>$;am#*%D2e46v_G|4DX_RPJ1|<`*5s^|s0b@sF9m@!Cf}NfSCoEyERRxI|oc zsOJ1Zn}6&-xBq?tyq$JZ(zQ1`_4rBQ{m8p({}K{z`QMysVv(}UM|FHPi+^W5+F$yIGV!X2c;bsoxnc)BGOQ(}_XRgiu;)OTY?ep9#IeK5YI*&&?zM*x`b^Q{lh8 zc{Rj7Q8K@6qgpl)ebWw};kX-F0c$Us;S-)OJuV_Qh*1xuEP5 zn+_~9!C$kO6~&l|xOnG^v?1Ub2Y(zsk+zaeHBU?Tz`Z>WONVgKCJN_osaPcYy*c~T zbp}scv!t9C&olvl{0VSeKOlDF4UWvqQ)WoCk~Y1qdX45*TuWJAVK^$J;UCyh1oApf z)XjyW?c%P<(Rk182NNlvA>>*oN9_7q&jRggN)KAH(zHi`R1l&4IN1Pl=hB^)?&Kgg zZ&`LRM!Lpz`2}5O=T%&8s8LrRx0hU_mzH|Now$d)-D5z#RQ#?ey?GpUB5+6Hr=f9Lpj!@$OR-S@fmjWxE)* zq@Ag_<@H?#_281lh5v2H-`d)ag(-E5k}@SlLmOIJV2m^XJk>ndHrGQ_|!zyc0rmLxrc0kzYk^ppwWN0WFb^84Rr{1POpJ;qE_7`|oC@P5lIOdIAh?#05HZ0D z`wH8MLJp;k<94#nMdbDb?V{Vo6aa_y)GPm761VDt`mGAEkwuf`5&F+e^z`R#wjiG1 z$$00mt+m8DdkDuetQYri75b;W|Hh$F22v9=T{i1qOp}0?@2yCf!UXUWBHn$_ZbuVi zy_fX|2yKYOUgGf#tvp@^=Uh;}qEjkaff~Ln(&#-E)MTwyfu7IuhlnY#td}YJWqs9< zVzrD-!)Nxv0H)uhk`{^Fn3|Uvrjj_~-?9;33>QO}f4|V$s+O$s{lYD|Dq@bPnx328 zs1nWF0&S4#tzZasi1vFezytKxaAo@FeXNC&2aKw5V2#xc_o_-eKyk$}YfiRIolt`C z?{~2n@y~^~)mP$dJQ`qGKIZwbhRRJd25~GEJjM+EO4chLBVOB${;aGMq{wb#IW2|$ zYRy|bzF9l$QHQRmX$65qY@B6q*g2f2L{RdWtzAH|E{rpCP?<77)QeqFDHsGY3$H%( z2OG<>Ikkjka0U4id?haJr9?sym~&%j*EAZ6`;vLM5#oL4)){CizJ1n zmT8tB&2W<9XZ4Ml;Q|r{;n`TL>~EndGUhGCGuW3i%?>E&s-)VtZwAiJIVjVv(dcW9 z-WEh2V!H~XVg1M?Zqa{{@UD1NCPOgVyfy2qeO{N9gq5Rq2)Em9v+@IrLjEX=NZC2; zH}jK~Rhe9iZfC_tJMNi_+>h#K0ENz!7z2OX*R<`+4K(1!bvkbuR49h?<+KIZzjUGS zI&Snu_^}-Qje!r{_dRhg{OC(I1Lu+_`x~vw*tHe2Q1+gTsDt-fCkQ^zp>VP{r^#HC zxhhMl$~2DzgFvr~VU}}X z$a5*ggAB{k41IR9`<7;-Mr&u@O$XE75|!OX5m!V9_4K5;=PHt*)ZtHKzP7~5Mak;< zf$tZ1^bSV_OlV9(iBjwcMvg#s#5H8UA(|38wDF2RlelNG zWHZ1l5sqBzc2O%3A^k7j-aD+RZQb|Rwd@Te(h-*Qt`Ir_73oz70Vx4#0RjO-?<_^6 zgLFa((h?Gy)Xd+xo@J?G{RGQ*r1b3Ba6oMXK2 z_x*e=#PJ=0_q(>&^m^ce@|ADa&_gn> zOcgxdH;Hb%Gm@>GZNRDK(Ulde5X<(f`)ZNw9^T}`x}$orN>K$6s6ClrU?c&NXt&}8 zw#w!n9rrvanNd)R3M zZ@+tD&&n2T8$bz=Iewl{a%#VCJuhB~2h!;K@@+a}eL_2X^c0Z`rRqJ=`n(q_D{Un-n!AcBN&NA&i_MR&HOF zChR&=HC;H9oKz~i+%P92`^I^&FyR3_+bH37T|VQ2JX3PxaB%!Me+K|DW!X*=?V7T5 zo{MBYXcsj9*xM3jB!H9LB!(Paj?*i&1b@ftPShm94Kho=NEP$n0pIh#mn*{`?+2NN z;Fv;Li#NqY(;BVD){D#!SS5;d>s^fH<)kh@xwx1DK@WIG+CM8bLm9N>hQ_5N4jfPI0Q2E%Fwxf4yaN4dM^BV zih(k{|LRpIrOd1Mu$q_=j+STA?~SzG2U}gah503Z-+1{SqEJ`UE#N>+fi@`p9YxM! zOqtmBhup;XhC~gk$=~N)@4LiRPNbTss~a!a>%ml19vrQ_#s^+O_AUi-e(I6CmiY65 z>I;=N*Q^LcGa8q#C3$kd-Y=%dtPb_mpeWh8cl03U&`c@_lk9>lT!M2Jk%!=?-@ z$ysR0VB)Z9=mS^&Qg0Osh6XTE%_<4@C8;HxpvpC~!k);U8&R5%Zp^A1Iv~f19@4&3sFFN2m8n0@# zQ+0*nbJN?_6;oYVyAz$)(<3j^!mqq2Hk4W<0BFEEZ9LQ334xzC((I}~3= zWa1)kvoi63+yxyZ;}vPU6{!}fILaB{5qGP!yZEOC)#K-3KN(2F1oKtiIhm~vhI)4Y zd0}H=<%Q%%Z1T{UF>Fx^o-x%6esJZLhBdc6;&z)RPBT6YQQ65msT8u-D4fVS-J7Ga z$NNAXAPuw0mCqB^HsbqkpA39}0Q6l<=nfrjQwK#@y|M~t`FE_e-UgHy@$rjiy9oqOH{>Zy%dN*TC15H z;_MX->?-@cNe~Dy70t8BZx*cUGh*SJsqJ&T0!G@%>%3dvVK!bDPIaki%?xWzG)`j? z&y}x*0i^`du6-Md*zxJf*}FCuF8+GHan z42lo#<*omMTqd+MxXG1!RnVrH2K4JJe2;ogm(IjbO6X|!S27D7V-bgQSOY<6DaBx| z*UMkC9k^7?l(Xyttyb{Pod*gx3f-q-fPl^Snsl3H6=Fj5AQWOI`MJtwowHGDObq6L zHg!J6F=vfAdIMCxk!&%LS|Xm1v44XA?5P8jw=ryNCT~N;Y>stU0*<^j4+M zT%QJa{N9(U!|$gVL}hJWJEkV~F{v?TX2cY01&r+4(Qf$&%>!w^`NXy+*ZNN3!vu=hh-)nkYy{prioR3-T7aM{n{YdGI>`ecs(% zHB8RfgF6_r_5L^x`l#ZNy40>EqO{bi?m`sXK(bqVlfb}E8Cq!v34jl0cR%49$qB4A z$9w<@Z$*u&?Qwv@8c|uVOz(z3w00M&nrv)*Tz#8R;YwO~N>@m)WpV=O&}lNuYxrU2 zxLshfJU2^sWUO69C5MYX!NzxSTx{DmwY3hz<1Lu$BeI#bqZ z4-K?B9|k%=9qj7IQ@k}e?Ba1zZd9LD@KS#zupWHVG2Ni)3mY^J(tkM|d>fuTiBGe> zhmU~83mpP%H|9x>quO9Y>v+@s<#(k~@^JucZB65Qfm)^cSji5F`7DV69FK|x-R!}Y zOrnp|L_M7@Lnd2H!j$A=`yM~iC-YMkv#e2OnFV?R;yc>yb_9XS%;;pjp6&BYBnWf( zWh13EmiGAQPE*fmhxxmome_yepQ-)7EF{9l_(xewsDkP0icHx~qv`1mY{ri&`NZf1 zZfUlT=Rg6kG)!(2xLc#mf+bSRGi(lSYv&8-F_`5Fg%x3nDGgXNuz^Qen!?p@nau{l zW*=Ws?tNW%uf3k4RW$HvkeCm_4Sv8hbc_FI2TOqf;FPh34PCG*qaOIOL$2 z`FOBuP)Wt-ZXv;(q#H#0K-7rcX?Z$UL?18Xd@^RxaOtz}yAX}6H^(xP`X7jz34%AB z)E^bskaFa%NzHsLCW{kqb6?{mLauYg0RVTaGoi<`66WVq4{OoX!XU9oBbp)>y0j=q zwvO_R)G9j`*Fv_wDtpN`I$ma5x9F9`ayVsqEJ2 z(|n|cw4c3o;L(53qlb1jCz}=iaIBib<^q8+O#$|Ybyh_~vDRYqpk3g+m{3@M)Q}96 z0i@e-G)8#zwY5ZrY5n8Q;Jia%eavvB9t`SUL;Ikr=a(g;Y`n`P9+D|dzp#xLS zR~n2B3LwVX>PYk_ieq7#oEg|9!0701&10nlzv6ZH<-|j3m#&8n$0|^>*FJd=qy2m5QYOL~p5oeQ3=V zC9a0*`<2NSj7&FxYv&^^l*7jCH`UT)UN}nQ{9CIR^}b1l$mwAr_>u~gq>^89!N4SW zC~#|Q6R1qf6a#eSut)pnQ19KPAc-xAFW$>xbw1<3PINg#wX9jkfhGD=nK=~e{Jgm? z?h3hy&rR6m45j%EaaEZ0O1kIxsI34>x6Mva@8c9h^uuJ_5IzN>9Pvfd%r(E`^@qg0 z)q#mfiOzkO4$&xGnau=RT7_7J7_&upN_|*6%=^cE=aI^|@-kYQlC)y0<+{nbO22^< zPtZK_r8pmfhwW=&YL=&Vk?A2D?ZBo&4mm=?1pj_50665q0)M*@ULqy2(53Ov0ttcD zaRen|HvP&vy>bBnpgdDoH7EZ7!%_WeFHp<3W+y7}=Y#m}Vi1)tZHlXhi4l*HM#T@_ z70QgR?AmnHtv*g`G;6O2Ls}brd^jH#Awc2ov0d!>MoJsew^y)=a&;kIlR{;z2M2y+`Azw+;A-q$1 zPR3`iKemE=Lvv!j_1(9mJD(dK??x(QdCt*4o=B6ostUS@PfkjK&pPf;!VoU(g(D&? zChmA{<{z+J{$tOEu*x3L$$qyJF>=sJMtFaezKVfk*>M`f!A}Xt^T2R@96Z!|+2tLm zsP_F1nO-pQJqKs$dlqseQdFZjFEAPsK8A=$iMemt#A#VfdsC#&7T%NTVkS`gePlB> z$f}c5pX@$V;#|b)HUBxxZI#sVo_LS)EPZdne$hFT%ib{uzq*AZk*r|eu3@RO09Lm? znB7}C&(#u+DX+3v3$yu9$$)qCcOJCWmEAkSjIDf5qr`z33ytTl#Kyr#D>bX0NwKx*4;ItO0TNRiMYw<&1t%(BV` zU2lpM2h)lgbXo)2j@p-FTe>zBS{aicq(qa8tUn10=-eJ+c=aul{tElIgL&gBm!3nW z5p1`gCaZa?`d}Jv`YtC$;*wJGR@F0n5wlx4SEImzHbmEt z7C;$NDB2^v?ut*RCkT|lJ2%>utU*XLkgZv4?;YbK#r8Fk7)frw>kl>GSZUUj>92Om z)!)iBJy?I+UbdrA5B#M#UA^w?(t7gcitr@zfv3c$@N2F!)%@M>Y?2qNb7L?Yrc{+! z{dn|P7#i>-AJ_+cK`F6#{JE>7yLjD`;Pn^^EF;9}nc<%Ce_^b{3Bs%F~GTy|np`^FlgmtGi> z#*(!ero-bb%oj_Uyv~Uq60}Df7?e}}DS*^5=CC)=Z zL5&dz7qUzrZ!CZ6>K^jPQaZ#mqrDgMdU@~c9NJiq*Qrqh>Z`*!^w4F6+)OaX$yT;r zEDE)=$tr`fY9P$*caxF*^(! zZ27Ye^!W^}snDm0MDQ&35zc~k)RnIv4B~!sx@uq~a`;AQDli}1YZT)-u`Lf%W z5|?1bwu}zpIfsDGD*Q+ejt=(~Uq!?(D4q278kZP3NKAIdbX+Ml$Tx)VVzr#D_=~tj zM|QKoa;_AcUk)5zK?n$=saiaFvLE1>*DDd>p$k}lTynL5KVNn~tpCMCv<61yjf_hJ zY#~Q6uLkN+3NF6b_>DU9|9FAEoKkZ&dc@27HapJ%ZhT$gN21yq4lW~Ok(oDA_0}YA zh}*Gv;xw^6!=BHt7KKzMaOVx74adXM&eTS~EC@tvSUnI3Hh>FTdGueVeKor%kRAHM zZqg_?P}o-2N}EGo2PI;g*uG?&?+~H$dG(qaVxex`#-633KI*l>G#sHal@!hZ)#%U7 zk@p-A_Uu@5`!0}pLgAT;Ee>6lmn_zY%ZnGAm{kuB(@9f9+-4@zHtDwf+?{+F4&b{o zgCD6?^}2Y1cDp@fl0E>oUOF{Wo-OAyv{F@P7CAVVqY@%eIcV8a^!&~9>i8-(6&!c9 zrRsCppBy7`(IM+xZ378_z5H@Kgm_-R_NnIKJ5-xQQST8tf zD0~BJZx!v=p6AQu*cW0Pu13JUU~q1pvl_+_|FAPa)>j?4W?YiE%v;Y-}qX+jk*=b*Vsuosv1!&-& z$8kcJa$%zy<(hO#|jy>IKhfltR=!v1)`ko`5R)H&4y#rgeze@v3C!PS$kh zY(yWQc#rYOVp~{`jhgAZ9hHENyga#56xp@Vjb#dBsQO6I|4OnIyxrA?iF$$k*TR(C zKZPl#R6cOz9~W?1Pkzx-Y{=1VG?h&WcBhrKqeg9f075SG!ssA=Fw5_i% zsw&$*b0Lq*@VrlcWV)kgNqy1>Qn+~o)uh!`47oVj%tm$kfLa(eG|)Rxp~8EsJh`P9 zkw^SczBoNA+B#w}jkn9a)0Z}4Eq-u*?zyS=8x)`wBEDNKQv+3kx)3_J2N!ial?268!SfT1d2`9bIgq2%{jESH9WE; zB+(xh9^@yRnPE|z-C^a64~m8LQqyW-tn0~hRMm^!w`8?hX^Ay%6_weCDsT1J0$jt& zb?qGDkQ)=wFhW6zS26f!x?&w-zwCx< zDk;6uFzkc&_mlCF^1P}+uI-djF@cy-=5N@_q3uwGE{>_4oA+H;-e-CNTS51AWJb0o z(OZxDo;#-jTbT(0vkUqtR9p(v&R(R|w2XtchjlDBFpOiSm(XA%>40VPtb#0mxuG0K zZ{uUzF*U^%@unlrX^T1+bRTGBBFeP;+{etKHuP-Kt>ZKEw2|KP$&FsXrGQaAz%pJr z1%UQBx{NYvzUiJH$3;|d7DlmcjXi`w&62s%(+%ez#=#ID11aLT$kBepmaCNvo){_r z193BurdYOt-Bg3z;}`jAEH}ZV`TEoO^dJ3p{3q|Y-lE{7*p_ayoE{ne+Wz4xburM7 zsGkZ2iM!8YyJseUK71}{nLMbVbvpkGUS@M9c?LYp6l2X9)({q%9_wXS|BdC=BSfhs zI|F;gCy}Zi|21bf1Gd4LhIh;H*StX_qR^qs6U`5u`TbW%G!%XX9WppYl9~6IECrZ} zWi$Pc)T}-Au^B$(%O&x>a`n8)ts4kHNmwev%^-WTcDb_Jw(AGceiR?&_O1XG-qts& zO6Sk>$bPuE(fN)=K*E#taQ0LJQN-pu)LDA10XLKJ_=$8|P>gI%g zT=uXFOtZ!qw{MZUp4+ax>iJhVbL`re!`-Dt&Vh5!g~z~=G!+62_2>Kc%rEh%ulPsy9AxF z$e&{!qwN8IZCh4hSoX0YBB?W1xDysII7Vd(yzC8X$gN#W8T6ohiXN3P6)EE?4inoI zP}DW%7iWkYukhS_>s>pqVhj7}p^(3<53`xigA-pK+qvm+Gvn5yVYyf$mdEN(jjjnfis z8lmnuM?IMWpE%ikrs8&9BmmuxHs0znP4cGf*UwOX0f*}eWti7_-s^?IxllGaK%qq6 zc4IqqD+f{NEnjU$2XtGVa{m3e(e?*7>R^fLt2>GUFrNy7B3I*t3?N|GS6XXUtF9 ztbL;sewJz(-y}${+dpmWfq%2HkML<`*zn?z|E=t2RK+7_K~_(@}QO(!&aXiQ? zODFK|!g|w$JbR~^!2gW$```b!|9yi-DscE^KIffEL;YKWIqmgCZf=zjten+#SQ3_- zTe;n~lNQKYTPB*?*2^uiT*IkAXXC=HvXie8?@g-Gn&vpl{&OUK;+Fhs${H=U`L=wF zAnF13-$wR`PUS}?8TxS}Sc8OuB5LM`8Y2YIx1`p)`cdBPgsGO4b8zT~g*VX%d;DPC z>rO(~-4xDrNba-bLt&$08#qpeM)cr-{Blk)O$T}FFPDs&HI0oo#DuYN^nTovpeW0I zw0pW_c-QqRL8uxx>Y)z3NePQ>{B3n2%qAe?(AJEaQSvwb_Ep2My2-A1$AqYtY)3(2g2{>nuG%;)Qlx zu}TG3vMFsbir4HzykRd+oxa74+$dD}etY%LKjgLlf+OgKok>b7Tn?sk1O2e zL0qHYfk1v9_tUi5L=z!vh+MEl+D*e|MeQ1ArZ~PqCl9DjUio@&BUp@+RPnF&wDYh2 z)t>hM)W(i3k0I+l^I1-Ybhmq{kSK5diLJmIvQUu-gVteXrhZLM%p&fe#x1DLZ;+X z*sP%icwcYJ(IL~+4$)RIitn$Nlrqz)wP?9*n>PtOxb}T{mG}slbQ|*eTP|nH+xZO_ z*6Uuv&Ree5WS+XA?pUGWpp5s2Y0)QcZ1g_(W;?sB90OwU;5N)h|YG|iO5fQ$~0d9o%l9QOUUySt>L+^ESg=c?3>nux;9Bvswn zuefv|%osg5KDLqCd*8|p&=FBM9V1v$73|#{e0=&lTa?S8_mz&C!u(QCJi+8c`FQd4 ze!0l!u?XKEm4#^O7`16VHkc1`aqaLOwFpNbHGE#sdY!1?f2v$xcele$lqm$Y>=lRF zK6G9bW0;)PEjAznTMasQ)v8_HPI8c)1@9YnlF<+3e5ze$rXB_^%B$SJ$57lH+tS?1 zlGvqKcdT=tCu1~jQ~11ZEWS1j4eX=q<$Yww*1{Bqb`ZE9EEEOf;Cx351P#Y*E4Ua~ zD7n6G1a}%9-KtQq=Ga6YDNj}w;$fU`!yRV`cJDYuzfc7^OePDDf?Vue$k!LwENugf zQM;Q8%YK1Y?+p(MjYRr`qv*j}T1cI~^9lcltY6WN8y+^w6Z_R(BqxqWv8Bz1pHn&R zr1sYkw=5j;*^;Su_{FMaw+$X02s*kR{Qbk?429AG%7H>31!$4>!hf<}$Jm(M`!YuL)VAg%0y#ipMW{Ho zU2e9a#qQc`E*qr{kQLody7i_`dA?)KXzPZB-~YTf{pXjQT4zw;Cze&sfuU_X$5?*c zX-B_KX;l4TU}vm~0?n(Y!PP~z!SvO_;G^VEO2WtHd4-EK8e*WgKOzTN5|0H=j3GC_ zQDrrGLDwWa6z-R-nqPkUkF)#(l}D4VMqT?fWXvJ0Au*9C;&vLfn{;+t-nw5bheYk zrv?1Tl428LDrPGwk3=+>2y<`;tKxXO*nb7*-B$QiWKlzQ=1JFSugX-Z>rLK8__j#T znc(`u70Pj;vYP5Cx8IXvR!bc4z!_2>ucx$9zv``>7<3HOIPv8?tK5`|HRxwyN_9dM zUG)@xWXn2lPQEJlQa$a}QoGXi_(qmnNW(%uD-WIP*&so&LJvWa_L^03*p}T~t?1G? zQrn|52U1Z|rahLE=CJ88g~E%nT5+J8%&hF#D0u=^W*(&Z(1h48)jO5oPQ|vHF`;@@ zE;4%gGt~i}(eLk{j$U24?@JBpREjVQ>+iY_!t;&F9x;0m&5ND~Vy|FdKg*IqG8g=o zn%W|Ma5jU%G##d%@qMStCJgsGk+e}H((74biga&b!qSlpGWT|N;7|!Gq@nc02@cUI zRc+A%1>7AkksiDNUp)bOQSVt-y=|65bCDev7D>pw0G zF+{IzVwp-vu~n&GV>B}ohVsJ7)^wEO`-tUH2WpYPHCdqEVlo_5joK9bYfN?a^Z!gt z6+tgML*5W+C6=5M_zG&^h9r)HgZr~&-o_VEL*e{F%F${fX$I(PB)B7Ca|_m}&AZ?n~M$7u17XTNQlNC-6hc2uwKI2^~mRJu+x z=)4wr+jJ~kHSi|fSNz1}!+Uy1%@q#&;g6Fy3w2Jn-h>R4dQlxZ9P~vGNWT>f7oTp0 z27xyxv{lwKT?PtWa|hQF6WvcDB(=GZ(xQd=WiC~U#xYvFj?{31Hi)K?KZ($pb}>U; z7ec%T$15M?XWmO4_U$QF7bnIs1X$zm2{^Y{i@E-)4bpT^H`iXW9DntXyAbuAMoM8A z`n`6*qF-S56!rGkUOFj?+K+zi-$X3CufTBVSC6R&{mK}YvHyD_iDXTs;$OIMiRQFp zJ41K7TO;aP)3ZEL6ks`LNn}aIIK}kx zTlED$pbpg_ezL(%`zSIn^9iHk(b(upe@oZHwW)u0>gr#83T5bWJi_5~=1;~XwKp}^ zrprusz+_oFT?1SraClN+zEJT@P962j$Npbm{62(U_h6n#!}s#o1nHeHZg^RH8t*4n z__1%i?RR&IR(1Cz`W*~3*5)_6qEDs`sFvjs@NIb1JZ&l}d|`7Ma>mwEj~jy2`({q* za3IrGsW(f}9=q%@k(4xnZ#)d&l*vA0)$A{}Oq|voQX!A%7&3L=IALe`-fb<&I~kLv8&2XQ&+CNTLH!J#ju>F6|z~oQQ$P47r|vz zX(|xVnnrcp9o?v9z*u2`H>&?qoIkc zhF!Owd@2deguOAt=|W$m#toMAM62c)tT$>a#f#UpkTWnmBIUP5;^aq|9vKiuL0vK0!OCL5oc zScwirk-%AoZfjl=u_uDBw0^QSKFA-d&W{6EAvDN=(XL#x~3G z#R}>wl6m(l+>g1_;`3?}g`YG8#s`K5##BLr9oGh(HtGAxEBjt9Ce5&EdVEfyIK<4e zXEkgyQDAT6Daw5rm9HLHIHn}63H z|H0qlFjxJ(pJc~G8|mDe_2`AR1)@vLygh729f1umEy{dd3yrFANjIWOl0)6Q!r3w0 z-6jXjh}*fK_{6-h$Ps3cO<(ca#PNpSw1cza; zwj3D(jBtpsmJSPRS0#Cd+Q?aTHl3v#l{rU}hXA#z*CH?+(nDydbF>I!(X-OghsrK* zBkz=fBbkbAOM|UIqZ77`UiS$M1rygQ^wMI5F|a4-dXtV~$>HJEB9+Z_-^j!vCRB&` zs3-tM>f?|hk(!cVxRPEv2-Ox1xMAES|LVf83WUdn_a8BP849yXQK|U4cQ(xNrpWo)09i z2~@deu36!|3QG9#nQL%N0f{Q!N}Ux21{7A84lp>8wLO;;heSoCXIrg96>dHq(E8im z;NrMv?D>o0-x_{C9^Je@+dh%-pqdlwsqp8btn<%BS&;jMXL6X5m=%gfBiygnUkM7c z9h;JtMNJWa@_;8-O_gb-R>GE3eJh;r*rDQ*Ns(CzFu$&3@=Vlg;>dVK_-^U&p){3_ z1Ui)?dcF3EhC(3n+hCkk7&fYtSGYUp%P?7Jue)4~TKUGYvB_p?q;2Nbe{W-=M9SM; ziVk(%)L*Gse}3VS77~_L(JCz~>D;-sPXi+go zM=Ks>1N=y*mByEvE;WPZ%^UPww7SAM0r|a&`4wF8c@I025pn5IB;VI08#w2~{q0=z zkej1+PZ`zx2hUmRmHR-!-scXn#K=4bF|nFsExmYe4Ns~5UbT69TdvcePeJZ`8MClJ zs2=2yWcsc+Un7sUoPWei_u-L!*~|Df`UG1?KeK60k!t}8E}JYYR(SDatgS`XqFhe} z(@Lis=p=t$80;LKJ~6kw8+XUfU2aKX31GhJsad*ab?@N%I8D=gb@v+@nUd;oV{XCz zm*KnwP`|TvpQkCTw-~ET&q;4ZvVJ#&J}Hq#E2x6YCJAy8%Lo*{rcv|(NXo&@*Oa2x z@3T&&BT*@g!Tkd|-anvzNpsR39-_5(932teXXwf7!tlr15_BT`1FXN{1O7Z zOGvNRs-{w(+vQ)bD%E4`6eKkX|wIn;`+z_!Av>OP7&8W!MmO4e@o=`G`2urhM>^uc`9dFulu4}wnC#^ zq~%cVZDC^PV-je~9T62vzwf%Zlif)A<3bOu!pHeF{?tOT4f`Kj`#}kB4QBYoOEJk$ zD4pex{;h7X@ZW;+FScuc`{%R$KW_cs1?AcP49Y*7)U-d2UX@2~2*<>+4H2oRKZ(CB zwIp4!1H5Fq_k9K@Tqhq{WWXy4Yri`!>gMR;FIFTegew$W`Csl*$Rj!rDpZ+9#Uf#T z6>}H&>;wYt1-!VOf!kL+j7n z{ryBw|NiO1c+a0L{`w#L@PD^!v3t-5fL6-eaYanLdMwkCr0>JFn`ld{Nmz}ZWTnP( zUH_|CF3D@RW%crY$GpqG)r-WZdH5^X1br?P+?2igaopmc;aSFGV(71Vga2{J|GDjX z`Rn*`kQoK(-E}1NZD~`tz6;BK-FYQ&B7nV<@%ap{C-f_w%S;dJRpXPBZ=tQG*ZkKv zXlgaoZhyUS@%v%i-i3)Mi#9u?)qrbff@ItsN>Ps`gQkb3uW)x=2;EySR_6`<#~>;5P8We^kg?QcZ)sp|D6P%TkrDYcPQ98P zR;F1(CL8`fRFG~OZk(j4d1X{vs^xJNif^QfuXWaFfaA1KP8knD(s$J@DQZ`-c@(-? z`ro%4AKIA6*Qs@Siuqb_pytNWj)lPciV^$=;-~6}DqcuajfkH6bJ^m1!aO_XOz{O{ z5mBnyNm-WiYWXq-S@63&#niZFQ41q85KX>{ba#DD<`#89rFYhsBf_rYX8TDDk{Wu4FQs}nprJ0 zj}AJvT`md|oiV&{!K~mQBEJ!WHR5wy)Gxe`iZbA@V${Kfzs4vdMamwAzOc!Yo($&{ zF_#Z^dsaHK(TFI{ttc6_gId*;OuOp{VDMB3zdVx9jG(;k2H#LNT#M4ufPr`C4ZhOnHZrwUGchgHct1!#e-l}*KVgq@XdA06sHVYr>g_M? zM~?@#p}VT9%frUW?aCCgbGnClSl7)Ya37B~P+P8&+*6SHZDCdN3TXf?hv}uAv`&V> z`1h24+5zu~(tN1@?avE==0)no@1ZSEWIN4R24Mn zn{{~fWQRza9zVg?HqTzR+l-3)nK9YC+GuwM-#)k1En7X`R?TL=W<8%+dEw%W-SdJdCc zZpQv`!Tpa5UsuunWm)^&v8R7r_>oi-qrkKE`=4FCAorilg0}CUi0-5qJwF7l>bA1J zTk++Um#TcNju>rR!}gxHl=NnnwM?*En*HD&AKz)j6WB*XOBlc3R#Gic&U(a)2eDxe zeO%8@%n!-vCU{2+*hYgx-A2i@zdm(g)bJ<4in7h5Np~RDP(gLVRWdJFoUUj@S9={9 zM+s!xD8c7Mzd0Ih-moq6(fhQt zR=rrytW+oLdHjhBY!OJCw=W~$K%@eKR-EH%CI<701@+KAY|n>Q#0iqN=PLtd5pcXU zEiF|CnDsoRQo>WhkR!bkQV%+vsC94GVf93PG{15081~8KqW;OfctnSJ^+l@jFzQ~7 zG9_)=ipCNq&x*L+3^g4p!A_s*NG@CN4~Q$*XN@O6cV1aZ|0Q+vPFKz>6sP8DT6L9w z-(R&&%}HMNxjJIp1uz|9S}J@^9hNH}&LJEUXY9LFVQOGD3XL3fh*E0rx)u}THkxHp zZ&aD4!7~yOku%k2Cki@?E&m?BV^|G-{j-`W&U<|}hSI6(xzR5wAimcYs!8W~giG^6 zvN`+^7HnDXH9pU1+m&BN3t4)(J))a_Q-5Cv*{0x`X=I%%v#0yz;X?mC4 z&FaNJF39b&+}9ItMNg}mE%yp52YaEmQvT%9tlQo6>zMnjBh!^x3ZeExW{*pVr6H12 z#`6lPdD{A>ro!g8M++fdZllR5kKgYSInqP($3P~n{Ri!YE8MD17++hJrMu>KsQVkB ze$OdrYYvHs-sQZdNeczi_9EP_l-e>aOWoN89nGEJr=Omw03fItucu2l%-4WDo)2t^ z^DQBlo?nKlamTiZjrXes1o}WE+rPMjNB>? zO9Iww_=&$fno0OX{8{~K`(#&CqW$2MJlYHNrVWToIe31{Yinn{W%_4UVFDv1_EEVW zl=1WA_j1n6_x`43g;)C}Rw@Xp2B+s*madMMT;38*Jejw|j@@Pfhll3Vzef&` z6%M_4EZyxcZNDY%pR=;tlto^Tt%Mn2Ol3NI8E~odSvFN`1ZoP2v&b@f0HIG6O6qSA zEZcd!VXKS@p@hrIu)W^LZ==<-%?_9|@*Sm3rdR~HcqIh6@<_!IIkEr9w(iVOMO#rqDix0^=&Pt6g9UPe^%enHH|BAAY0*qu53vRFWJR07nZ zd~!jGe1Fw5NZ2 zV*mBWozHbFPiWTD`yMf#FJ`b#ILh_g)$3$cmA#trP)Y_s!jp^alu-Am&nZoxUi?L z6U_Nmb#;1mE^4%}@^XJ3mwzS|S7}GSuzH=HH;8O}@Kjb&^~=nGVZe(!AL4es&LGrP z*ni_um&CF`Q(hTnIj=v=#I3>xP_Pgm4!y;N_JZ#rnN13#7!k|1;wPY@0}IeC(5aoc zkz1lqw+A`r%{h9IvH6TaH0U@n$UyTi0d>)T4XFRcZ}ER<0_+UCIp|QeVbuz!gRw|3 zD?8rX(9kx_;+EZ62E(Pa1z1;HK1M}reTmrpkVC4_i1MX;t~7z>j*oPVpRBu24_Hi0 z$a(PCklKH6V=JAF9PMW6osq8T5+q%N4xp&QsH=&d{qmcU_ZO|8 zUz}!>N|j3n?aT7O@DG;7wXZ1<^R(6sTi9B-fMlk=m$T?;{i@eW^U9Ic8OtW3u-sE6 zQn%7+H3u)Ery_vyvjwDP?6s48XXMA~EgUQ+lAS1xP(yrSl-76jy_I)CGVD5@mf4*l z?oltYD(OB`#_N4nGS;Aapx1>;hiY6q>8C)ehCeURLCi6kTuDgG6^iD= z8*&RcJGi#i0$M1NjOb_aIUfqe7*xaH`Yq{r+tUQ?|xT-XBEH;Ff&Xq?}n zZ!Lq*E6xRHh=J%we`YqtdM1w#cs?r=G98+zD#)py@J5wt;woANu&(e_f}!+~<dg{ z_bGFlxC6Mqa+Mgb&WvG)ti><0bve2;S4@iqVZ%jTStrO7@r|ox)MAloT-BjS&%kPR zCVFYAR+$l>d1j7|D3hU%F)oXXX!i;M&BaX|7R@w5J@FKh*7poOgRUmAm5m^I3w7Uj zpK0DHT>mjJ+dPF}3^G@U4kGtcv!jPRq14rg!%jfqdBX4?7YMa~T!=CAY}>s4T8ajh z>1L$`x7|h>U^O#e6in;pM;fLsDw^aa-mram^z!$4ZKil>hj)8@D84~$ZrEU;-Pq_? znt^R=_vwl0#L22k$^7*sBdBk9*wAF!8fA(Ahw-Jxm>zN9*XBj*>6}$fA>(X=WUIay z*ff>>&5?Bj$w=ydVnD_E_BKcaFu6N7tg>F8Rbab+y=>Pi7p~_}eY)oK#U^DAQv41) zBf&Kc)8xGs)m=e~e7ITFtTdzS=cYWdY_-v}RI7Vq|FC$x@PYeO*?mZs5Mw;9!^LYcNy7ymhG_<&d~`->2#ig7 z+*hoXLgGh?1L0m?e40efFXc+#jJl`HC|jW3*c?d^_Ut#GyC5a<<^ zFfHNW!8_muq6Qi*zIxu7j4pIWOow5Om5^bJ2Hpc?vgkltDWHN`!8AF4I_fw8F>^~b z!2za8e8{|` zxggDX2;yNHj&;S&L+SJ&AS>w(y=8aF;`Nh&OwYqK*rOp`zp(K6)RolKEbD=o`!7=+ zLOpSlHQ;-<1YhFacvJ^$*~;C`IBl!dk%v ztrCMu6(jo5s&jt)Cy!3pHzHjuCgl@X_m3nGHv1+aCd5O0Ced9_1u;-S(3U1>0~m9F zfJQ2!9Q{7l5z#1#PG^?IN6X7lYgMeHsJb5v%$u}dcda8r`_7vP?-a#q7Ke1_$S{T^ z9*S+ai>@X9f#e+Sd0sVXm8K_7BJZhfxn_y%+!V)%ej*GO)Em<)Zu$h~Xu`w1PgCjcHIatfquMnQYiW2qM;L|!hsPCWPywcax!JX@TM@mJGYANtr-X4{yuJSp za=exJ9u#%f~jbB$geW31Tp_=LFd6dL41^*^J;a$Z1xDX&5W5;#G%z>VdG z_hfNpH(Ee%zL^#zgoRduMhvt&J|?0gf|R8Wtf=zK8kEESzVVo#Yiu4qr*jYI^J_C_|c=%1Hbk@b{J&+e4YM5L9xZlC}E zsC&<-wz6zpl(NfZ8{+^NOr}iEHi#Unh$fpLFo<9i1c;nLq_Ry$fXPUtGC@KjnVe18 z1Q7%nM2;q#oJEGWUEO`UyYA~Z-aX@#nRRxU<)$8e2ai_hD;cQ52XS^yJie~S-ak(jkGvzG1Z z9ne_iSOCc`=aHK?4+dce^jFmB_|Iv7ZmK-Wt@n#*{NSV_il?0EugZWFqF;;#Pg6abDN9HVkd-At=}y2#`tf%<)>&o2`A8ppO@sM_pq>yZvao*FO? zpz4z-Ww{f@+>oqh0iebCr45R$HXXR(C}r|b>tU6UoLBHSr(94;;AWBHr9I2&Rm+Bm zKf=B%e>5ady727xrQOVW|5~rL5oZn*LLL=zYC-+-%m`{f@+YpYd!JPbwzmj59k(4> z3&OXIsUx%L^h)p|duqsR^Fc;RN~Yvqu$GlSkGcCGNW^4s*X6ubKya(+h@oGWw6(HG ziL&yKk=d3hS?q^-%1x3^m8i8P4?!vA`04S{?S8qa$(e^+tx_rUAGazR_Q(8Po;(+R zE2T4)rYVpq&n6ePM)9FejB^?(Kw4CroO=00c(Jjqa~0q1ZsZEcZaHMjHj{M+(0Wx)kU;_~99#9&$;W~OhH#lYYwCOgZL-go07mIV>W@+qi**qu-yK{UR(E%-7L zveT??+|81lv&VNu_UN;cNBj*-O%K8QzqwyVrk%^=0ivZ5@&y+H`M*Z|(bmuY9a4hW@c=i{i3xf-BP&>3aj)+2}%5( zldFD`n8$5s$+>kCUbIf0)3i;4on0d`mQP1DiCv(xvqwZkmP9d31LD91vfhtWh2d2_=+C6WLB@K2^w-$VtSnL?)0cjFwL{n&u&g6Q|; zp#kE{Y6K7%ygfkKZ5;y=j^{-+%G54G_NjXz<9K+7bpZ1Z3^jK6S*kdYJU=K-P%WJx z%yb;lKTT&HGnWnN7y6258~sY?0FasQ`q_l~=7fZo0Q$(~6I8t)iE=m9%)DHgv|)yq z?byzUI4Pjkk=zdw*q1$ngdvLp(gGq$<>}d~ff>r>#_#Ycg*JctfgCIoK(qk z2M&(CBCB+Ad9hgf5!S8SvLhc8d;aR0aTEQ;DJ3Rj7mm*npna#HWg+QX9=F-^S=3lc z5M$iBtaeUb@saquFX`W#WdFN>E~=w7m-h#EEsqA(ei#Y7Exm+xKfmo;A1JQ z3KGi5s5E%mUYJ|F1SPajf>GX9VEKm=ee_c++9gDTyI?+*Pb`>wKSqkK1qElnh1^Ef z^*vTe?Bc`~+(?*~d>VJ7z}qa1!!ftJ5Mp@iNHoB7Gwhz6)z<>U!l*JmTm9_cwd=5} z@!;^i+f1O?lIr59HjMrKS_@R_U2-X{T6=Kg`Uyj&oc~*H1crq*n*qElUk05`hJ)`lI!q+Jdv+ue>ac0)^saeZ&S*TNSTJLccZ+lVa``cnz2xu&M+3v&J9LhuOy08qG zvx7T_YCbPHX97J`)j@=vO=Ln?DqCs6xo)l6RB_5k6<(4*QXJ#ImUI9=&aAa%p2AILwIa8F`h@kbl6C)6(e5%?p!`$ae$Ts? z8-=ZtK@3-9#V$Y@X|wtMC61^D1JLDS3L8QpU(W?O=-Gm zV(y&TyE!%eRG6T5F`?ff{jz;Sjy9=0uI-?K(QC{8fZ>kULY!5GQJ%aBavGVri(F~n z6;$zFJ4~5E_WBBGo!KrY(FiN9wXcs<2biba)?XT0?((2`WGi_teOJ&`(9PZpJ@m{) zmOOx*gCjANF`C`ozpff!@=TgW`dHQkNKT%{w$zl4norj9p?FYeoYN!{nLAuJN2x*? zIY-$nEH;e7A#=*@y^KT|U|u6^Y$$8QLaYH1w3M^AxHPJ?P3NKsp>v?KzcA7qF+c7# zV#88d7`$_+{^m8F0`~?KK?$e&TGgKojn$hCn~Aq2ZfiJK>Q1(Bx%Byzc5ck~TN%3= z8-1D(ox)TPOXW_l+2b}J@kH%FOS)ZIZl?c1s+gP{yj-vbF;JdS}#1fR_Rws|U+63BRZHOH zy@Uk`_;}U?NNnIC*wLBNk}Nv|kD2TdyXuK*6;GgA=MlXY8C_Jw2*A*?DJfYE$Ij$C z-YU7oc(s|~B2gFsISj(%q}g*B!`@p6n~izK`j|Jelt{G2p1A!|&7XWja{XYHYJHmx z`K++|!H~0Rp>mP@r=4$Xme)(e=-;a<5rcm4@vd%sv~l)pMPZBQnp^=kPuGV)=%oe( z0DX$0{SC||pmCS%GK~YW+~F7-hhAz!C=&+U(7S3jN89!M5UA4@< zD>B+Ip>=?Kw(JjY+mb)JUb`DG`VFd7r5=iFg+Dv4)6v?$$U9MVnuKV6OM|&C)Huxd zu5rQnau1tMm!nE^&ie0+4UbpXI4z_=hWbm9=kD^DEcf%qAlv`x0wR6>{hV;dpxjK^ z%Q2jct!QvE@wlg~az4PUU-jVpahFT@y3KMn>S=9@#T8l6qKPwzpL|y?jF7M_^K)-= zhG#%130J<-+EN~{8AJ)(8LW@0$>k)g?}*687{mSc=2_{>^s;F*SF7|WKTGk$yf%IT0n+OEf<8av^Re_#8g`4hij zs0|e2Ib{}@sf1A}EFuh{j@=-ml0AsZ?KH<=C0LfcU8pJzY051Hr_~!#6(b_MuW*~y zPPiF{SJSju`qs99Mf9YrlvLGh^!x9UWUj+wsC!tsQhf91R|H^6r{mcdAIn%wwiqd0 zslWFycNqCH6G*fHT8InzSB)x?nC_9%25Xe+6nhWHCc8k}Kr|NT&NOVVM}NXxe_ili zalC9oqn+D18F~o>N?!_VZeLEJH`p4>=!Ieh^vlEZa+BzPm5p^t!$1izLUn{q%a;Ia0)HR+}Yl0@*FRr;$ zgCY%#>AzOVu2SYeTI4Uc$r_@epcHUPOkm|6cVqc1t<`gw^XGm!^TnV6gnEiTlMZ%c z!VVcA)wUWHHDB6*O>Yxrh?g5D?QPyZs9uXge*IEFt2UCluyty6=t<2qax?^i5AJc9 zO~xmEpb)%Q2Z2xLmo!(syQ9>@)>AxYLcc{me8$G*e}`a4jik>upZT;&t4B@Uma-+?ob|d|#jwrF zzYvG21bt}|^#}F{b~uZ^Kgw_D3Dl9uV%3nxWQubMwqxuHc5Yl&lAYBbO_tIgtvnnR z2GMEo;;e`V+0`{EAHzKTkjmIl{as((iIZ-4sKV40k1Ow?rDwtPYRk2aX^ z9+)_4!nTOIhRk}9xA8F>|pJA zu72T9dDf?D@L=}qR1%9!nQT@Gjm*h(WJUsYBQ;S@G7cHJ@Bmkr*&*dsR}}rgP5*s3 zsU#xLS#RT2b%BFQ_<_c7bceLnwWk-W-uxO1*k@JW{L+!WBD@FOU}hTnci6Jta4-j> zPSs?LzCjQUjXEl8Q`_^5YO~9uj?472W93`N@nIgiZ|5C#*UZ*24J20jPfDId?rzkj zl+dqHyB*?sFT9MMVM-r%xoL3}bIvJ#(-ACXAu~11)gA+E?`Lj<*J8+RP_|AV2KBsW zhOwJLJ<8h#X6*(Dt+sYaoRy@q4tE3(UKLDiafJ(MSvkyY&#ld!wMO`E=9%Z%>a$sM zti$J8m|8EW-1eq0^UkUn4iYw#60|qx#qhzeE@s^gtRh~tUa)W4 z4vk|>eK-d~$6{d(^ft~K9uM3;pbD5z$46j}!X_0$K<(7t!xEB(#5vg}{}pg2+$Xnp9$6 z`xYGK6=>2g8wp=)rj4+Jq}?cpM?5d_qh8%2X0)2|)Rj$og#A=lx257>GaqO6R&%S^ zdlT$ZBC9Rhw#LRcjh9Cd@Y?1U{`e%LjnU@#FLSAr)4r*+gw`I9Pa!nx0!FZOOpIvr zJ)xLdCLtNBFqc=hKb1TGTs~6k-Ba(-Ka;vl37$&Ps?IlLE__z1;vv9gz$IJDi4mOy z5Qc^WIvdKa%F0@VLuD^JsZ5W($1OAST%MrTI7#ozJDd2(JMUNXm$oh1UwCy3mc$g+ z@*UKVW_i%^{?bbK;z2{ZkJ*%zxptGdtMUZ{!?{kQh6060-s9|adE>Uf3FBfv z)jjQS)}CaMM+|KFkeB~7@AAZODu<1#!6q}|amvOT+o;E|if9K3lpgJC-I5LVGq8|! z*+cNgjZ5U#?|4S7FAevwSU7hSTaHD9A0OpM7gkSPsB*olLn{BFC5hI=4&#y=8JV$T zke7ynr`241!$LO-l(DaRVP!^HpU?t!1*S`7nMemQXpCvVgr;onQuA6-wt=YK649094=7XFe@y{KmzJ#MUkEm+O^DIs^;iC*YP6h~@j#$k>)i7oJ2|-nuNmy5&3GVM5;BMu*i>gzV z4*6;4>qn`X6akfiD>8C>zsax)`<)NEx7YnjpccZsnl0>oWv>wG$^5X1x+N=+1b8^a z!r;*HzMz*{u7N#4V6m=VWS*+Z)dU@hLQ4$`>wr4g{Q9KXf^0e^*K4Gy3>*(63WA}U& z1L|F9tew?ocaWMDW_H&=J3h)tCjIq`%yeqD;b}|{MJ$0@EpnNWC4{9y!(9exRO!c9& zOru%QY~CtXMt|;LeF%zPlL4b( zEiQ4hV#9HC+kW0&c4=mIeQgGleCcTHbenG3N?b5_S?l~(TBKw-crb}ps7H-%*Ox9v`MYWQrCR>ZZ!^R!a2|M-{YKrxs9Z$f8M`HUc0???|Sh?kek9Be<+LhSjZ7K z02la~OrB+7sb{?9<=x0ZmhqM+6w+x+O$wqM^{BYY|H{BkC2_lMGbugcQ8P=-5(k%YI7W?!~xp>vx@ z5&Ek&1@c2_!4s0NH41)hMjJVbg_#V6FIFmrd1zPj*y;w?yH!2&QU12B3>E)5tr+^Q zvnpi3<-DTYbhNFDlvIQ0(QAy(;H5cRj`b8aui0j~5#eyqX*5JF9RwSXzmbA7OG_Ra z#@cIYb8~XYi2XA`^TW;&tB~5pfSIL&A_s&(a?I)|b zq(peIjg@yQRPjyt(B7nJBGjHuJt3ypK-*gj+~cE%JTU`#9n5R3<8OFpV}jzcM;7f+h;5ve+KOP8rwYBjq{d1XK@I} ztpu4-#Sb;hswrIrpG*O~;+g40PKqojq_hb-Kaxr`zKwIhl<-8QhFEjoSpeI1w5}s? zd$#%+NO=JnT&;(af2dp{znHRan!G5(L4=WmUR~i{GGfpfmQPUKq%lxE*y|B(Yuk1C zZS?PrTG|S;yp}T;T%m8S#LVz%!wtpW)YYuw4#x$Q}HD?sPZ%RXzH^sYr?L@1~v z9P}6Fjt~FN-0>G7zyG^Zc>42-IzIHXg^><{%P(p*tQlytjN??Uxr;cMA`)wHXjA|j zOPv2)d{LgLkd)zjAyIrqR$_idM!=Hf6sEr&u+LHKlgYEvaj(<^=6noaeG85a8Ikyo zv6ulc7GQ^x>W~3c4(XA?j^@W+;ilqa0Bdn`KBy@_e)T>v{uDDAatO$j^wymC{BcF5 z_2S@)?6!X`Yj?!xG|5XUuyl5RZ{_ld8tdSbF3$^NwTt(K$B@95irIsfD>99o_7RJ$ zVAEp2p-9$%j9-G)&vRQwS;hdwzwX67OMe7xv;;ry1LbBQ(@3 zTsGeJ2tCr>Xnb+kV9U4WK68O5ySLp9(CFbH_dz&tdqI%gHFszf`konsUQjngnBZiN!jA_Z$ zNZGCyVcAH@VkQPF6LSx8cHndsGCzM)o!az7zqy)&v<#{De;u$Mn$5}W;JmnVoyHHe ztdF8bE;~#G_>dYIl?#^#>w88D+O-nJ3n^f<(QQ~Q*5#Jv67q!%lT8cY;C zZJyP1%U;r|sevGw~t_6<8AMz-Lk4d06U=v52A@0Bu&R=q?oum7{Q`}xB^ z@VsSzZ@zo^pYgl{;%$3f>9|}w)=~{JLW-!K9h4>VVAOvjcuim|0v^7|1CRIA~RQ(ZWPN6c?!Cx zuhyBKJ)P@_A?J&Qd76saZ;BJiN8MGSZ`6^6{r)j%IQ+$Qq&imyxvQqv#xqZ89SHTj z*U+;)Y16>KE^K-4$cU4sQ!+e`n==p8*&c8>*uk4!5S?dbk`h&f1#j}hO7z^1^+)9~ zzZB@E*L#h5OFN63E_O$*7p3T+N1$r2T0syk4gV_ScJJ5&l!o#HW^D0YfQ8gO}m#Mo5)tq3>^Q5uR1eu_z zwxjVlGrNfNDNI*84JNG4`4!*qMJ%5x1(v`wm=G4}loS;f#QX-;ag7MJcGbj{_=rcO0 zX}^Y^6fi7IhP|bH7oJ-#opcQ%jB?=B1Q3kjOiF@PfVQMMCui!{-XNzf;t2X7@OY=9J#$qXjt^Cqsm!0l{y1fho90p(oA0OdDkWl{SM*@|U53s8|Cp@vK6sZ#? zCT@ZWlHFAKoM}|aRAvsmCW}ez>UMS3A9oRo5A}a%do^T0P6Z>6MEUnCOMXLn9muqb zT}LMlC=5E+k5a=YLQCrHs${lIB)PPVG$DFuh?pe671^Wg===6-;(WX@$o*~tM@oxf zMZe(d=y^}7KDHkfUsbIYq_2)Rp)3H#7Ji%9RxZQj{6uG}EWNcYcD=oHorBBd@=s2? z!oL`jU~vOHeM5Pa4^5-7Pwxd@U#@M zViWoeLaa)HO;asZjDu}9q~dl|wyE zDpGCa#WO|S8Wn>9qyx}DvcAPpC%vJog4uB8f~Y9y2*j?>m`VnUXPdurSJ$~DDcu!M zpAu@Qt`pIzDPKv~8dk{f*p$2b%n;`4<) z3y|rEZD|1u6bfP;$*j~;W)F_nN#f%;dHS-mkl1yJ=?{KrhyGh7;GCcLA?oq8GQ3(Z64*F{ z;0d(+lo_Ux6`UmiDvsae5&bU0*y!No#+yuvBdHY`azLBZqp_njMc5iGx^>Pl)VR?p~QVa5IC+;u06!Wmrk{fc6-~Q?JtG~!R{r}v>PghOW3Ne{xSbuq$h5bUe)p=#7~n`92c9vkS%WJvN)JrenVc`=h>j{Ol(|sp|X#xeM??UkhUywD8V*x z2R1VPC%E0)+*vvbzZ3QOl@p1k7G%VJ`bDqtfw*XcBDR0X;)_)A@buD`NQTVw-CBN7dS6hQ1TV{9u5FqeO zwTdx#iC0ywUDiQrKn0-sP!lXnLsM=60vUT`2a(bAG_MjD8Y$1M);aVQvOj#Nry|^k zE5c0~XsMYI6pcu6{f%aj>fl~u?qn4&LO+VlqweL+)`cI>kDktMbtA<8vb|<5x0H}WbMw>+k2%)tt-Cao|9E)) zby~Z^!>1mf8tEWZ1~00y18Wn7;^BNxy8mU?C}? zH(EY8XVjEvi>X{NQ+lxZ=4Mn8>)}xcE(QPum&-bi{YlKGpcq{6y-(Y+gkz?c8?qO) z(TZ-e{USr}%-B)-BEV5D;Ke?7SAq*6UnjI7RzCZzPlh4s#cO#-v3psVDx1L^MKjwy z^(W?hdNuK%&9g3b+i1+*{@jZ)G; zxuDU(VU=gx<3|SvN9I9g29&ePZS!_$D=Xosl{jjqrpm61+f}k3pOOw;Y29_Mi{2iJ zq`8$^P~nlQgXOX{0u7C)pfWz#s7KvJV?9_LQpHBrhE7TX0Zqx3(cs^L-v&J1uyj>} z2BlA8w6T>g4PGP(Y-t^CQJcoRUK9)#ZG)h&=*(V&7Ld`_hKiX*=h@Fh*uh0>E5IISxL63`t>tu^$Rge&2{xkpX2Hyc)Hf|6ZyZd8uc7nMlyPsXYy8w2ExS(1fvWq{TbWL-*f6yMU zyOWmTeqI<9G;^fnkw;}gX81~Ej!*l^gVLY4L<1g9e+ zmf4>wPa7NfOhcWoZNGKw%^UvNfLrs;98nM^*CNiaB+Tr@=1KK!T^}_v%9R>sn;04F zeV%tlwGlo$7+mQzIS3QlnD%a#^8wUc8VWCUbzwlehMrcNF^wq_<(V~(hFfHm2SHIj z+O%8^R-5%WE-owXSOY^H>2lfADN6q|>xT9FRSWk&%#Zu0y+cpijtl|YUx*2(GtiQ2 zlaHiKNL5vknyNL&tyTLVf$F%huy9mV95pp{2N!o}+aBC6J)PhlrTX)qE2#_+Sv1^m zxVbVH4n)ddFmbd)$j!>dYHF6CRUdKRvElEH%@yAud6v1HxgOxEl*p9cjQz{nw0hG0 zt_J|ZbXeh&3<_~Y#xDw{me&ekzIc0?Si9Of%_+hQTS}c*U&>)I%LruO*DgxRJos4d znu%9hvUuz!#9~?8AHp&-GB^8W8dsPt3py71=5%A~lemsk=aBiu$HF6Na@KL5QYnr!btP8mClx zs5Ex6QLgc>On~*PBH4EhRqthL_I+*)Y4v%8652}o8{V>uv0D4|;q4F*N;*BUVL5(| zw0AZ^K7@FIn0<k@f;sBk5;{8uE&>93+_WmIG2hT! zlDOv$XK+lyCXgW*mP*MwB91!A;ZuWpv)-vVc`vdAc#N4fWd!`plRAH2zK*o9vhnDp zl|Q){mK(`Jh#y{g$gQQ^|B#_;Y5TgEvht2%bsj{}DW14>?XFW1r;P?^q4Vr!Zxb6- z@{cAplcko7ae~zZ)GocLg7leP4oT@#aY&&fwM4%pZ~LkC4%@J7Kik$FiM8iNN@0z` zftERL6;a4I0lqIlSUXR${qQVEe_tR*o;1gB@}R)eeg9FYo`F?-1w$1B>>B!lGt*l4o2uVDcKv+FX)qXbsS?<}`W>dA-@_wj z;)acVI?STg@#O%KUn`#enMprOKMhAfYRkX*waB%tuYJa@ zeC~I>{YN0Jb}(CEsEdEwGswcjefjspg@tL{iV!!W$s@iSVc=e9eLVl>{TWLJNj2(t z=YD}@Aq!yME&+7R3D~LlVZZ%`5=l;CBbIvi>-~o`_y1w^0bp}?lBjz{76nZA-_QNG zBT}e$=b|FBMOb+FSj$&iYzlMYDI)%UUSRT{BIADjmowjtzI{dZk73%vvaRhuUh=~o zLUw_n9sg!SOL_O*-!Jw16m9n#qO+W>mph}3-LCzk#O<=I$%3efDYI^wktAvC+N{zg%+iU z`@v6M>@S55-l@ztl0aUOrOH(OS=BoIAE;^#-in*f$>|hxoz*J4 z$a2^vSrS?~%!%Bhh*M4RV}G!^B!2e0k_RRvo2AvZCw$DL-hj)dTg5KSs%D*qGdql4 zC%M&x)`T*F=kOVy>oo5U>p+&%s)FrK6_JT{WQ`JbLyVRt(kBTeR9_TlyF2AL-=yE_&L7f2v+pcV z=UL}|^EzvJtZ>+-&`M9(yZ4Wg);|!p&ffrR{tvFmD6V6sPi|b1l|H_tyQ$l_cjt=C zOzHgTe~tZ5R)22!ZuJKWY-v67a^Iao&Ki}^e99_6Hyq^ebCkURurRezdUJO`fk9nF=V3lkRUy9<)~C1fcvLm&cNK5B?&06W99h%sPJ& zz4^}6c?6q7D~w50Z-Uo2%ay+~b>=)9!kG&W^Ybm_f4<;UkC6ZU=mu%9s*r-%#gTuB%rX46UDji_z z6uf|TH=>CK&G3>bRVz^RDsllt+09)rbyPc=Th;@tbYlph5N&vK`^f^$fz*XCut`R3 zUsSH-e9Edl$6t{JwM@u;Y^Dh|1-NXiBu;;4?co3Bc?y&ymc(YytdBuJESG*owq1Ls z_U{I-AGZhH3(*QWM>k%PIfeY>GrP}vLAoMysDvvzyv-}veUqMKKQR_HtQp?o)Posx zxa24+G?x$_u5zvfG!CseXvLzqN2S-O%<@`;I4>kGXi2}0-5VZjWQX}|Vz2|FDh)Cj z#;S(~2-QP4+&*3otn6=oH|2x)#|-=N7Wl{}jz0=Hlk3i6kFy(FyMA-Mst7{+p<%hS zdzFE?KC(vJr&8v(B>wzW!Ej$WRrsg<9J zjh#X4M<+TbLD?jCRz^1Q>e@mFel0r^luqkv4;o6`N9}j#2eC68+mXzor+if>e6HvFD5-lBIG6sc|R*$qea8>MDapRyjfxEY&@*Xv@9&XG@5=r zYzM#WpEy{PHMJ)W>yj{f%0L+`Fs}{_M(p^nPP!gGb?-C{S$Ll8Q0v_!}PGsc- zu{p(ckXTZ^7_V(ro|xcD&W^C?X|M_?GTK?MnI4DoT`pF2jP@-ovI2H8;yylvX55hR zq?oW8g(@%FlL@{IuS9s;Q8Q%{%hd&G%9RnFv1&G)98hJLahza&aZ)!N3tE1BnA6Q? zB_AQ)0S`#JB7>ma8-aqFHV||I1+_GTzRpXFj}_bTHxK#-a3i11glZh?5(dS3Jnt2w zXrT8a&q&7V!w$5=A~||7#HX7MlpJ17b?d5)I)c?pD8qatU`w^}=BeK)&)7wnQ&3Ws zPnqKcgLzthrBB@Q2)NN>IL6CZ=TI7sE%L!Z0g70y1po|-Jc;|V5#VGw3NV`XIgi2{ za(%xoP#Y3-87g~91`1kvqlQlx$4cGGp+vH^ej4S#f>g{PTISNfQRA+qE)v(%B>APQ6BBjjscq%|CT^8ogu*L5*=rjlX9j&Y4@@w6#AyWD}ltYQYhm@b1L z34@yVzgTn8=~ucBaYId(ZPd=}R=>Aww^r!pO=CZhgovAy1_qdD=Ygq-1_|73u6wgb zyQtbNWG`4*mIXg11JSH1UVAbzU8!yIeG&Q$XTzqcv!9%v%A}a`uS$Ri2ES!5Mm`xW z4oJ?E@O-{dm#pnPX0xkUtY>&u((Y0~m(RWExjpaDw>fE&j^;-Yv~<`S`~X-iNSE4q118>_9u4Ik8u&UqfX~#`k*8jd z+H62#KE@E|s=2@y^3i8e?B>!KsD%#UWiKyCvncNiZfIWwBqFCaVv?}g!>%yVVA-wo z?X8}b(9DFffLXSealx>*-b#j#i{9d#**RArXHd*04mJ&t6fnD+(;W>{Z+V#@XePkK zm=}4T&kMW`?=7@JCK^?<{!ou0CgYlW3-4 z5oWo)4+-8{29(0B5%TEi`vQ}H?o52l^Ny0AJQM1Ze1(BWNV@sd-bn%xVQjKzgBwnl zf2&CwdkKzW2dD<*OcqrltMh=4r0E@tcRS6Wf*+yQ^OAlPj)8OLI>sM%RBz9HYYyCLeWV%9Jv zXrr?w4Uu~e5`zN5@`a>b+Ud-Ii1)b-PLrEy+z$y0rJl+aAfTs?wFy@X?5c#1cw z6myz_+&c2#?wt)KjS~Spj1h5tC<9mNtsx|9{_)yxmcL>J|1iUJ1 zG)|g89D1%l>ui+qi6VkUJNVMO>J1c0=Q>-uy2+X~dLu62Mbc-{)Y%cz5yiFv00)rZ z+Y5Nbr^$W+-O^os08qPz;%jc9%eboz5qlSQ%bjX0FG!ynCHwC?aj^Hq%GB*Y=Ch{8 zvkZIh#@(87`^d``P-BatD z2f0Eb3k%ym5_byG4t?&MVFu<+$6nTh@u;B#AaPNLJi-t;CPm%}BGQ@8h?3*mA zt0!y<5E@rzWFvgQo&Gy|gZ?C{J}y?yY(XOFSmt&Q_m(Vc8btGXzJ ztKJ1J*q-)sZ$xP8a*N0)zAL&P7X;(>QP9W%tSGOa-FI+Vx_nEG&zK~KvdgaG3s}Xl z9VG7l{z0Tfy3nI(?L<)cF$(#58ybc4w^I8U9pPD08E=gS>b2lr{ z-1n2g#2Rd~hiL8EE9LPIa@mZCK-7r)KI8l3rR=)fO^mm=IB@C6IWX%4W|{bzl`kmk zL)&MWY}1fxR*9iH8ykPh^VQ7*(ye96HgDoZ;Yq3R%%XmxKfR6GhvR*aU?_;jIypVA z0T?c}C9}@P1`?xHsp{`s>gq}G2vN2AD7)v z^;goXN)9)&JmgQ@Do?e=*_haM1O}(qOhc-U1`O>=x#XYX>QI;n#r)&|aTkEeV5!4o zo7R;$61QZo9z`IzE-dyBE>M;>KqW!-2I?!LcAZvOb7d_(e91~ko_XaXQ7_Q+f*PFl zip)FOYlBTC=3h35nl3OZ=BmJZ|1M9J0k@54z!)EB#FX>cLHva(hT~QV|le|1H7Ng?~U9FYq>L& zqN_pmza?BkW*e0r2Q@SEhpJRM(C!PdcSe$2JLBK&;fkvC=3L>qb~|?I5P*5dTeR2g zLmx#r4DGNIC;viNvJ;}!S)1B7W3p)0C}WZ26BxP73YzXNt`G#4ghPGvSWmf3)yFi- zqxGj+AJfdB>Jv8pP8v4K#RtJOv( z``dL3x7M_0;+@j_<>M8&xZEX^MCN5rv?BM|mO!!3 z^P&28^4{~8e`n=rpleF)D$!CV{)tYALV}`Jz_KW(oU4m$wYlmi$ zEw4Pq4Wpa(pDYR-DBZ0HYq1`)m=_n^PNtMNI)A%~ccqbsv^b5AcEr^xjnMq+dl-%d zH}K5|NKK8@WX`HIGv=h<{$+L8ci&X$u#k}EM{Yb}Y9t^Ch{%eXm#IWKBr^5$%uCq; zqUN;v$y8*FL-qzC(WHnYxX})Re|P77s#(@x=iZER@u8=X)_$jzop1Uv!~whp2i_xl08_1^U(LxzO3CBR?u5aWmxo8fmo&~?D%akMEThZ7 zHgOMdsr%m2a0ZKVdR`aqlF2rIe>u#7%)$GL>L7gKSb*wM?`kBj7gsi!sRNo6X!laq zl|5rUs0Ryoxz#E+qcmTw zmFXHjdrjgNXJSc2#)HWJ6laBGp+U6hUnkBAzU3_|96pTVkti`lYDi z^M%?ZF_(2$Rx%4klm{uiN`*yDn63}a)awM^p#_9QtaDw=qkX04r-Pp7eYm*mE9UKp zi(f1uisDmoANBhC?TcBXnkc#=yVLvusJR-#pC2(Q z7D7X_Yx-(S`h7MK{gHw98bN9|hwO2_O+^=qdXn80a_!UO<5RSGG;O*NSTwqDp|`x& zGYq%v??kBaxkd7gDE)G*x1!N9lyLR`MnIi9*q;(~SkM0l{Y& z{n8#o`yQ|HS7?;P62Y%$hLTPlV{QW>5E3(cKod$E3aYbe(y)+~Y&u}4uWR_*Qn<^Ig?=lMR*^ZI@Na{c4HuJb&PT-R|P z$9srhkZPSOv&ZLYT!rH2!Hf^$m4B*tZ??ZQ9573|Lp4*m-#=L&lh|p&u8&x(HBMC$aclCu`@%Pb7!ThuV-r*Mf;D6bBpIxHfwa% zdD(&6TYQI!9KdmtJk6>V+!Hcj`*b}8tjPW66=eBh-3I5;Y1n5)DT}zh>9H^m#oCj_ zL7Uw%ytmi6gUPwxr>tO|*Oz}@(L27ea=*HD`Cx8ZZxh5QKEAdqSjpn+Fdb%*5k|L- ztfG4v)=Ip*&Y7doMNw+_+ej(Z^<7-MKK)Z#rP+vl1%?!cI{yWJ zs=VQ9Z7s5nMJ)3jW--LqOQ)%z=T|7*lGNj`*yF+w;4%Jh^JSfDzwB<-DY)pk98M)T zVDHpiRx;U?_K8GdW7M0*enjr~B%J2H&be&;>p`zqZ&>q>QOcG|VJ_h2SGCX|y4AHc zgJo)&OpIYjU*^9?7PAj$yRLW`uJ|3azOnuiD(5h|*k|przTN0k%HA1kcpgovnY6lw z@Eeoupn%IIiHgyGTh(6_Bjw}uRw?QQeyGC~Oy_M2TbLF){pFg8m))tYZhjBnT3$xi z*57CNE0e6$Mj(9Ku`wLvWJ-_+99d zZR4I9PO$+oX=c${>ZJdpZ2HqN)03lbmjYJWv!Z{EiTKHK$+~f$v2}}k`I|B60Rm{a zU4DDaH%{+I>VE&i#{Iu`(?kt+fq*b)H0GZ+2NRK(1&^^HLrE6})REYcdpG5d_B*na z1p2QnpvVldCmfjnZ8rJA?ha~=kTdV|*3AgT7-OR3UsI+q6Rtu-vJVwoa?HEWZeAe6 zt!jbOWnICj+b!F#WWpW~A{|!rD5ciOMjdqh82PVlr@3T4R3!Ob z%qlu+;%ibWW}b%RrS#P$mLJ{;qaQ@NF;QUnM`TL)M#v+MabYuyhwm#_ka=4fQ`ouS zn!)s$oVSXdz_skojj)T;{GT^B`d+H7P7hvKDmrRoV)E=q_q&e?Ea?vM0hIBokYP-J z3*u{G?G|rIUKg|ZlPZ3{a6j4T2rlkP4|<^(V?|Vq{TTMQB|*$rwvihzxAiu~4}9~x zJb{Y}SIsV%!{}T8Im~rM$}kDW6v&4$>M&oE5}9SHgfDp^2wv`UgUifwOG<$LZ79z9 z%J#p8;sn_kgQVFE%T$u)w%$^_Lk4HwckgJOI{b6DsKO%f_dEZ(X}<^TXYp@XQ2#Q2 zM9^&yCVc%0fk*F0`uCJ1fU zK{p`hn`=S}L87w#WhnYLv$Zh$a*ah!sg1qWFf5{Qd~2(BwK_=0utPO41ZrFqcfyb4 z8K0O6Qmq()P9ph^j%w0!2+?M#*cZ4%gMdTzGv#HH??jC2^d=t19hiHZkvnS+q#WZ1 zD@M@VfiM|ks_DV6c>!)Sxb#O<4E*lcNsB+|`1`o!j^2CooGRe*?!`w;n+^>Q#2lW@ zi-o@b;Uvd@5NviDcJ&MTpH%!;FWAh4w&^I2l=Oc&Qa))jcV<6&{O=FZ|9N$FQUY|g z^T$$Op;1Eq%B$Rp?}Y#BbVqfVF4Dxc1`cjA{7j+ZzxX>9-!sr4@dp#Z^8GaGi}7%8 zsnvD1%M0$~XPB~|C4QPe1^;yy*5uRe+^4L+J1O~$q$DOf@yD8|B|b(Vu(+^CE(e>=2daa_j0CAgxdwZ{!(|!Z*j5Uh`=M9&(SfMnr!+s2TpkR15hwS|?9jX1qFq?O zM##Y7==!GhlI(qva@{Yjbm=X3hC3!hrnFM_e*u*y(0VUVKpX;!MhEik`nTvk1~$60 z>=89m`{>5NEMAzuiaiCQ$2o^_s<%UNi6)Shm~C;{{Kw#UG5`)Yk>9cxK^ zs#Aiwuv|K8kwrYZE#sQYmTAbMGv_SWXsqZ_U?So4-|%F}ws4>qB& zuA$7$qAwM37qaI4@FCW1!=Uqy+UH*O*L2rh;gcWC?-4g0K)e-AA!ol=z4%o>ow`Uu zxG7jP-R?j$wXKp%CUAy57TRHgI?+VYcj&^Z6oMb>fxImJ&vasV<4Q!2z1;#{&fyA(oOCY!oa0hx3f2=Qrl6{?A?z$X%E6CEtUu~Z4|C{u9;GZwnhp{*9)D`gM-aeVpnOL++2j|JVd?fDk0&wS?h z1DUTKy$@wGC62-b#g*F+~AdNYIOwLpsTMP zz4Of4fEPPmR17LI8IT|k$cUbgPL*8n0nh*v6y|0_T#gH7#~8ju9nVoc`IV!$ot3@C z1v2W+)v#nt$BA39^wX|2j5W|){N|7)tZvI8fEjsD~`DQsxlU2*2Z>#!E!!&?kGkU_x+71@XeJ)%Fn|JvMyG(yr6?t zE}s&uNh?Yk4R4OmDz4)-_D+R_qSpraS2m(Gv+EaWq!y-FEkzbM5{;uLnRWc@UVFpu zW=m{02mv=SHV**z=1VCuA56C$_nUrYZ1${xhZIm5v8kuZIM#8Q#bz^#1)A8BN!5N@ z&}@*gXXb47I2l33H+2lQ>8oN|_yp*yI$Aw9!-tPaJd%%L&W$)a2#xfVjT{eoQ}+v$ z-?z`VIbe)^l(ZU)F3burT)*ELDee8Di(vftlYYF=h!MI@vqBZ`fhyc=$e6=hX%F7) zk`E5p-!I2`1(p>Cbf~qowre>2_42-cE&Hc#*pSs~vFrE}8EOm~_-|C&0gHXV7T+M! zQQ*v>vb7GCl-Auxh^;;heC+lly{TBt=ape`Omm$3dzq|fH zag>SS(zgw;`)Zd-S%LPeCxrBGW z9=Z^A6)df<9zDkrjW8AEu5j4Wr~CWuH(oj%)J5 zrtt+g6NYcr3)p8W;REJ}-Sm_ngdUWcF$7htN6aIqy;<31#7gQoGOx`X(pQ}Q0dRJ^MA$G4urYgy$`tSo8 zp(A@E%X$)L8M298^Oag8{eskdHrx?usyPz4>k}P7(XI_&H)+-0U&^TZ+Jvs~_#Moo zS|-m96^baF7DDlBgWBXUFqDb80|E8;nYm*{!R_x__Ee7YXY^D3y)6PZA#&N1cZ|`_ zmD&0x!`rNPlgJt7UXm-*G>$cyx$JyNO{T1H%1_Qnx55GVH7UqLH(e5#z?|fi`erUQ z*qHypcF7EVy#Rxt4!9}XR35LFs)K^W{DNEiwrC#h6N5c?q1)}8@6jm=XwsD&{*fE* zJQ*DaXcZnN$vix)ZVf~!c{MLfdPyz!$+;v<)u2|AZYx>7I=JyVk($_7n- z@T|ZRTTiQZCVvIW?|)utwmj*$Jg0D$!>j)xw4bZkT%Kwr_gDFdBDDV@()^S+=%|=; z7#rK#!4>WJpJazE`Trn05O)UTV+Z~nga5daCKYv2^a}3`f1el=0WodHUKOy;W;ls? z>prz}`>hh!FdFWvOzT*ktr_1?RU3%3O_3YEnWU&1!W^nEpXht52=}qRrF7CFVJZqa ztz(wHL2Tp7_E~U5&j50#e2DE*$R+U(Wx}Rwm-iI7al`~u2e;3^Lo_@f_?*~`(TVyS zoIXCj0ZO0^;ihrer9*2XxZbLzrLv^KoaL`Ayw`H!!-7icI6DwSO^Ur$t7H0ZK@fZR zi$=~OXts}izqlnPGT%2C0kpDaGsx^@Fh$FyY6m+aI%~({hop;AZqYm~{DQ_C1k}~{ z!%scwr9PUA|41h)Q?T-tMM((pq~&g|uW?`Z#M5IpP`kKq;4F-Mg!2>$zRb(DRq0Te z#n-iIglPorEYbNQo$#_jr7F&4hL185*n@d(My(c_~RXo&+qny%COv|HX=ISq};)ZO=mLpo;F2_d_1SDUr)P1Y7d9<%l+ks>_%m}XsoKVCXrV1p2-lWPg%wFjj738I1Q%pR4i zV*R#eHI{b00Y_@J-?TlWJbXe#Z#r@nk>hi6PKV!`>pwm$PJuY~3>xkU_wyv~zQ0Vn zRA#GPt6wh6h-y{!ra(dnZV(!&eBrRMyStQ*f=dZ z^34kZCpC#2gPN57mtNThA*!bz<*q>{OLx!g zmti3Z^MP+=hY4m#Y5OTfNy1?D^l!6iegb)|&gX=|6v+|}qFVZt;!~SIUD96{KwzJ! zaLx3ymdB=rQagu({V2o6Up#JYo!C!3X=K{pq>b+8_UluaIQbN@pIyx!IuXolchsIY zF!)k4V>Sbs1;b;3F*fX%TrisiE=kAesvOU?B@wbUK!K(&(^s}JP>B&$Z=(+d4WTMC zVm+j`kpWOD*blxu9Qy#74QcT$cOd zbb}^^aM9UyLu|>++wj@A)8&ke#f-(#$Pj$1`R<*X!Hl^2T?&f*W$qNnk=*FoM9x}v zK#P=NMsnlikc zXz{xC&nxv(yHETZ0y1622)O%^mk?0@U_pf)K2e*9+VpU1L5X)P^D)>22B=A=f7sB> zD01>`3cgn}9tZdN$Df20yCWXbQ z_I;WLYNBeYIl8jQ__6dEYt2$0@!q>uwb4D&P>pV-$m$Oh`wNFBUVSNj4>Go#0R$3} z#m#Z0*E*8NDEDMED++vMQIp{adADU%qk3;hyyUFY3WhTJ4=k^ zp>Br2>m|Fe6F+2SBb@pf8^G}OJugiUxyFaA2U5CsZQo8)WONnm>=L&gZ0<<-6-Lcr z-dP8Rl&(CSqYp1mf-5Cy34eogQ!*#DEbTsSkz$?}DASQ3N}O%zVY}x0BF$k3eMVR+ zO$nvr62PIBrsN?`!LUJMUJgRk#jIb#QS_m%B&h#L89}#hnn0U|vuzm%g*qZ5LSnQ-h193hL`P zjfPnZbb~$ESyrOgz`|x(IHc^xO3t3`POaCMuO4W_!wQo~)zU^C54@+&N{CLKgU+yP zmc{lpo_r@lqZMu=%gfJ>_VE(9xI2=)+onKBDZBp$%NShr=WIvEid5X-9giHCzfZ~Z zVOavrcD~HE$4eNkMgPcTV|gIdC2N*vvY`_K^E!}Z$&9X7_U5fHtJC52WK)@xH6r{{ zkV0$Spx^h-F|cnm9)Gl{>oT2@5uK0#8S07In5+a?NJr zbkEDD<69sqli?GuOjDh>hAMg-8+#&LpSx)O_!=*vL+`_@H0?p{$45;+hlhR|(}6V7 z01%G}+GnswIc5X?_R3a z_l(w|c#b+YRP{x2$VKaj4awo|*0NeOZEe!SU|D?PyWji8hq~G2rtEwjFn>t4P$fH? zzX+Vp5}_s4ZA8&H9)VVrf;v(YE#G=gj7SqpB^e|_EZM8viP`Blmzqw;y{CIjtK?EA zz{8Y0(+OENmpRD4(uXO#MKr0(1#BBnvr2rwm~fgJO&xmH;7aXNCR!&thlT>UX@6K6 z?lzkF#3tN`-NPpbYZgw^a7gg}9{S;jG)<34MUm12jZ`)>6IF5@w@5{{S$kRK-mc&)e1-3Nwqx+zHG!#Q1{nBDGRU ze-K06CKmAlW}ocG&1N!-0t)y zvh6UhozzhCVBE~A*M}TNx)uOlV@^2vwzr|?MQEcfyAmJtyL4W~M{Ux@?>@XwB^IrMU56@~n6=Z~SgwbxwHZk7^n&CaPP2PSlSUt=F;?gSCk!yoGXb#l9qBy^U*R}0 z6jHr&6;7-vN4rEEG=keR4#pW(FuFUfE<(r|*+^9;d2zbj}wl4%s9t~hI4uh28jh*m@ zBv)Q|0!=93$}gH>BsT`d*K;Xf0tnZyw=L&=|L{la?W0Jf{#YTMXR<+GG?TG zTU!s{kxC*Enx>ELUG|+dpL+d_Mj&p`3e(#rD*QXPf;znM8o8OjmIdcR@u#k% zM#(%@6H2WUcVm#qOIJ@juLF(2VP?1SJ(Ff`Fo!a%>V;0WWaUhZ<18i~0;ItwP#oZO zgJ)Wj$7koJnp||NY*r6g<9XlAxwKl)!vt`0T#pXJLISv41AaOYB@iFcjBOA3XVhUY#Hz0ucX`4^$+t@tm zr5@98RtiLhi+c*oJ(FhQvPheO0T>0%%vu`3x8XDEaVM>zHdSI@c=VcykL!{hB+Zp= zar9tE7hWuv!H9-jRDGVZR3dMUmK>p;v3gS^dPzZP{QBRufc~)yPmdq5O)U1L&x#b< z^z+qm>VFvdd8UFY@m{b%Eu_wKiOr9o#TV!4T!O6{Jg6KSP zT^B0R5b0Kx3Gb6_Xnvwt@tTp?8{e%k*FC3fSqCkk9}x<(fsYkyMmI zs~kbAes%{%@qm$ZBwG%A!}WWo>t4?R(Xw-7>m(8n#NLmvJ|r2g>2rjkq)Z6a(lBz; zNn<<98P>dpYv7<~QMxC_P+aTU2rgZGEv0k6`3R++sas}gpZ|+@eB>Nh| zkQ%*LNpB~P<4bsqE(6%6lAa+8ZXsTF3mKE{#|9apgos6(xhy(r~p=1X0pzbx$wk1A&+-c zxbhD3$k(T9-%R*_3hcZHzxysLC4#HdMMP}auui0tr+!#9D{ds%J|i6JMsYD4@b8mO z(C>$4a?Hn*?ceaq_+UkGGq>cRdHHUw`H2#mj zvLc^3`E}o0hB7;c^wMv1=S^|CsTCdfRbZQ0_Re$SRy|6SQK4~>JCaMU)XtQfZ{ipG zeV?&Rq;?+&9?MgGJ-blIkuUsK%pzgt|K2=X0%no8qhrBV-6i!Y6=rQeI`CjO9?QL` z_JlV`TK-wbAd~J4$Te`v$IAtj=xH~IeYEQ9;{k$@fE!TH%pB5CB>NWco(JJ;eGlQu!#(IV@vt9#n%%(l)wr;_T^>9r4lhW8;1^0ayU~ZBz6HCKj_M@{lMAKj%BJPt~&^F5|GJaxj@%~%EKmNG@568Y?!03C4spm>U zjkKn<9}lB{Z*XNz_F)_TBPN8}!lfboaRzkCvZwjGtb0en&!pdmOX{cU_)JHfpmN-$ z$5zC_Vc&^U+3{?dfiHy}>%I|{OCYExf8*>Fj)ABnfjr16i@`)8mp1xoRL!t4NZ^|6 z!|_9j&eKhjV(%0x&?Zg=LXpxFKb$klsJm#b3VO@g$tleEF@8q zf> z+n9~l?fe>JlS6{@h5B*vas$b=vXb^>SPaN)2&$jaVJw{xor#P_RYiEU_h*HOdj}Ud zY{&Rs;Oq>xC7iP(Z+|@8K^Wm_pqVUv=vCxEzQ;F*19EsBJf~Ja9(l7+mZfax!TiIt zDT5yFZy~o2{p#?t8>Y)x=h=x=icQ+c=tPU_3_#MF^l6OIDaN72i=G6uT>6?-v7DKK zeubJ~{5rgWuRVH5YBYol@F6oYS7?ZGjoktZ3lC1G{6Yq@XTx|Zq2Cb$mC+tc(CRUQ;ML%h6vVU>|h()Oe{ zQ-mb6QX3ch^y-?$eLb`KCiu);Ma9JP0d<$><5-tnUbHnpZkKY}u6?rJScISvy0IOM z`1s;Ymwm5^t+yau@(JSAIj`i3^{a?jh^s#L=49AYVXlE{RVH}rL4U>+aKM=Y|WQK44?t-WIMZ;93qy_GfIa9 zj75-`HvpYN9+!^5Aesj6dNScyjGMeMDbUCOv*x3r0k+2tNG}AAtP4&f1*7_^Hrb0w zy_9=geLd-{o3+Clch#}Y} zP9`fc!5{B3!>T{;=|NopY4WII+{R0)WW^h)82^~x{GyzCZJ@)+H6cZf2bmmR-eyR+$TtQ+JSi*kJQ&X^*K0~`4KV*Bdi02rs zCo-}A9i3V>Ud9na*Zz*6c8dV!ey7F(P?&8laDxIl8W84ZO-z}l=8JaVsT%tnbHQp? zGOzSR+N{Xr0hODyD|>R_tEJGBVgmUoA?a6U6SLN+aM zW#%l#{aj0^65m-G5+;^bHpYKlR0x}!_|ju;P-gMOl2v%z=j1|NbuMUBC?je!QxJ78 z-@JT2l+&;(&?j0W`O&Cg)pMaEbK5?tfwLN0YSSY8XhjD`O-F~lvMj-)Pr;;vaKa^3 zMS#qE_r)CPX1vH%Al5qFANsfz?Yt<06+5Z6eZgFy*sbubWNJJ)!th@4EIZKEP~e^x zTGFq9q%(e(?s>l5Dpj(NMsSmnIQ<;DnXnM&?Vi((i!=%q(VEQdpBaGKSIH^3{{DUT ziH(lITi>rO!jmu&(%Se%Y(`+4JB2s_h7ZoZH227+(D~$%BJ}Q=DV7DXBVsZl>aR)43otXUNrh zT3>dLE`g$1&uIjcEQ-8S(jq&(Y{PPKe!ep}KGCeuYG19_7Sm~^ncZaT^5`kmehZ)r zYk+r&e(ug&M=Mgt1v;=%&DKd)|8i_Zns?W#3pCIYj6!8Q%qSt114tIWQAnZw2Baez zfEXU|q8l>4cNQtU@M3nJeSZgG--r0MB6ha2>z-8_MVB_dq4C;ft;ZHVvcbt=-dCip z5x{y>MNtb>^}6rg+3cCE{8r*n5RT#CcY4x10xtDPDLt_8cTaCyc2@0&N{Z-fk55PE zba8RX31mqvCU`vb8pNRefpSoRH0 zBdl#!^t~4#OXn~uvtAdZI{i$Q>U+L@TR@3u)1p2XmP^H3%vqd9y z5Q-Y>>FOBThJHbE^CQ6T(Y#7%LPsw1v42H}6p&rHMi@Pi-nv9T1T~wcc$$27)pn0N z@YYkPm$e(9(O$M^CMPuGb?ZgZGo3OE2&49(`Ywc8sVGP^WKf|ylaZX@rtXFoH>$YZ zw35lnQr~M>Ynb)!q~Hh3Z)vF|azS4YuS@>r$H+|aWAyJ1MySh$axV@)VT<(*2(uJw zI7l+P{UYwKdJ)VUoTSmsCd;K^|HrXX5lMs3MDv3T+#m|eZHfrk$@s4bjnB{iM})?; zRp)a>*D$GO>+Q)t3Zu+*qZ%73gYT1`JV)_Qe6 zH{|t^fX3B)=ok+=81?dFCX_1U{gRB}EdOe%Jk5+$V%kYkbc);#tq#n>kt0}1QV8$b z?{6d=UE-*KE~H&wA2E$_ zk~u{``z))&N;6WFLb)QVh_<_Go3}2ZTbmCVYIYYK4GEef?0krzp~i`nup7r zL-{4HgiooV3AGndzS8?VU}WW&I(fvJU>%ychR&QML46ytd<==Yj!T?9P;i#r@ z;Z#3m8*%cX7c zfAtpj!Fu@K-S6TYg@NJlg8Y4v#5w+pF7Tu`RI@D#ARJsHr z^`aXBiryB-U2h@Rt|v_xNu}y;*K=8p$W(-ahQc%UqB5$Tv8Hb}E$^Jplm$RBMzH%6 zzoJvIf*EB8QQv6VT9V-=sK6z9l6L3AWw~!@``$P&nrd#g%B;L(S2GZGwx{(%3DsEH zOopBB$Y$XA`aSPbiFlrDBPwn)ZIil5)sOwoYfH3jvF1%9D=UJ}>L=OcAg&`28e=&h zJ#k(yX)nm{n(-3~Q;pPhH<(_U>>rK&-nO)mAT)KH$yMYu=_5T_q835+HWEykdXsEb zq;9v={3F7)!&5fCLOP2&UR4}Ig9qg0(Vfi;T13Pfe*V|-i}U^jR^c~-8jvsQsM7*Iqhi`#jxWn}1Bz z7XgS7d8Lh0FY7Phl1pgp3-Et)PDSyKd=GmoUSn5LQ&w2MYZq^XAtlwq>B^2a#?VGC z;3d~o*-jN|>FKn1+D`=DDtN7HqIcC%S&vfL1y`hLJcvLl*Aoz;!>NVMxyRl8tfP|G z5iYIK4Bz_=!ljiP{H%0jp$oft>P^@7UK-TvyIPobIRV~0_}Nyso#j&GPE6qsF%zzRUEmKT&Z;!ab`FXtwNMqye6{J zFf^rXgnYkd68W*sR8OPe4v+KCcKO2bCQ>!4g&Lg*nunwL;2w=&H8@heOdoRx=Ve}} zCEwdAT3{$CkV7A%Lu-~eVOKx1oh@xP-~0*ag4avg;~RjAa2muN^$BRkX%8o9O2XBXMmgSnef zi`@a^104ZfW@d@`5b8joh`h$gd$Kj$>oq37_2U@B?J_x()#$f%w@&f7$Ma*#=Ln8lalFHQmpC+lK|L4+S$g#&^gu@=*W}7|`u#;|O?+;u# zk*52$I)So`r~dH?U9wtk*8W*;YnCF}L0Z-OGCKjJ7-B-!+9x_`0_x4xMmd9C*$pTF zs(yy(mAp7NSr_cV4my%gEkEq#D&SyR_Aa( zBUcbe1ty8Gys9{R$azF;S;;`YSGcJKVXtlA6&ak>w#vb} zunP`65i=@CB-6&T;tfi~Q|&r(zLh+VJ5fK0B==SgVXLO_DyqFzkc3mNSdYBS41)1; zMr8apas~wLdyB1LZ{iaAjJKSswVh1YX?J_!dw1sdI(`sK3R??`By^PWhyN)TNb7QmMxY6@;4i}1t1os6`s5V{=d$%CS#i4S8d~jM}2ed4lDIM0q zcn`p__G&Ppx{6lDWheB-R2n%W&Q%45YM5wATRXIf5y$bP8)IOOdH%BmZI2}u0zpl# zp{2N9ZpdTHl?_^YIAio#74dSooa*C(qCR_jw$iT;QyO~O$th5*7ik>%nYBrza01;sJXY5h2N6sx-J{e0ioGj0hN6F@ay$%}530YsOG$qa zmsh|1tm?JD&~@R|9P6@-tk&Bn;KGx>CYkL%-aPcYzZ5c9i#b}297q2w3AWw+KKL>J zN(^0(=QCK4mVFT5PH*0XL0z%a=`1B46?M#q_MUZ|((Oe2Lv29de*xamv4$Lf4jqU# zl}-1%>tg+Xo5Wv~boa*pWfFgT`^n!;;-Nijx@zyO0D;P$`4o$I!GhpBZfE<5d8$fO zTk4F^=PL09>q^fqsg47QZn}?t_jeN5v3ebX7P=Vfp~icgg+Q&wEiL`7^%j+Kvz}1H zGovyvx;G}v&QnQO`YW$Fh_T5~HE{}dVC2;(HMqSDUZU~J-#)v%GzaGw@!m7o!fPJB zRl`#+Rj>bQQNKI_(4*ht-?1-@fAOI{lOBWIs~m|f0!Mpli@Rl8(ad@z=40Iqw8jHXk1W4XE!hO1cS4=QHftmet@l9c!*Tf1;bKl{`5K~5dr zG#oUGP&X1*(ZiG3=$RR}mzS4!r$YtIowVLl9+0O>b{1)5dMP^@L_R^hx$_5z?_f^m zrT8B%3*113+NdUq%PkGr)lzMGZi0UdNUyC1+_x_aKj6Ga=TWUkw)i9V3%1ho`S%=I zhpk%w54Myt#tw5|qY15F!4Qv^4H9zsx)m$cQXnuXe0EsDmyZH)P3&L zj`a4Z6w%@RAf7qU%p4nJ*aAegNs8EOO5ywKke2$GyKU!rdl+mgQ($`|Al%c&W5yh5j)4 z{`7VW=BEjXAr|RmQ3(%SCm*Mph;!;Cd_-2Q;F4>VT7#&+af#As?dn1H*2bF)iEG>% z4Y}zO`3yI|$ED0SRbZN?MpPhuL5N#<2{a1o^LaV@`^yp=lU4cr-+wHzj@7%Y9gr(p zUB5Yi%qk0G`ic5Q`fDRSIFVPSn;ozU_nvT;$aN_1f<#)3N~+9dp@HeiYMAvLZ>YodwMzoHhNtwCCQlg8#6Gai4mZb1;MhT^Z1ZPS!1il$i zDfDp?xS!e3JOT&C_v?^PzZPaJM)krK=w3lvw5?;^<`X!cm(f%@q?f}jSbOW&QdW<0 z(kyr*iGGCy$kt2W)`NGt|r9%3F&RN}}bdC>&H@qV$5Y?enlN-_CrWU%L ztlo~NP3L}K{K#)_|4d;f>R^xP7$8RUYv>12HxT)Y@ooEa)UNKB(LocF-lelTBK@-c z!-m280D8zsSIJA!UkB?~)4Vqr+Dy`Nv0MdWQ}uSQDB1jLH|=tsu5~*86hDXc*P7`@ zj!Q_b@<;bRrIzLxL=hrf)_v#)-~;yg3i6iibwsi`&&$#KgE%r{uJWy)qahX0T-~yf z&Bl6AHSgQ!rNh6emJGuo4%-G}y2%DegLxoB^lj&9n2<>ATg?Yaf-CyILRn=4x?{Re z`*P|laP(RhjlUZZ-DDj~Gz$$<9BT8wH#q4(c0bUZ2zm{!z0(8*zsvkUi0YCJnXP0Q z)Kh3xOwX3BEvqn-7_1iAH}wUfoK1Yu3?dy<5*61{-M(q`teYjLkHl!dcn?|@fVpDc zj=G;GX4EYCth8oiHJ!eQp|m4=+z~28Dp0`J+CW2NhuXStrInp1DW+QS zV&O!``wS8a&9J-m(BVzSN}Ufe73-sW(gf()%0Rr)8YW$7Sv7s-;5HXmUsP0-(zG_T z#aMg+z+pTj@jK<4%S=D_#_KYMQmEnf?S5i_Zmjgq5Bna%#CF_9^)H!}orKF5+99Xb zJNWHRKT2iB-djz9!^kg3;=#oScfUj9nH6IGJ87Bi`oFB8zCZY%Av@j@pE%PMb1a`; z5cs`(Q8SA~#5zv#?5Xm+$U6m}!yD5jkExdAG3aEY zf#y1BA_qENPjn+})lqJ&Q0LyCge z*y>T;=n7C=dx+tnbK1Q!UrvEEp1#DsUo{Tyse0w?QsL|C(|=dSNxoImMvtOLXE=}? zSZ>;=O;|unb(ej`aD2vooSce=zc4xwCDkverwWP)BG>^Rx&ysdcp-$^WHAkeQ^HZ6 z>c@IpWs-ACI@T8yJ#i*8ZBh*c(nFYIf)hE^2ol@27Ky%AwUwKdy*|bV*`8=g!4}^# z^pbxZ4CVz?2tL{CWIu_ljZ-hGbD5@FuU@^OAlK9>770xRyRN)xd#F`^5UMS&kyJ7H zy73eabQL#vo}@J5lJ&mg%nzFx=hm@EnD4CUb&MO}%8W(`514@mV$uW`E#!?Gw$UW` zVuQ$3Qoa}79HCM5VsC@&wV$mjA)M`-s|Jf?eXH}n-XL7!M8gHHoxmVypgTKbrN-;` z%I|ReXN#Z3wXIZ+I)wt|3WkwAIt;BHxM7=@F&Q~Nl(gYylc~5rGRS%xM(8tN8Tel%060Gs&A=ySlxcbxHbC49L#-7ZZt^$LM-z| z+XdrG=-M~rX7jVwL)6zy*2<&G|!`(n>s z%uLAQnrx$_t7LJt0dKfgZPYyox3*DzbH+!bwxX^OEq7AoyQD$ifLp%3r$f_L$mgp* zzl_i*L~CTtm}Jn9{WMgUmO&EKgHm+9+!=Zn?cy_vzijWY;My zTQOE_uCNdOrdTv;B+Hy>sz~IQBp!q3i_|)@*0*O(8{ugtw$DJ*Ym#zkwel$i?FkCvmgG#BVBPYshJ;UZWLD?mfQ|{K}!r-m_zAxJ!m-u zodSP)_y^+t9c5Sl9Q}W*9vJ-vJaU;U(Ba;`M>QU`nL;As|A9TaeDFh3x%AH~Q$s}> z`5Rjm`S8x>8(CBGhY@J|bf^E1ytfQ!E9=^ZsXLTXpm>Wzk%r(BDoF9-#Y)lO5IksS zC@v{Zkfg;4h2jBHpv5JSV#T4jYjEp#+L^g$p1J3F-{<*W`SYGX*(ce1?S1w>$yr(Z zTGxdRs4MY1VoddU(UHqHr@#l0V-(3Qkww_^Uvn2T+4hy}+HQFw9kph^wNvFKJAQ9| ztx;2lCAL&Wb9li8ggp z+G__$Z{bT0#naxItGXW*_I&U)DN@f?ze+l~rWNjmLe`NhQ#((7)_2E^vmVttqPqCC zEcx_NATUBeYq%;(P#dj_Ckz!q{U!{LXjZki)ph*WjwhV&tR_^?54KqKdB(0Cq(nqi z&^So7jL)n?hd{K2`p9%kpR3szI5BAq*}^s1Ef$pu4ISMh)>MfhczhoJd}d zyQr($m4(G+6hzabFn^F}AOR?!+ZOsptmy+BGrP~+KVDc2I;pMNrAzouvRD(x*g3oO z*K>x98%Mq_D-e1H%`!<^62g|%R@ zOZEO-j5GNQ;o7-ZnEo`Vi_#H07sMd|&jKC;nF9A>p(`WBRGY@nZ>O+cQ-}Sa+P`3pxT^cywpG?g~uVWAq0^`yY-=R+YW$n$?)#K$i&QS=diT$C)M1m zQUk;d4SNIiQkFT(6Cjp!CMtFN zRTGSIBR_(qm81_n;IsIu=bVO{+Z#n*^JS{87c9)+HZCDnd^rL@mTX>!O@y2<#%3^( zzGr>DLj~h2R|pTJzP-vxP#UT%ecUu8>}x7@<2k)HV@hThGJ>~WT+$A*S!^$yvO5gL zC<20s&)nmphq7lYv$>E>QT;ff-`~xGonNkE5ZEtAPUf9>!Ez9pQbxcVRI? z;B)*XEp)2u-6vSy75=)V0n6J@y+Wj4IR2XRYapulF+yVFDSijwu82otP8jSfkvz!P4R!Vy!q7Sva4^w{`lws zo8yh`0r&NW>Q%+Q+`-;_oyZPXE%QDYpD;D}R+{SPBj;KB-mpITyv?C3%~H1;%{Ka9 zgwj76V$xRBwcl&^hPLn!Q=wvu2HF^Q<_|sDE=SvPdZg!{74r?$ZRghs26Ru&raf;| zW+~#Ad@K{z|1Qk++V0|8LfuH#q|`4@viRQi9r7{D%ir8EhQqomH zmdlDOBsFeKhBk}h59T3$f$lih(WDP_wR1N@_H~2z?Sm5dXeK-*WJ-Z(9-&Ci?wzFQ;xWvk50YETgfg?8JATK-M=hcc($3Gl8CF!m8Y8(|RjAKf z^^27-YHrS(j&Tp?7tXrz@n(-Y*U>hlI0|VSpw>i0&x^{G(P|RvjFKzd!r)8Rg>%~n z5@QqWV${;M82hdCrPjCemYj%(T6FtP5YNrd&&=~_UoFR`yb8f5-6Db zl0G^dZ5lPmx**5M3BmDc^EX~gThTL|#P7kk=O;;3ajO~Kh=|Jb;wpE4nEtop(o3To z=-^etJavT8vL1BuUgt2{1EC7JHTLDC>`*%5!4>1Ys=7!2oV*~}ihx^!KooaSPvp-J z%_b{ZPDT!ng?X;EBs@LR!Ox%w>G^pl?)ecaBd;+eSe5zQt<_ zX;b!3KGD0!1s33m*jtrWW=^(7Ce4G9ax64k>NX~DZyh0jJ=aMoGXC^{pmLYb)S#cFu^)`T_@j*(IR)y?EhI9+mE;p}`j6mm zT7N)8@6_|T%kEdF!g)^On{QNsXbi(Wzc>{ZGF)(cz~9|1*Z=5l{Y?)0N4NjUA;AOS zynnh|w!2XPZyn;Q6jRgJq4Dd7#;?V0d|6YcN(CTua0}mlGD)m|k-?{sqYV6N6fJEw z+&yn!VuV?Gf7n;ln<2g0B5z1=PuPA15wUuC9Ak;f=@A^KFP+nkQ88%kEjp4S(sM5+ z=e!o*_Duy1*LNzYd-(*Sx*m-TZTA9T3q?LoDSD5hGdKujlOC0sJ6UaxlV80cR*vau`zRtI-!_K$==*bkKEGW(pNtOBo@bh z$TJ*^#gT{PTaRY*_EX|j(mEF~9=V;A+7O!zPy-pq5SdvDxa0Bvt5;2=bXHK64jrblx~&O{UW9%D73cWWWW+oj&(h z(nHJ$--eeZx_l?e(>Cs2H-k|y9lOJNy&}B6lf=$os{(YqTv%J*BNKUch4=1m0SU2D zWIYo^Z>E#s`P0e#1Kf&7zUIlSbWw&5x&GpofGw+Gpj7PY%CC=(o%|B&QUKciwE^k9 z>uP}Q=z23vv?_W~ga4|1Bf182;DDb4qsD^#4in6nTFx!n9@HRCSAn58wao1m7Z#}P z#huotZd8o2NTy+s&fI2V{*=Su|6unLP_g#6iu`mEzG8`FS_;m$o1fN&F?Mqv7o8?d z$Ja!ju6h7A1C8ZtqULKNRi%eDk1iu_Skd{8X-%JwKsVLV)4|)gGz6|{jo0{M?#v+fI15eFIwN+;Cx-w zC16es=%jaS(MJLM*MLdW$vJBGHxYO+H6mG#!q_v9iTyh9orJaHWy|KLL&H;BGk+Yw zNH+>PKELAs+X6&CceJIN$5hR>2*s|)JqkT8s!f=FJv=z^WBxB~Pym_?o&A1ETm2M( zhpAo@{PhUF;n+urD9;kMXlbK%{~Yq8MU{KO?`z(8~?pfe{<)Scv>B>Y;;$pxIN4fjcQ1*ihS>c| zf4c7^S#@(2B1h$flh4PO2T!E{4tn{Oynf5x=#v;n`(6Cj>I1#YgxP>?EE6z|KYL7C zVS4$Uq)RnDZ%bF%$4b4hKZj$dhd4VKU9?Xar+X?LMcp$%H2Cd4mj1@~$MSGdJ3Nu| zDpZ)kkIKJF=ADvmxwh!>$Hf8*F7d~LbLl<`i`~nN!0|=-XD&utELO&Bp&@ z&hE`L#(RwVTYk9)@aiw8qQ**fop#21wsl9b``3!Z%caLPk1naFZ?$h*?B6?fs!jAy z9;{m%@ZaP3mjw!u$02@CXPoVwKGIl%ey;I_t#C&>KGx|G zyOemerBsz7_xp%KmwUzlW@p#UsLI7(qdt4nXXj#A)RU4>LcO4dLJ`pxLpOfcVXde4 z4Wip@U4DY7(X78WD?@@({iy?s@J%i`}#)5ZYHvs^Z+X%lc(NCo}A4*>yOyCBnZoNnPHElKes;=vYvv2?C@L#ZS$r={j%QdQG zdiu!uy!T#JTT5$rXoYTH^S!+w&o)*^u^8n@w!#cnq=Vqtlx-f-Zhhu@RaZ`OlZ%2;~8=1jMj_XZ?+)R^vtL@7Sqn0mqyOUh~$$gUMy z;-w=&-pg*6wcMWko#bqp5z@P8&S*HZ*ZJpI$}U>Uofk!lKBmgNVcyyc`41E z>7=dap@T~lTiG%XK3uYt8N4D; zLqbV%0$=GzMNw5^>v8o`$%O7BVKl?okE zYm4*d+2o6dq?#6L&W1)&$|ta!wdWM8;w5NTCQL?F!i#;43SIyN!rGLYNrkDKV^ub} z;R*T6>9e;77zFFrwFEnc=)H}7-ip#>WR!E88zFYvdyGjzYM=wvdFq0l0D?? zZ0MAA&)gnKz6`MDhdT6=r>b7BUt1+O6a$&@j0HWzRT!t90d(J0ow^n#U3ZUL@}8X|qI@wt$!Qu;^}5esOt?ns zH{3}%I?L!xfA&l1&J#e6IylpKe68qj>5@}_OPBnc9`#>(`+M>CbV>QPs5{mZ@49v_ zU9$6p0SVg6cIy{?0PL#RnJ=3|IaHB3btkFXWXuzX!8k-OqnTZoE9HEm&5x)h zCnu2s#qZJq){EJr(|y~4E(1Lcof3kzrQG`ifsxWwZ-yIE^YQJtp0c+@0XA}TXyvik zuDpK8SZL_7ZGC}q^xIB0R44MZEW8@}W+WR%&e{KsfQ;12$c*Sukb}=z;Gx*?dsQ~I zi7e{!%FZuKN0_C;`3D?%4&3)HDTd;q?Nj5~05WK%k+sZR<QGdKP==eq(SWqpKU& z< zB_#6k-E+nz5xgTzu9Qd9EG3xxWcwEB1nNbvvJxHE-(1$oAnfD~4M{(3(kAYJFKeZ4 zjb;q`1fn?@Ki`=@H~GM3OF>b|ufD^PeFY!5K;Tm78FHo;vwV>Cb{c)p!?Ws@CPvs2 zo*7ZG=OaO)A#n%)F_hX2EZy}O_ya%FKDr_cBX<|8(YTV%On1$;JIjE7+eKStkIhXbk+Q?d;cfYlQ z#-bH|GwpWcX1rT>jTn4&VF1ZbE$Ae<%W;`M5;>3FskgQC(K8o2Y-eYGu&}VuBnh8v z(7zN%I(O*EgQ#KTxDojqf6isw->79Z{|D5vjKb85?=Pt}Sw&|cp=~Id;W^3doONm` z@mhiPp(9$UJNr@r-bz3sRXMey#!L@}%>TlB@@sz7dE5t5+^t*J=J=mFsDH~}H1E^l zUd|EDRlh4mKkD-ZJ1^RhZN8XQuW22zq@kd0ZlDIr%S|1)pZFra@*^S3H_m&L{JCpE z)12@9m5hmySO2GqM?C}NRPAm&_+6$Q?I~u3&7&ze@(x+reHa|Ac*MCkb(i7)jUr^b zpdtG7O&0Zc5(=M=eFWdb2XJe+5Le!tgf9mQd(O1_srJ|URjr?dJ+aYON@S+15aa%k zyr{5udZ`;$7jgGb$4aZ^6+s4ZcL4S)432&(_xjUL(FxcBd^#0Hj z`A+i9zh3vUh z*o0(T!jg01;68X|=MPa<>y@fvPjas-HIERU(p0dqu3oboDqX(QK^quUIzO=55r!FO zd#4L_=mdKB6dc~-Zq=;3#9eP1;h(=cfo@}u|;$ePqd+$@9QcANBF&Us~m9d z^9s3R*|}KvWGv1CBn6^SZrnl{x07YoWvg~TQp-m~Oa?LsQ|=e1LCwJ#LzEL$wz}?f zy**7L={2$`74}WS4kLxhqWwl-u;A2t<*N0JuA4eVs9#(#(}f!MsTuZM+iM(j3aWW* z7;uUOeWuNpuC&)Z4?l3n#mn+uO0eY_`Jz|&6`^1W>h)j=cQhIw5vm_ zE))9Mc}eLWoQ-C;TiCxW9uFwLtSP2UDzT`X6EGix(Tur z<6jWA)RUGxKXWOeSI$vJx1GzE09Ka8q}MWlo5i+56P2kL#BtAm(J5s$*mu{GXkKc_ zO-QvVKQpM?41NL1qw-O#z0v$${ug2GJX(YTYyV9=7Y~kB!ZG^&o8btD@$`^v4yL*( zlQtvHqPeZy#e1}v6xG6JF+*+ctUMc|@)S~H&)E*lw{08S_=JMPi+4tLQZA+dJVb_# zsW}`Q1jSelr+r-pNU@+nin=`6CC2Y0+-t#7UQA`fk;N~Kgr!4~&sg-azNT#5t^@g4 zYaEoknYH*!YkoUZgI%fB>z^{+epOqP7K z%gV|wPVBn!H@lNakFU@%52+jt-;^LJhMm?>mtN$P2g&yRb7PFwFV2 z$k!dq+vMYn3C9hvN72*O8-)9F%<0Z|FF z2bU{il!;(a^jsL4(aXRtG8d=b!rEckS>^9QFYrwg7)RI0vk;&&1hch+~36{(>v=dG&B&g0hmu1 zR%7>;OeH$?^!l34wSgyBgx+qA8(d4pUSlDjGw4F_)OU-;&twR0dV*(H zZiKt2i5o6&<6BhkuswnL0ui0}+V&}2MYq`jzDNJPu>Z&fSDjb;`QoV|FoG68ICSMhyQ@CbtvgKJf#PRu!)msw8yg$bHgSKZ|0MmwRS{9R|GVX@H% zlGshVE3-?+^zZE51)QbXy^nHGoeeK^)XBk3=Fv24l?lG7Cn;yIPBDA(k`~D#XUoE+ z4v4z~l0nbreqohuDl^sYR~2Jr22Zi8*e^+Y*96rZ^G7JE!5Tqhb+C&Gb{MYJgf&><9+p^LicM@k44=*&eXJ$+KK?3 zycu}7Nb$D~ktHO2eWCAzq<(iV9}i27=CI^LD?%|Al!KY3Ni>!h%g#MH5cU2ma@*lI zIDC5#ng>Du#+OJpYxn9$z5&U?qtzwTh&P!8 z6x_uk`e`%b#FHrFLWZlo_n<9K9a@jJs3I`#jX)zY*QGji_ z%al$i%Q$f`kX47ytS5C`Oa~gD$wjFiys}B;pfdFF@A>_VBeotS*5&faM=;tsQP_+^ ztA%C*=qwLL?NjejC;$2)(CxGs3T1+M(EtjaAYA$8B%rYCZBj$i!V>&s?T1}f+8=%V zwF{2e+L!---aI!I63P+n%*59tmGa4M*7)13?gC+(?l%XjXcuI`0f`@ zrdQ$DLgpLVyNE&cOl72`r|o}X25V_HJj=lT&s*N-iXcHP4Ttl@ux7O?U3n23-*G9? zeI<`4yS)pi4@TOU@)jo^_Ww={2FSyHC%IyHmsr^Fouo?q=?%Qw75%4ideMx&(>#Ed zR|m^jGfl{R1V~WRu#q4R1g^nfK3Jcot>eTKSaAZgAvga;gDs%j*&C-)G zNl`h?ySg)b+X}@v-Vdd|q>a7mLu_s`o#R7(xnb$Kh1}_#x;CY<-rZ@3oMCnH5+CV~ z<5)}7$;pva-Up%`CS-J}Ez!GT*=Z+0*qYekut|Nb!0=h1LZGXN78twapv$RgO=%tH z706gw?Yd+j6rypjpj<>f;8y0IQh`jmwaozYS7w2Dp?8078;%-P`qis!X35U#O2{GG={e{FXn^l8w z^;Ixl6|;l^Y0cft9=qLT9d$n`LQa&O7`Q4ceJzce4AH{AeUy^3>2PMQITiX@1j|>p zXSYF8ZRwLUMuI<3t3HF=Lc5*=&q5Y1Lfd`6TqndGy`@2O?L7oTG}m7JL$#|4Ge#Vo z`}-_>i)9&vL@J{o_)WJfXX3C4-W}lxC=(4?_;^)PBe7x0 zeX;2|N;wOjRSM>9U3HkHG)O}24wj+kcgoF}>Yn@}V zP|!NbT_&#GmcnkCUgbt2Yz;sCwfB07o(0Z?8akA;Xt3dHuPEA*$b%7gc|^0xQMGb6 zC9ct;1|Vz>ZsW1#fT22ryVzvAG!LJ?$O!UEvQUVun(+p+40=mH7{%(q#i&>NQyZNc zE~Iv47u$`)qu-W}wEI|;xxVi*1FqVa+7Or?X zHdCh%?Ave$Z-JS6r4&I0K7AP0c_b@#SK{LnPKeE2qLkMB5c9~vC(Ya#XadH0g-XUR z>5fmIJhK$pDS0aN7f?vYBoFwR(DE_xuH01s;T8f?gtr zO9gK_yI5F>;?ok=eJKzd5Cej6U6E?#Atc>=Y|o0Yx#sYN_I8h&v*rl@;+@+L4`RT} zm&3~!Vb=+F>IX5Rj|1m4WS|%s`A%%#?M@*RHwtn|9c%J78A}qReU~pvVWQET+>p{_s&_oV97B+*@HqzDLk3f3#d@y?jqEPB6 z&H&*DgprDI8sD0|!8{=)e5apjLW9`Z#Xh{jhr>4y;rkbKxsa%eMAW+W*g6*c~_8!5p%6R6wh$? zspGi$SDX~z@7pLr|MP8>bTeq3=Z)=*g~h$%ihp8oa@tC_mf!CCe1w1gnCkc^gOiqj zYyPqEl^gAnl)k*JWsoy1hs?$sYmpMC^oNPtB>_`>hK=mtTcX%32VK2TJMTdDZX%^kTxpAm< z|LaQqs7$t6#&|rYK&~^lSn-!Ti^cC+Q_jj{Y0OYi&^*@tQj>u-B)G_^kl$`pR&~+6 zoHPwkA1M=~AodOuMidOC!8Bc7)na}OlJw@~g4I2IrNMXDm=_x*=NP43eUtM+tUsgd4>1w znhy4Upe-jn`pjKm6CCWWGX2t+s-VhG9--rQ^%u=(0rN|?=Ie^@`>gJl9Z9IU_un2M zr|cJkg^q_LjW=7evzrBZI;EOP@o48^l5;3TLy6ug4T>${n1CR{s6|B7@XlfOJ>_>A z7!kJy>%~hdO{cMC1=a$~!bb4K2mGW?)LwOx z+!-#@u*-+Ui-(7(6zhDTd&YSul<6jSDOVzIIYXxC3A^h>_L?*4(UjP9+uHsSH6_y~ zb)96e?S}|c7{i^}W)2WaEVP-XXTZ4{TCs0jx4z<@jkv4FSV06!mV&`}Vh1xGb|1eH z)W>=Y_~|FFERmCgZ>}(dA(NJH^2@rCB4!OJIa9IfT`3+4*G06=`LL9EbRydL;!JSlr?+msNmNOUiKhs!m~d>_)3l z6CmXlElqHgPd0$=l9Te<8I3#{MAbn|rTxV}kbf{@%iRymqw>Kl@CNu>&kCqm4 zuk1Uog$OCNdH$+(q^E_QY(emyy}hg{3Z+%qwqBLhQrBf1LV+Np5F;Mhr8)M(=Pfm@ zqqnPJ+&SU;%0qi6y-HQqyV^TY?xskEifM!5f^eOcV(Y#0-tZQ6ZlA;B$}Wk*;{(TA z6K|$d>39TGD)ha=csi@^mnR`ZyL@61BBe1)9@uQ|g_)U+{_I>7!+m3!SARVCf4p9d zKcHCkd}ufJ(;uHW5^kQ2Qe2*UpLz71Ijdmdb9Oj>c|Pd z`;}IOE)wZt8(XCxCyRnt&jDLHwd;`7<9lrbzGXl1-${ZMGXL7qpXC*@cf}j0RmW4s zv1{7h{}#}cU-I(!BIG#H{!igdmjN8Y|E7#ZXg2pGI4D-2^@KNgf~MJ1iBe{o63Qr- znOnj)_oeZ(a$}2kJJVAlIpGON%$LUe&)$EQ&dgsM4)dd?<%7?Rqg}K%811;miH`Hi z7ry+Z;swF)BtBXG-rLE5UuOEe^e0p4|FU29pXi|crQbh_|MJUz>S_QQt7SO=ju1yD zv0?*Il7=q8%)LCU@N&inM>?uLbt|MBx>j(;HtBAx^icnXhdali96}MoZ(g?bh)v=$ zAQI%f!bDZoJ?HxZAY3eTPJ66p9N>u(h+OiP=TLX)D}a_`d8M8u*A3Ve7i6o0wONv>`-%Y{Ch0S1iPp3p>7H zqwdW99-J$lomR!fA547vXT>1|>^#kc2Ut39cfmYFBw z!kZ0uoIqYN*r<`YtKUi-8DyrrO|+Qr%~0AH=L$l%J&wh8_!ljht7bn3QMgZ@l=~=_ zS&T;0C(lNDe5x%di(M=0Q;I>V<@K5<`(`p-0$m5`xG6k&ZLL(D&y(;PY1!G4KqPNB zqnMM!m_qNf>0VjT{-}rrLGqsC*!otveOfDaDrWs2+j-d?Y-T-O=r8kh||&(Y`Ki`)3D061b-Pmzo3*6(44R=OzV(zeFVlEQWl<`r;*=d zCKqx%#Fg)w5@W!Hee^VLBtn~w>!5GXRNnbov7zJh^)!cce?_xSLPk!0FrSf4hMEnE zoE$MRcclKM_cC`aySZ{&sLlJ~JqCy6a90)zzPYvbEQcDEcioow%0lMc9mQ(mZCji3 z&kLXGqe7B$VOj5{CS`Cqb)2B32scuC>S6s)jyyw-sKwx;@1eJ1wta)|M)N_ls(tjZV$T9v_e-N?Q%h z26pzzM9xo*fjVN@i;KGO4Pob%EWf1JXZ4sUBE^E*CHPtwhkA4R7-Lq-GlJoLt$80+ zkSP0#8kw22UyPRW^M&?}KZ0e+WlT}Z+u_X21j))h=;$CfGGv+y67h+ zPiZUvp1SfwiuWyBQEx{=jlHEcPq(e35NF&#=&U%-dU1m`Zj8H%Z_xQkc($}yD8Htm zUZKD+peM7~ryClAY*G7=LKnB)0LdIm=)YR$Y9xqJey)3A>4aN*K-)aAS9@SVt9hXe z%8_TQe;Z@Z7AJ436&pi=1rOg7Qr=jwWV!wp0b*o0uWBs!Q`_s02Mmd|aWrJ$^~KKq zQ&Md|0N_|^=kR={u-2yi4{o-zx<9zt$bWLP{cnOg9nvw8Eu#T-Jjkrk-=R(pGb>mq zn)NDneU=o+`hE34dh-5jMz=u#K&Wu0s*6#9VA+XN<8AbT-@)I>&I_|yOe9|(HaGF5 z`T%*8L@g`ZZWo-c7=H`Z&Jw#hDvVaVYMAgs@1C^)LD%tS|Jn%b#XQXp1Y2DD8pk)1 zEbdkgJwzHI{rSUiGnQZ{A8}NgK~Io9QW^Vql5Gj2Z)J1c#rUmn z>&bcRC(iF}KePJ1Ziyc$TVEMLPD^2YD?N6lZ@7W!_ok60@8GQvrUsrB}aZyi7pmfmn66Yl<^)Hs5z0LEnLBhovzc@7IDc+4n2I#)3n7Z z>g{yboioZJjxLQ+597PIZ6@X$@+#caSZmGJ^NCSu$!4G>*oQ7tA3T+pv-+;j1thhn z>k4tFGI0vDZ039|u{FVWdM$E1$x4?&ikl5>sOKPX&rPtg7xL7$QT-RbRH$@k#AYDRH8JYq_#fHCROi#28-o$_;Df`J8Eo>cW0F|l^k5`Q% zTqsfP;e{nFS0KtIb%K7zoD}uIy;?jbwkBrS&|C6sI~=aJ>gupHorpe-q}?etmNynR z=yhN3KQbsC7AhBPxw7cEm=}`sV2a^f`z04&kp%g11V!M;Z;IHIzbj(@k6=qwB1gnm z-$@i9QU2cd4gU!Uyw1%RhgOjRP{6P6Io8JkiGBcZqa zU~?{Ozvecl?XS;z?M+n#ZkeNtg&Z4Y&NbOzi!zV>PBICc zJ(Se>QmY)h%U-Y_aw%+>x-G`9vA>R-WYggBfq>dzGIr`N<9#b>c7-Dfonx6hjc$KA zGc{#*k(@*sA}GuFV_8o^^Zl5C32y+*&$LOK+DwE*1pjIAOrD6vbpmtz-Cf$+3)-cv z*pwlIWgKsr@Nz_-2n@5()6N<;R2WQa_gQ<~t(d!O9U zMWmOG*_;BpaAc=5i+4ppJbCZ+CB;Q8F%bss zHtt2Dtc@4dG=v#*!b?NJq`;ERfk}~y&oWTX6wInHxZeM9U%OFuDAfsHXR#}hU*+=B z0Be~K2FW;K^1IROoX7N2-S6t%KPRNW31tu4?sE!3swKrd)_*zV$gO!@V=9?E!M?;+ zQOzq-FA9|`Y6`bFATBBvjto&&TaPsfTZg5CBiFL!CQ(O5GLg!K8mp3z-)5I{u|7J^chO+;tr zbOQI-RKKO0+L&vuhNaP>eaiaDs0!#M(1BX-&6WDNy_R$Zaom2gq&UUofB<1-Q%>hm ztAwv`PIY(dMzbLTV})VgZQ#Ga@5c@9v60!1x<(Kf)bT#3)g()<@}$$_Q84#A-C`CM zA0V@|$4I%^mfJ(DZ;(`6rpk428Qh8w*Xpo5Mp(`YPxUFw-M8)524o4e=0Y5Qv1gv6 z?e0JbH+~#HQg;n{-r!5sxs&2G7z>YaeiCKr$G$isV0}&3`(E@MDoyiOl?wU0$5Gy9 z%403n!Vme z=-+l}r;O0_N<2^P;O=P!a=+-3HW!fd#PqdSnu=s8OL`{Ya2PuEiQ&I&^z0Sw%Z_rs zWe^+v?%cRk>!-Z-rX%mOFIQx-8YqVV;GyULo4`Z=P4deh{*)--PkDY@_3Ui7j`9Zf z4h^6iSRn2!ec3VU6{(ZH?ZV2Ox4O61*3ef#i4m#Bz0 z)O*&X{EFPiJ=i81S|%ZGBigtnJX0|kGt^q$l(KRb7 z*mXz}9D2rD#l4GhNgK(UsdF@)!s^i+))u9f7K1}=mD)zt*&GZi;ku^Cko*L_`_3KD zh#eIcrMN+UC>7QQRp;WsH-geA@AOPaYn0JjAwYN!5??8%xXG$ZUGE3sKL4tv`5xLT zi}pB_Tg?lzWcGBVu~Vt0!tyk?A0A~KDjhRiq_ z(9899_^tT_H5KaF=u*_oKje|K#-IcaWuTShPoMHh5?4v~t!D6qvU8836SmIWifuNk z)4D(xIx&dv7#cof?{*1QKQ{+5(!vu+pIf|*u9F&PY>ird*8VPi-1psmpQQNDkz*Mf zp+Ed8u{DTEvJWTmZC_kwht#wMYlvOME_GfP7jDukDejnt+z;o$F-KW?yUWz;b{7Y8 z>pl)hU(2+x`K6C)^u(~^P>ww}$}ZRNB_d>ZS2)tEvR_~@=QBd!m%&CkZ(;i>atrI| zJC)%>*b=s@`Ez9-yH0|9jzo_#IC%?82X{Te8?UkjXx@Rz6d{c;OS9XX%dT|Y3C35#k|hs%$Kmr> zUW1(sh;PsnUCnm7WdAdb?SFxKU#s|yAc1?pH^R&Kb!E21+CRf>NzRq=IPT4#IgRtB zKi$=-+)74&G~8a=@2G>W06^VuyEj&O$F+>OAjx6=3;W} z8w&b|YgI2~zLOZf6kPs!73YlnZ-0<615ro@7#Ra4Q!t3W0VowNMi7&7vTc%f8XeVe zGtJwyKMh^=ULEy|vy^O9R%7|u(u6!2%TjOY`Qu{`u*y=F~=f`fWYLVZCR5)_M>H!N)akPoXTUe{}WfH>+oU zF5ZJ1KZo_|wIGcaR=- zNMae~Q4^M*Oiek^GDXQKxoP`+&P)HG{ZJqVA@H&JNqDw z*LO?#9*M)$7-^h^^vB$B2I2)4ZeuuI+Wf*i3?`@0(i2~3%|?#0XlkdJguas{2T_2# zEZ+avi~RHO5x|!acr$&|Qd3_EzPs{>hVAkrn&gs4cpQXWoDqsZ0OSLP zaFedEQ@C!z`abx)DU>{VE-E?WTXflRFxOV5nb!rva{!ZL1{VE+!^r^A%+TZmuM#Cc z5IM>(e?W4Q{^u~A^S7?=Q&*ths4?xCv&p~awcp&W0lARUTYo2+HOoJkG$D-WrQ=dF zx}Ln!r}E2n4Lp3d9eyNkvu!~xoP<|HU^!${?Hv=1o2#@LB<}d$$LdS`0lgyfP4fu_vl{9sAis6c?W+u` z`D8laL&Ok9e9Fk4b!t_}OX2%NI1>_RUYr^n22{B=+(??&i%AKGG^P@F5QB+}tiCWr>l92uM6i-Oi zVYgHpD%12BdOXAezM?SreiycfJ1doOBiYdn7TjV^+rhHBx;}SLJ2%vLB z5D{3tlj;(fHn%0&iVN)M9HP6eE!ODVp@RWIWND+(FZXwE1nT-QJ&&6mTKP5TEeX^0 zkiA!-3LPnN7g+K-N?SV7z!p#e4Vr_RKd=2P%j1fbT~9fVxC5lEU5V47vmQpD6o-E;7Ut^ZKB^1X)2-$O) zyIUdlIKC0JQhD^LJz9C0acy%CJjneaH)NL4f^G$h>e_p05+CzK z!WUIPGI}deSM2?IITmI=)X{1`cW$0ioe$W?3!2+YnA9Hv(y z)b6P+(zqjda5x#xxd^TZJl32?u2%JRH7FYzmJFde#_*eVocb0$(bR6I^YTB_r1;n8 zr~7~7`ROpiat4to6Uh+%WiqYE=s5V_^v@iv9k$XJ6}I~{Pq)6_46M7VkssSrhPYd6 zx*aqN0Z_BrkN59P>@70Y-!M`OykD*Ri;gJt?P7?%AJ2pbDZPG2b#8?l_i})$TT7wt zvS;9F;A=RiXt-p`G`pQwtz5!9)j5&c zapW9mhS_jQ)HRK4zV{=;bCsg&EFS_lV<7skxu;8M8%q5(`%Y`oF;Vt&g%AfA`?Ntg zmoq|aX4JKQ5N^aq=S-hf#pFnJd_Me~gR0FO^b-mAA)TJ%f8+SFa*A<<0X#H)5Pmej$mn^>omRO ztkg7su??*DPMHOtk~GbjQrHlcTVEna>)kY+H3s2vcI8SPfp4mszQ!Fza>c2ebh5`= z!E6;fLnomt{;*b0tN4etIF)8%(i^i-ZtGzZIab(!t!yIpYV}RtO8t1Vumv$)r2ds; zNpOblAW5rqYJA7h2u4}L$MGGH_M#L!I_y4-ge%NH1?+w`Yy$K|;i{GwLGz}BFJ^!E z!7O~WP(aX>mM*{fi#oN6-ofv%sCj>u9`&eAOj5>AB;o#xNpOBoKiaJ?b4;wr31 z&Ry1h^Tz9iy)9U|h8gQ#2Ve$jDzB~(5j9GZg?A%64Z_Xx!MdSFkhhtbDs7@{!BU=y zcGp04u$Krrx*Vmf)a4kT6q#b=FOs$UX(6RD?tx7J+Bh!`WVr4OBpQTD_mW-erL_p=4Hf0_Bn)cmpRdtYn@h9o`GUo&Jm8((*l3! zby_T8IQw9BTvB5J3Z~uMao@JY+1e8Q=-{PXsb-CT!8+7vc`hI`H{>d0Mo~^Dt{<7-Paz`Sqv@X{I5?W#;f7>w&$rSGy z!gxhTIx}k++2hN7{142aa`l7X(}vR=Y`<_Am(Vu!V_e>pHfxqHr7w>@#A0trFoWj(L>OF1|FRRhzp!|+eNWZp^y;7&@fuvdI! zUCW0@AhWvF(Qvb}5G9SKe5iX|r=H z@~dfxc9U&RkZye$m9^ZA1n*Bj;b!G#tBt~0?hBj2ulkGwlW7-HC$8S}^eWMFXLf)H z-_!d|2N$CV_^5R1Hjd`cJo;hzSa$v%FHeVLTYNNoaOx7vcsz6BWSChlh&X7+=@2j{E81!6VpLvZvWbPy!Bd{fGIIj>^Y9-g64&E*Ep&Tl!v`bfb` zX0_QSU3IE%XBgd}RUm6mWP9q|rR0mpU8m1?VV~VE%jk4}<_ZIpLVJw5Lan22cV}&% z=^fUaYRKQRa^B1mDJDE10D+uq1CA_<@eY355Z}l5yjDZ!?nJaTZ)Bbhd3fXYcMFb@ ziT3dt%CF_WlARu;S(cazTGL2lf%Z1OF`K7V8!zX@5072zOW^CF*7r%Pr(7N%8lQ)J z=u{0@QdXP;Ef7NWP%YZqI@H5&wYB+Ezn}8atP>B=L_VGtw+#>X24b(rVwYBHHb}76 z(@P~*IHv1f?_wg{x>T!TWV1IPs#QuON}Davvb6SP(fax~Ee742XJ!iNzV5Uvlw)KX zC$0;nt_mpp{gfL?KmY{Dc`6epy-u8i&@i*Y#OQ$AZj)?>x2@PNu7w3;`>Q-gu$Ps< za~o{%*3Iae38U`&_XZ#63%2s}`dg$iz}(S=Bd-lt-3Fi5z(4>NoH-s(uomo7tsdpK zwz08{io*2r zcFF0L7twXnO~&m#^&T;t1^5!jIBjpvX!sMbl$_B61k}>t|rO( zMs%!D;(Bssl&DFtKdw(S-kQK51GuT<0%q2sFAy@J*_}NSO)U4 zN;BFJ%*`#WMQ8I*UK1GQ_Xf4#0!3~~Du}9?<9__GB@1+Ad}4;w|FfjFKNGQjCaDdw zQs!IKlD@QQ($rma^MdV6Hbau(vI!D(v;;BMMm`G%HZ$82;jpe0b)rQa z#mUGw_5-H-isXkpDyl_&lZTNo<8X+&Wxm;mEO}U@6*QZ3)y*v4=#{L=yA+G^A%O5i zm{5z1va;8&i&^*qi>@0)_6q#gZX60SpE-gb^4m1(>f}WsV zxwn4v}Rj{waVN9SVLNki{O*iil2$TJP~%A zGTa%Mr7P7|&|HMUEwRcBfxHmg&dw(?MrKn^_w4Z;no`cMq%5L0@<|)P!yr#p4U|9NCEWo zr@H#V8@Pu?AE^9BR;zfNetJ*OF0hh?2My z?{BOw#(@c5M=Fp0c8W79YN5BF%FI0H*3o%kX0u&CaRM^_w>aMW#?NKQ$ENDzaLW|* zwLpyPb`+)G+Q9+HoT+V7`|y_Ax6U32gVMTRt6*3ZONhnki_*tM)h#v5KELY7mYH;} z5CKvj@BfH=z5u}0tucPb)PI_n!nKu!cK7O-wij)E zmss-#U(f7`mVDm)UIZ80NwBFeCO$(LIwCvEbd=9pC6|{DWrnys6Gs&hhuGS?%uN7_ z7Kj$F(eVLAyS%irm{n{-%-1^Qj=>vkZ)SV(CM3r0?XUijeIHBCShFU~x#iNa3R_>R zY)h%Z)wGbshlL*=CqrMtMet-kUhVBV+Z}wX4e(( zO|sy_Ar^s{Vq#HJf~EY0{Lf)!lTB77sl~Z(S$G)EIFpe0yPVw@j_)(0ypo_O+}>iw zg9+AmRYE%D`kj;807-!JXvR!!C0~ZH-38L&l`l*)DgFG3+9Li;?uF1)hQ6jy)QN>v z40jxm3n1)Zn}(_zTP_#=u6?J$%ShNCwPwFVXH?ykMmMC*& z6LzX1!P9T!lu%`0Hl&E67Pa-q<-+K^l7lYbM~^=D29s!qp|yA$dcDFGO_m)Nw%d|} z6!ntXe72Dt?%z*!s3fG1^xt@9F@n7)r&VE@XmVbQe0gUoO|n{EGJP{(8v_7vWl_&Z zE$^V@_87nK6jj14K5p@Ghjl(R>2xt+ zb!Vt_T!7~(xLVO=!qJTDtDcLGvs=Rzt~5>w%op`UOR%|P-Lz8~kv$9ViUHyxg|V(B z$|0{!oHJD_<#(c^XVYWI^D~1qf)fl~cCs=nZUR}CwfJS$INo<{F=(y58SM9QZCLWT z8o$d}+38*bDs5Hqw}?-*7rwIbM2!_27|LgeE@-=nk|t8aVfztaHrrYj4iS_iAB&o; zZO+VdS92IA33Riy|GB}(^3gmC6#R|jbs66C(2VS$*Qb;05f(NY(`5WxX*A#KXsJQx zlr`%@uHtFRM2*$+LPZyA{p`Ep8c;JKxu&&=VMbJuxgi{;IIl#R^X5uli37$Fm-+4# znXoT^lcLc^cTTt{{_Ih^>!**(NId*yE@oMLRUxruY{DwIzQWX9qFkU9L*VKH_9}W&j_Af2 zBoKS>7#_#GK8Q+G+WoX;sN0#P(ur0FS>+=k=1&(dcmX($-#s+sw33 zJz1-N8_{!o4lgMzSE+2FsRish@&++AS7#n{*fA62yH98OULptL>kec_iDa<;VuSPq z{o+v2blvhttK5cRZkqpMN;E4^e=2EsBH4N0#cRG2nIWL-ymBKQ)1f+q8_IWtlvNlR zb^@XZajl}?en0h|dvAEO>#d^YW(cp{kdwb~ix(0+9yEjjZfFqgQq+BwXI^P{e*Yox zv25KIqK!!HK)V@tM!Qb>t>0hWDfW83E6J2PeR5P;U zh<)2{y4g)tyMxoWeH7{jco%`I~(%iOep6{!t$9LfZNcVT)i;<3qVVpZ8aYpZB zejid=_*?4FLo1sCDNqTP!QKLW2f%RZKC?RJ;yTZhKv2x0Y%Py6JAPxG81eCP~O&#Y>s(c1VDQl72sI*46lBHU9uUUo2VLPbc+WLy7F>CXD^HJCfxzthz zHzq*njcr#j*GAgC+S-qIq#gxitA*pQLi`svsZHb zV>jw!d&lmcCx~vUG@Q+8U{%vaJu($H)-aVY6%pMbkmj%IWcy29q>cJ+YqX zG32~o=(d)PtO)1G*LRSpJB|

lOFHKxW{3#(Fx9m%qBfZq)kvVO1c3-Pc^W;%aRL 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ą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

52_`cE(zZMEpNgo`EY*4G)I09>a1 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 ?@Ps4J#L1b@yTXJK07_F;-CIu>*o89f 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.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected>.pure-menu-link,.pure-menu-selected>.pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}@font-face{font-family:'Google Sans';src:url('data:application/font-woff2;charset=utf-8;base64,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') format('woff2'),url('data:application/font-woff;charset=utf-8;base64,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') format('woff');font-weight:normal;font-style:normal}@font-face{font-family:'TypoGraphica';src:url('../fonts/TypoGraphica.eot?#iefix') format('embedded-opentype'),url('../fonts/TypoGraphica.woff') format('woff'),url('../fonts/TypoGraphica.ttf') format('truetype'),url('../fonts/TypoGraphica.svg#TypoGraphica') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'argon';src:url('../fonts/argon.eot?u6kthm');src:url('../fonts/argon.eot?u6kthm#iefix') format('embedded-opentype'),url('../fonts/argon.ttf?u6kthm') format('truetype'),url('../fonts/argon.woff?u6kthm') format('woff'),url('../fonts/argon.svg?u6kthm#argon') format('svg');font-weight:normal;font-style:normal;font-display:block}[class^="icon-"],[class*=" icon-"]{font-family:'argon' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-expand_more:before{content:"\e20b"}.icon-menu:before{content:"\e20e"}.icon-favorite:before{content:"\e291"}.icon-spinner:before{content:"\e603"}.icon-delete:before{content:"\e900"}.icon-edit:before{content:"\e901"}.icon-use:before{content:"\e902"}.icon-loading:before{content:"\e903"}.icon-switch:before{content:"\e904"}.icon-error:before{content:"\e905"}.icon-dashboard:before{content:"\e906"}.icon-logout:before{content:"\e907"}.icon-Network:before{content:"\e908"}.icon-services:before{content:"\e909"}.icon-system:before{content:"\e90a"}.icon-vpn:before{content:"\e90b"}.icon-storage:before{content:"\e90c"}.icon-statistics:before{content:"\e90d"}.icon-hello-world:before{content:"\e90e"}.icon-angle-right:before{content:"\e90f"}.icon-password:before{content:"\e910"}.icon-user:before{content:"\e971"}.icon-question:before{content:"\f059"}.icon-docker:before{content:"\e911"}.icon-control:before{content:"\e912"}.icon-statistics1:before{content:"\e913"}.icon-asterisk:before{content:"\e914"}.icon-app:before{content:"\e915"}:root{--primary:#5e72e4;--dark-primary:#483d8b;--main-color:#09c;--header-bg:#09c;--header-color:#fff;--bar-bg:#5e72e4;--menu-bg-color:#fff;--menu-color:#5f6368;--menu-color-hover:#202124;--main-menu-color:#202124;--submenu-bg-hover:#d4d4d4;--submenu-bg-hover-active:#09c;--blue:#5e72e4;--indigo:#5603ad;--purple:#8965e0;--pink:#f3a4b5;--red:#f5365c;--orange:#fb6340;--yellow:#ffd600;--green:#2dce89;--teal:#11cdef;--cyan:#2bffc6;--gray:#8898aa;--gray-dark:#32325d;--light:#ced4da;--lighter:#e9ecef;--secondary:#f7fafc;--success:#2dce89;--info:#11cdef;--warning:#fb6340;--danger:#f5365c;--light:#adb5bd;--dark:#212529;--default:#172b4d;--white:#fff;--neutral:#fff;--darker:black;--background-color:#f4f5f7;--login-form-bg-color:rgba(244,245,247,0.8);--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--blur-radius:10px;--blur-opacity:.5;--blur-radius-dark:10px;--blur-opacity-dark:.5;--font-family-sans-serif:"Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB";--font-family-monospace:SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;--font-family-normal:Open Sans, PingFangSC-Regular, Microsoft Yahei, WenQuanYi Micro Hei, "Helvetica Neue", Helvetica, Hiragino Sans GB, sans-serif}html,body{margin:0px;padding:0px;height:100%;font-size:16px;font-family:"Google Sans","Microsoft Yahei","WenQuanYi Micro Hei","sans-serif","Helvetica Neue","Helvetica","Hiragino Sans GB";font-family:var(--font-family-sans-serif)}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{font-size:.875rem;background-color:#f4f5f7;background-color:var(--background-color);color:#32325d;color:var(--gray-dark);-webkit-tap-highlight-color:transparent}*{margin:0;padding:0;box-sizing:border-box}::selection{background-color:#5e72e4;background-color:var(--primary);color:#ffffff;color:var(--white)}a:link,a:visited,a:active{color:#5e72e4;color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}li{list-style-type:none}.table{position:relative;display:table}.tr{display:table-row}.thead{display:table-header-group}.tbody{display:table-row-group}.tfoot{display:table-footer-group}.td,.th{line-height:normal;display:table-cell;padding:.5em;text-align:center;vertical-align:middle}.th{font-weight:bold;white-space:nowrap}.tr.placeholder{height:4em}.tr.placeholder>.td{line-height:3;position:absolute;right:0;bottom:0;left:0;padding:.4rem 0 !important;text-align:center !important;background:inherit}.td[width="33%"]{padding:1.1em 1.5rem}.table[width="33%"],.th[width="33%"],.td[width="33%"]{width:33%}.table[width="100%"],.th[width="100%"],.td[width="100%"]{width:100%}.col-1{flex:1 1 30px !important}.col-2{flex:2 2 60px !important}.col-3{flex:3 3 90px !important}.col-4{flex:4 4 120px !important}.col-5{flex:5 5 150px !important}.col-6{flex:6 6 180px !important}.col-7{flex:7 7 210px !important}.col-8{flex:8 8 240px !important}.col-9{flex:9 9 270px !important}.col-10{flex:10 10 300px !important}*{box-sizing:border-box;margin:0;padding:0}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:normal;line-height:1.1 !important;color:inherit}select{padding:.36rem .8rem;color:#555;border:thin solid #ccc;background-color:#fff;background-image:none}.btn,button,select,input,.cbi-dropdown{line-height:1.5rem;padding:.5rem .75rem;margin:.25rem .1rem;color:#8898aa;border:1px solid #dee2e6;border-radius:.25rem;outline:0;background-image:none;box-shadow:none;transition:box-shadow .15s ease}select,.cbi-dropdown{width:inherit;cursor:default}select:not([multiple="multiple"]):focus,input:not(.cbi-button):focus,.cbi-dropdown:focus{border-color:#5e72e4;border-color:var(--primary);box-shadow:0 3px 9px rgba(50,50,9,0),3px 4px 8px rgba(94,114,228,0.1)}.cbi-dropdown,select[multiple="multiple"]{height:auto}pre{overflow:auto}code{font-size:1rem;font-size-adjust:.35;padding:1px 3px;color:#101010;border-radius:2px;background:#ddd}abbr{cursor:help;text-decoration:underline;color:#5e72e4;color:var(--primary)}hr{margin:1rem 0;opacity:.1;border-color:#eee}.login-page{height:100%}.login-page .video{position:absolute;width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#000;background-color:var(--darker);overflow:hidden}.login-page .video video{width:100%;height:auto}.login-page .volume-control{position:fixed;right:1rem;top:1rem;width:1.5rem;height:1.5rem;z-index:5000;cursor:pointer;background-size:contain;background-image:url(../img/volume_high.svg)}.login-page .volume-control.mute{background-image:url(../img/volume_off.svg)}.login-page .main-bg{position:absolute;width:100%;height:100%;left:0;top:0;background-image:url(../img/blank.png);background-repeat:no-repeat;background-position:center;background-size:cover;transition:all .5s}.login-page .login-container{height:100%;margin-left:4.5rem;position:absolute;top:0px;display:flex;flex-direction:column;-webkit-box-pack:center;justify-content:center;align-items:flex-start;min-height:100%;z-index:2;width:420px;box-shadow:rgba(0,0,0,0.75) 0 0 35px -5px;margin-left:5%;background:transparent}.login-page .login-container .login-form{display:flex;flex-direction:column;-webkit-box-align:center;align-items:center;position:absolute;top:0px;width:100%;min-height:100%;max-width:420px;background-color:#fff;background-color:var(--white);-webkit-backdrop-filter:blur(var(--blur-radius));backdrop-filter:blur(var(--blur-radius));background-color:rgba(244, 245, 247, var(--blur-opacity))}.login-page .login-container .login-form .brand{display:flex;-webkit-box-align:center;align-items:center;margin:50px auto 100px 50px;color:#525461;color:var(--default)}.login-page .login-container .login-form .brand .icon{width:50px;height:auto;margin-right:25px}.login-page .login-container .login-form .brand .brand-text{font-size:1.25rem;font-weight:700;font-family:"TypoGraphica"}.login-page .login-container .login-form .brand:hover{text-decoration:none}.login-page .login-container .login-form .form-login{width:100%;padding:20px 50px;box-sizing:border-box}.login-page .login-container .login-form .form-login .errorbox{text-align:center;color:#fb6340;color:var(--warning);padding-bottom:2rem}.login-page .login-container .login-form .form-login .input-group{margin-bottom:1.25rem;position:relative}.login-page .login-container .login-form .form-login .input-group::before{font-family:'argon' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#525461;color:var(--default);font-size:1.5rem;position:absolute;z-index:100;left:10px;top:10px}.login-page .login-container .login-form .form-login .input-group .border{position:absolute;width:100%;height:1px;bottom:0;border-bottom:1px #5e72e4 solid;border-bottom:1px var(--primary) solid;transform:scaleX(0);transition:transform .3s}.login-page .login-container .login-form .form-login .input-group input{font-size:1rem;line-height:1.5em;display:block;width:100%;padding:.5rem .75rem .5rem 3rem;margin:.825rem 0;box-sizing:border-box;transition:all .3s cubic-bezier(.68, -0.55, .265, 1.55);color:#525461;color:var(--default);border:0;border-radius:0;border-bottom:1px solid #fff;border-bottom:1px solid var(--white);background-color:transparent;background-clip:padding-box;box-shadow:0 3px 2px rgba(233,236,239,0.05);outline:none}.login-page .login-container .login-form .form-login .input-group input:focus+.border{transform:scaleX(1)}.login-page .login-container .login-form .form-login .input-group .cbi-input-password{margin-bottom:2rem;position:relative}.login-page .login-container .login-form .form-login .user-icon::before{content:"\e971"}.login-page .login-container .login-form .form-login .pass-icon::before{content:"\e910"}.login-page .login-container .login-form .cbi-button-apply{width:100% !important;box-shadow:rgba(0,0,0,0.1) 0 0 50px 0;font-weight:600;font-size:15px;color:#fff;color:var(--white);text-align:center;width:100%;cursor:pointer;min-height:50px;background-color:#5e72e4 !important;background-color:var(--primary) !important;border-radius:6px;outline:none;border-width:initial;border-style:none;border-color:initial;border-image:initial;padding:10px 0px;margin:30px 0px 100px;transition:all .3s !important;letter-spacing:.8rem}.login-page .login-container .login-form .cbi-button-apply:hover,.login-page .login-container .login-form .cbi-button-apply :focus{opacity:.9}.login-page .login-container footer{box-sizing:border-box;width:100%;text-align:center;line-height:1.6rem;display:flex;justify-content:space-evenly;margin-top:auto;padding:0px 0px 30px;z-index:10;color:#525461;color:var(--default);position:absolute;bottom:0}.login-page .login-container footer .ftc{position:absolute;bottom:30px;width:100%}.login-page .login-container footer .luci-link{display:block}header,.main{width:100%}footer{font-size:.8rem;overflow:hidden;padding:1rem;text-align:right;white-space:nowrap;color:#aaa}footer>a{text-decoration:none;color:#aaa}small{font-size:90%;line-height:1.42857143;white-space:normal}.main{position:relative;top:0;bottom:0;overflow-y:auto;height:100%}.main-left{top:0;float:left;width:15%;width:calc(0% + 15rem);height:100%;background-color:#fff;background-color:var(--menu-bg-color);box-shadow:rgba(0,0,0,0.75) 0 0 15px -5px;overflow-x:auto;position:fixed;z-index:100}.main-left .sidenav-header{padding:1.5rem .5rem;text-align:center}.main-left .sidenav-header .brand{font-size:1.8rem;color:#5e72e4;color:var(--primary);font-family:"TypoGraphica";text-decoration:none;text-align:center;cursor:default;vertical-align:text-bottom}.main-left::-webkit-scrollbar{width:5px;height:1px}.main-left::-webkit-scrollbar-thumb{background-color:#f6f9fc}.main-left::-webkit-scrollbar-track{background-color:#fff}.main-right{float:right;width:85%;width:calc(100% - 15rem);height:100%;transition:all .2s}.main-right>#maincontent{position:relative;z-index:50}.pull-right{float:right}.pull-left{float:left}.nowrap:not(.td){white-space:nowrap}[disabled="disabled"]{pointer-events:none}header{color:#fff;color:var(--header-color);padding:0;position:relative}header.bg-primary{background-color:#5e72e4 !important;background-color:var(--primary) !important}header::after{content:"";position:absolute;height:2rem;width:100%;background-color:#5e72e4 !important;background-color:var(--primary) !important}header .fill{padding:.8rem 0;border-bottom:0 solid rgba(255,255,255,0.08) !important;display:flex}header .fill .container{height:2rem;padding:0 1.25rem;display:flex;align-items:center;width:100%}header .fill .container .flex1{flex:1}header .fill .container .flex1 .showSide{display:none;color:#fff;font-size:1.4rem}header .fill .container .flex1 .showSide:hover{text-decoration:none}header .fill .container .flex1 .brand{font-size:1.5rem;color:#fff;font-family:"TypoGraphica";text-decoration:none;padding-left:1rem;cursor:default;vertical-align:text-bottom;display:none}header .fill .container .pull-right{float:right;margin-top:0rem;display:flex}header .fill .status span{display:inline-block;font-size:.8rem;font-weight:bold;padding:.3rem .8rem;white-space:nowrap;text-decoration:none;text-transform:uppercase;text-shadow:none;border-radius:4px;cursor:pointer;transition:all .3s;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12);margin:0 .25rem}header .fill .status span:last-child{margin-right:0}header .fill .status span[data-indicator="poll-status"]{color:#32325d;background-color:#fff}header .fill .status span[data-style="active"]{background-color:var(--green)}header .fill .status span[data-style="inactive"]{color:#ffffff !important;background-color:#32325d}#xhr_poll_status{display:flex;margin-left:.5rem}#xhr_poll_status *{color:#fff}div[style="width:100%;height:300px;border:1px solid #000;background:#fff"]{border:0 !important}.danger{background-color:#ff7d60 !important}.warning{background-color:#f0e68c !important}.success{background-color:#5cb85c !important}.notice{background-color:#11cdef !important;color:#fff}.error{color:#f00}.alert,.alert-message{font-weight:bold;margin-bottom:1.25rem;padding:1rem 1.25rem;border:0;border-radius:.375rem !important;background-color:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12);text-shadow:1px 1px rgba(0,0,0,0.1)}.alert.error,.alert-message.error{background-color:#ffd600}.alert h4,.alert-message h4{padding:.25rem 0;border-radius:4px;background-color:#ffd600}.alert .btn,.alert-message .btn{height:auto}.alert-message>h4{font-size:110%;font-weight:bold}.alert-message>*{margin:.5rem 0}.alert-message .btn{padding:.3rem .6rem}.container .alert,.container .alert-message{margin-top:0rem}.main .main-left{transition:all .2s}.main .main-left .nav{margin-top:.5rem}.main .main-left .nav>li>a:first-child{display:block;margin:.1rem .5rem .1rem .5rem;padding:.675rem 0 .675rem 2.5rem;border-radius:.375rem;text-decoration:none;cursor:default;font-size:1rem;transition:all .2s;position:relative}.main .main-left .nav>li>a:first-child.active{color:#fff;background:#5e72e4;background:var(--primary)}.main .main-left .nav>li>a:first-child.active::before{color:#fff !important}.main .main-left .nav>li>a:first-child.active::after{transform:rotate(90deg);color:#fff !important}.main .main-left .nav>li>a:first-child:hover{cursor:pointer;color:#fff;background:#5e72e4;background:var(--primary)}.main .main-left .nav>li>a:first-child:hover::before{color:#fff !important}.main .main-left .nav>li>a:first-child::before{font-family:'argon' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;left:.8rem;padding-top:3px;transition:all .3s;content:"\e915";color:#5e72e4;color:var(--primary)}.main .main-left .nav li{padding:.5rem 1rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:0}.main .main-left .nav li a{display:block;color:#5f6368;color:var(--menu-color)}.main .main-left .nav li.slide{padding:0}.main .main-left .nav li.slide ul{display:none;overflow:hidden}.main .main-left .nav li.slide:hover{background:none}.main .main-left .nav li.slide .slide-menu{margin:0 .5rem 0 2.5rem;padding:0 .5rem}.main .main-left .nav li.slide .slide-menu.active{display:block}.main .main-left .nav li.slide .slide-menu li{position:relative;border-radius:.375rem;margin:0;padding:.5rem 0;background:none;list-style:none}.main .main-left .nav li.slide .slide-menu li a{text-decoration:none}.main .main-left .nav li.slide .slide-menu li::after{content:"";position:absolute;left:0;bottom:0;width:0;height:2px;background-color:#5e72e4;background-color:var(--primary);transition:all .2s}.main .main-left .nav li.slide .slide-menu li:hover{background:none}.main .main-left .nav li.slide .slide-menu li:hover::after{width:100%}.main .main-left .nav li.slide .slide-menu .active{background:none;color:var(--menu-color)}.main .main-left .nav li.slide .slide-menu .active a{color:var(--menu-color)}.main .main-left .nav li.slide .slide-menu .active::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#5e72e4;background-color:var(--primary);transition:all .2s}.main .main-left .nav li.slide .slide-menu .active:hover{background:none}.main .main-left .nav li.slide .slide-menu .active:hover::after{width:100%}.main .main-left .nav li .menu{display:block;margin:.1rem .5rem .1rem .5rem;padding:.675rem 0 .675rem 2.5rem;border-radius:.375rem;text-decoration:none;cursor:default;font-size:1rem;transition:all .2s;position:relative}.main .main-left .nav li .menu.active{color:#fff;background:#5e72e4;background:var(--primary)}.main .main-left .nav li .menu.active::before{color:#fff !important}.main .main-left .nav li .menu.active::after{transform:rotate(90deg);color:#fff !important}.main .main-left .nav li .menu:hover{cursor:pointer;color:#fff;background:#5e72e4;background:var(--primary)}.main .main-left .nav li .menu:hover::before{color:#fff !important}.main .main-left .nav li .menu::before{font-family:'argon' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;left:.8rem;padding-top:3px;transition:all .3s;content:"\e915";color:#5e72e4;color:var(--primary)}.main .main-left .nav li .menu::after{position:absolute;right:.5rem;top:.8rem;font-family:'argon' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-moz-osx-font-smoothing:grayscale;content:'\e90f';transition:all .15s ease;color:#ced4da;text-rendering:auto;-webkit-font-smoothing:antialiased;transition:all .3s}.main .main-left .nav li .menu[data-title=Status]:before{content:"\e906";color:#5e72e4;color:var(--primary)}.main .main-left .nav li .menu[data-title=System]:before{content:"\e90a";color:#fb6340}.main .main-left .nav li .menu[data-title=Services]:before{content:"\e909";color:#11cdef}.main .main-left .nav li .menu[data-title=NAS]:before{content:"\e90c";color:#f3a4b5}.main .main-left .nav li .menu[data-title=VPN]:before{content:"\e90b";color:#8965e0}.main .main-left .nav li .menu[data-title=Network]:before{content:"\e908";color:#8965e0}.main .main-left .nav li .menu[data-title=Bandwidth_Monitor]:before{content:"\e90d";color:#2dce89}.main .main-left .nav li .menu[data-title=Docker]:before{content:"\e911";color:#6699ff}.main .main-left .nav li .menu[data-title=Statistics]:before{content:"\e913";color:#8965e0}.main .main-left .nav li .menu[data-title=Control]:before{content:"\e912";color:#5e72e4;color:var(--primary)}.main .main-left .nav li .menu[data-title=Asterisk]:before{content:"\e914";color:#fb6340}.main .main-left .nav li a[data-title=Logout]:before{content:"\e907";color:#adb5bd}.lg{margin:0;padding:0 !important}.logout{display:block;margin:.8rem .5rem .1rem .5rem;padding:.675rem 0 .675rem 2.5rem;border-radius:.375rem;text-decoration:none;font-size:1rem;transition:all .2s;position:relative}.logout:before{font-family:'argon' !important;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;left:.8rem;padding-top:3px;transition:all .3s;content:"\e907";color:#32325d !important}body[class*="node-"]>.main>.main-left>.nav>.slide>.menu::before{transition:transform .1s ease-in-out}body[class*="node-"]>.main>.main-left>.nav>.slide>.menu.active::before{transition:transform .2s ease-in-out}.main>.main-left[style*="overflow: hidden"]>.nav>.slide>.menu::before{display:none}#maincontent>.container{margin:0 1.25rem 1rem 1.25rem}ul{line-height:normal}li{list-style-type:none}h1{font-size:2rem;padding-bottom:10px;border-bottom:thin solid #eee}h2{margin:0 0 1rem 0;font-size:1.25rem;letter-spacing:.1rem;padding:1rem 1.25rem;color:#32325d;border-radius:.375rem;background:#fff;box-shadow:0 4px 8px rgba(0,0,0,0.03);font-weight:bold}h3{font-size:1.1rem;line-height:1;display:block;width:100%;margin:0;margin-bottom:0;padding:.8755rem 1.25rem;color:#32325d;color:var(--gray-dark);border-radius:.375rem;background:#fff;font-weight:bold}h4{margin:0;padding:.75rem 1.25rem;font-size:.7rem;font-weight:600;color:#525f7f;background-color:#e9ecef;background-color:var(--lighter);font-weight:bold}h4 em{padding:0 .5rem}h5{font-size:1rem;margin:2rem 0 0 0;padding-bottom:10px}.cbi-section,.cbi-section-error,#iptables,.Firewall form,#cbi-network>.cbi-section-node,#cbi-wireless>.cbi-section-node,#cbi-wireless>#wifi_assoclist_table,[data-tab-title],[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-page="admin-system-opkg"] #maincontent>.container{font-family:inherit;font-weight:normal;font-style:normal;line-height:normal;min-width:inherit;margin:1.25rem 0;padding:0rem;border:0;border-radius:.375rem;background-color:#fff;box-shadow:0 0 1rem 0 rgba(136,152,170,0.15)}.cbi-modal .cbi-section,.cbi-section .cbi-section{padding:0;box-shadow:none}.cbi-modal .cbi-tabmenu{margin-left:0}.cbi-map-descr{font-size:small;line-height:1.5;padding:0 1.25rem}.cbi-section-descr:not(:empty){font-size:small;line-height:1.5;padding:1rem 1.25rem 0 1.25rem}.cbi-map-descr+fieldset{margin-top:1rem}.cbi-map-descr>abbr{cursor:help;text-decoration:underline}.cbi-section>legend{display:none !important}fieldset>fieldset,.cbi-section>.cbi-section{margin:0;padding:0;border:0;box-shadow:none}.cbi-section>h3:first-child,.panel-title{font-size:1.1rem;line-height:1;display:block;width:100%;margin:0;margin-bottom:0;padding:.8755rem 1.25rem;color:#32325d;color:var(--gray-dark)}.cbi-section>h3:first-child,.cbi-section>h4:first-child,.cbi-section>p:first-child,[data-tab-title]>h3:first-child,[data-tab-title]>h4:first-child,[data-tab-title]>p:first-child{padding:1rem 1.25rem}.cbi-section p{padding:1rem}.cbi-tblsection{overflow-x:scroll}table{border-spacing:0;border-collapse:collapse}table,.table{overflow-y:hidden;width:100%;font-size:90%}.table .table-titles th{background-color:#e9ecef;background-color:var(--lighter)}table>tbody>tr>td,table>tbody>tr>th,table>tfoot>tr>td,table>tfoot>tr>th,table>thead>tr>td,table>thead>tr>th,.table>.tbody>.tr>.td,.table>.tbody>.tr>.th,.table>.tfoot>.tr>.td,.table>.tfoot>.tr>.th,.table>.thead>.tr>.td,.table>.thead>.tr>.th,.table>.tr>.td.cbi-value-field,.table>.tr>.th.cbi-section-table-cell{padding:.5rem}.container>.cbi-section:first-of-type>.table[width="100%"]>.tr>.td{padding:.6rem}.cbi-section-table-cell{line-height:1.1;align-self:flex-end;flex:1 1 auto}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row::before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border-top:thin solid #ddd;padding:1.1em 1.25rem}#cbi-wireless .td,#cbi-network .tr:first-child>.td,.table[width="100%"]>.tr:first-child>.td,[data-page="admin-network-diagnostics"] .tr>.td,.tr.table-titles>.th,.tr.cbi-section-table-titles>.th{border-top:0 !important;background-color:#f6f9fc;padding:1.1em 1.25rem;line-height:1.3rem}.table[width="100%"]>.tr:first-child>.td{margin:auto 0}.cbi-section-table-row{margin-bottom:1rem;text-align:center !important;background:#f4f4f4}.cbi-section-table-row:last-child{margin-bottom:0}.cbi-section-table-row>.cbi-value-field .cbi-dropdown,.cbi-section-table-row>.cbi-value-field .cbi-input-select,.cbi-section-table-row>.cbi-value-field .cbi-input-text,.cbi-section-table-row>.cbi-value-field .cbi-input-password{width:100%}.cbi-section-table-row>.cbi-value-field .cbi-input-text,.cbi-section-table-row>.cbi-value-field .cbi-input-password{min-width:80px}.cbi-section-table-row>.cbi-value-field [data-dynlist]>input,.cbi-section-table-row>.cbi-value-field input.cbi-input-password{width:calc(100% - 1.5rem)}.cbi-section-table-row .td{text-align:center !important}.control-group{display:inline-flex;width:100%;flex-wrap:wrap;gap:2px}div>table>tbody>tr:nth-of-type(2n),div>.table>.tr:nth-of-type(2n){background-color:#f9f9f9}table table,.table .table,.cbi-value-field table,.cbi-value-field .table,td>table>tbody>tr>td,.td>.table>.tbody>.tr>.td,.cbi-value-field>table>tbody>tr>td,.cbi-value-field>.table>.tbody>.tr>.td{border:0}.btn,.cbi-button,.item::after{font-size:.8rem;display:inline-block;width:auto !important;padding:.45rem .8rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:all .2s ease-in-out;text-align:center;vertical-align:middle;white-space:nowrap;text-decoration:none;text-transform:uppercase;color:rgba(0,0,0,0.87);border:0;border-radius:.2rem;background-color:#f0f0f0;background-image:none;-webkit-appearance:none;-ms-touch-action:manipulation;touch-action:manipulation}.cbi-button-up,.cbi-button-down{font-size:1.2rem;display:inline-block;min-width:0;padding:.2rem 1rem;font-size:0;color:transparent !important;background:url(../icon/arrow.svg) no-repeat center;background-size:12px 20px}.cbi-button-up{transform:scaleY(-1)}.cbi-button:not(select){-webkit-appearance:none !important}.btn:hover,.btn:focus,.btn:active,.cbi-button:hover,.cbi-button:focus,.cbi-button:active,.item:hover::after,.item:focus::after,.item:active::after,.cbi-page-actions .cbi-button-apply+.cbi-button-save:hover,.cbi-page-actions .cbi-button-apply+.cbi-button-save:focus,.cbi-page-actions .cbi-button-apply+.cbi-button-save:active{text-decoration:none;outline:0}.btn:hover,.btn:focus,.cbi-button:hover,.cbi-button:focus,.item:hover::after,.item:focus::after{box-shadow:0 0 2px rgba(0,0,0,0.12),0 2px 2px rgba(0,0,0,0.2)}.btn:active,.cbi-button:active,.item:active::after{box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23)}.cbi-button-up:hover,.cbi-button-up:focus{box-shadow:0 0 2px rgba(0,0,0,0.12),0 -2px 2px rgba(0,0,0,0.2)}.cbi-button-up:active{box-shadow:0 -10px 20px rgba(0,0,0,0.19),0 -6px 6px rgba(0,0,0,0.23)}.btn:disabled,.cbi-button:disabled{cursor:not-allowed;pointer-events:none;opacity:.5;box-shadow:none}.alert-message [class="btn"],.modal div[class="btn"],.cbi-button-find,.cbi-button-link,.cbi-button-up,.cbi-button-down,.cbi-button-neutral,.cbi-button[name="zero"],.cbi-button[name="restart"],.cbi-button[onclick="hide_empty(this)"]{font-weight:bold;color:#fff;border:thin solid #8898aa;background-color:#8898aa}.btn.primary,.cbi-page-actions .cbi-button-save,.cbi-page-actions .cbi-button-apply+.cbi-button-save,.cbi-button-add,.cbi-button-save,.cbi-button-positive,.cbi-button-link,.cbi-button[value="Enable"],.cbi-button[value="Scan"],.cbi-button[value^="Back"],.cbi-button-neutral[onclick="handleConfig(event)"]{font-weight:normal;color:#fff !important;border:thin solid #5e72e4;border:thin solid var(--primary);background-color:#5e72e4;background-color:var(--primary)}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit,.cbi-button-apply,.cbi-button-reload,.cbi-button-action,.cbi-button[value="Submit"],.cbi-button[value="Upload"],.cbi-button[value$="Apply"],.cbi-button[onclick="addKey(event)"]{font-weight:normal;color:#fff !important;border:thin solid #5e72e4;border:thin solid var(--primary);background-color:#5e72e4;background-color:var(--primary)}.btn.danger,.cbi-section-remove>.cbi-button,.cbi-button-remove,.cbi-button-reset,.cbi-button-negative,.cbi-button[value="Stop"],.cbi-button[value="Kill"],.cbi-button[onclick="reboot(this)"],.cbi-button-neutral[value="Restart"]{font-weight:normal;color:#fff;border:thin solid #f5365c;border:thin solid var(--red);background-color:#f5365c;background-color:var(--red)}.btn[value="Dismiss"],.cbi-button[value="Terminate"],.cbi-button[value="Reset"],.cbi-button[value="Disabled"],.cbi-button[onclick^="iface_reconnect"],.cbi-button[onclick="handleReset(event)"],.cbi-button-neutral[value="Disable"]{font-weight:normal;color:#fff;border:thin solid #eea236;background-color:#f0ad4e}.cbi-button-success,.cbi-button-download,.cbi-button[name="backup"],.cbi-button[value="Download"],.cbi-button[value="Save mtdblock"]{font-weight:normal;color:#fff;border:thin solid #4cae4c;background-color:#5cb85c}.cbi-page-actions .cbi-button-link:first-child{float:left}.a-to-btn{text-decoration:none}.cbi-value-field .cbi-button-add{font-weight:bold;margin:4px 0 4px 3px;padding:1px 6px;display:flex;align-items:center}.tabs{margin:0 0 1rem 0;padding:0 1rem;background-color:#FFFFFF;border-radius:.375rem;box-shadow:0 4px 8px rgba(0,0,0,0.03);white-space:nowrap;overflow-x:auto}.tabs::-webkit-scrollbar{width:1px;height:5px}.tabs::-webkit-scrollbar-thumb{background-color:#f6f9fc}.tabs::-webkit-scrollbar-track{background-color:#fff}.tabs li[class~="active"],.tabs li:hover{cursor:pointer;border-bottom:.18751rem solid #5e72e4;border-bottom:.18751rem solid var(--primary);color:#5e72e4;color:var(--primary);background-color:#dce1fe;margin-bottom:0;border-radius:0}.tabs li[class~="active"] a,.tabs li:hover a{color:#5e72e4;color:var(--primary)}.tabs li{font-size:.875rem;display:inline-block;padding:.875rem 0;border-bottom:.18751rem solid rgba(0,0,0,0);margin:0;transition:all .2s}.tabs li a{text-decoration:none;color:#404040;padding:.5rem .8rem}.tabs li:hover{border-bottom:.18751rem solid #5e72e4;border-bottom:.18751rem solid var(--primary)}.cbi-tabmenu{color:white;padding:.5rem 1rem 0 1rem;white-space:nowrap;overflow-x:auto}.cbi-tabmenu::-webkit-scrollbar{width:1px;height:5px}.cbi-tabmenu::-webkit-scrollbar-thumb{background-color:#f6f9fc}.cbi-tabmenu::-webkit-scrollbar-track{background-color:#fff}.cbi-tabmenu li{background:#dce3e9;display:inline-block;font-size:.875rem;border-top-left-radius:.25rem;border-top-right-radius:.25rem;padding:.5rem 0;border-bottom:.18751rem solid rgba(0,0,0,0);margin:0 .2rem}.cbi-tabmenu li a{text-decoration:none;color:#404040;padding:.5rem .8rem}.cbi-tabmenu li:hover{cursor:pointer;border-bottom:.18751rem solid #5e72e4;border-bottom:.18751rem solid var(--primary);color:#5e72e4;color:var(--primary);background-color:#dce1fe;margin-bottom:0}.cbi-tabmenu li:hover a{color:#525f7f}.cbi-tabmenu li[class~="cbi-tab"]{border-bottom:.18751rem solid #5e72e4;border-bottom:.18751rem solid var(--primary);color:#5e72e4;color:var(--primary);background-color:#dce1fe;margin-bottom:0}.cbi-tabmenu li[class~="cbi-tab"] a{color:#5e72e4;color:var(--primary)}.cbi-tab-descr{padding:.5rem 1.5rem}.cbi-section-node{padding:1rem 0}.cbi-section .cbi-section-remove:nth-of-type(2n),.container>.cbi-section .cbi-section-node:nth-of-type(2n){background-color:#f9f9f9}[data-tab-title]{overflow:hidden;height:0;opacity:0;margin:0;padding:0rem 0rem !important}[data-tab-title] p{margin-left:1rem;margin-bottom:1rem}[data-tab-active="true"]{overflow:visible;height:auto;opacity:1;transition:opacity .25s ease-in;margin:inherit !important}.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3),.cbi-section[id] .cbi-section-node:nth-of-type(4n+4){background-color:#f9f9f9}.cbi-section-node-tabbed{margin-top:0;padding:0;border:0 solid #d4d4d4;border-radius:.375rem}.cbi-tabcontainer>.cbi-value:nth-of-type(2n){background-color:#f9f9f9}.cbi-value-field,.cbi-value-description{line-height:1.25;display:table-cell}.cbi-value-field abbr,.cbi-value-description abbr{color:#32325d;color:var(--gray-dark)}.cbi-value-description{font-size:small;padding:.5rem;opacity:.5}.cbi-value-title{display:table-cell;float:left;width:23rem;padding-top:.25rem;padding-right:2rem;text-align:right;word-wrap:break-word}.cbi-value{display:inline-block;width:100%;padding:.35rem 1rem .2rem 1rem;line-height:2.4rem}.cbi-value ul{line-height:1.25}.cbi-value-field .cbi-dropdown,.cbi-value-field .cbi-input-select,.cbi-value input[type="text"],.cbi-value input[type="password"]{min-width:18rem}.cbi-value input[type="password"]{border-bottom-right-radius:0;border-top-right-radius:0;margin-right:0}.cbi-value input[type="password"]+.cbi-button-neutral{height:42px;border-bottom-left-radius:0;border-top-left-radius:0;margin-left:0;border:0}#cbi-firewall-zone .cbi-input-select,#cbi-network-switch_vlan .cbi-input-select{min-width:11rem}#cbi-network-switch_vlan .cbi-input-text{max-width:3rem}.cbi-input-invalid{color:#f5365c;border-bottom-color:#f5365c}.cbi-section-error{font-weight:bold;line-height:1.42857143;margin:18px;padding:6px;border:thin solid #f5365c;border-radius:3px;background-color:#fce6e6}.cbi-section-error ul{margin:0 0 0 20px}.cbi-section-error ul li{font-weight:bold;color:#f5365c}.td[data-title]::before{font-weight:bold;display:none;padding:.25rem 0;content:attr(data-title) ":\20";text-align:left;white-space:nowrap}.tr.placeholder .td[data-title]::before{display:none}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before{font-weight:bold;display:table-cell;align-self:center;flex:1 1 5%;padding:.25rem;content:attr(data-title) "\20";text-align:center;vertical-align:middle;white-space:normal;word-wrap:break-word}.cbi-rowstyle-1{background-color:#f9f9f9}.cbi-rowstyle-2{background-color:#eee}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:#fff !important}.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell{width:auto !important}.td.cbi-section-actions{text-align:right !important;vertical-align:middle}.td.cbi-section-actions>*{display:inline-flex}.td.cbi-section-actions>*>*,.td.cbi-section-actions>*>form>*{margin:0 5px;display:flex;align-items:center}.td.cbi-section-actions>*>form{display:inline-flex;margin:0}.cbi-checkbox{margin:0 .25rem}.cbi-dynlist{line-height:1.3;flex-direction:column;min-height:30px;cursor:text}.cbi-dynlist>.item{position:relative;max-width:25rem;pointer-events:none;color:#8898aa;outline:0}.cbi-dynlist[name="sshkeys"]>.item{max-width:none}.cbi-dynlist>.item::after{position:absolute;width:2.2rem !important;height:calc(100% - .5rem - 2px);right:0;bottom:0;content:"\00D7";pointer-events:auto;background-color:var(--red);font-weight:normal;font-size:1.2rem;display:flex;align-items:center;justify-content:center;line-height:1.5rem;padding:0;margin:.25rem .1rem .25rem 0;color:#fff;border:1px solid #f5365c;border-radius:.25rem;outline:0;background-image:none;box-shadow:none;border-top-left-radius:0;border-bottom-left-radius:0}.cbi-dynlist>.item>span{white-space:normal;word-break:break-word;line-height:1.5rem;padding:.5rem .5rem;margin:.25rem .1rem;color:#8898aa;border:1px solid #dee2e6;border-radius:.25rem;outline:0;background-image:none;box-shadow:none;display:block;transition:box-shadow .15s ease;box-sizing:border-box;min-width:15rem}.cbi-dynlist>.add-item{display:inline-flex;align-items:center;width:100%;min-width:16rem}.cbi-dynlist>.add-item input{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0;border-right:none}.cbi-dynlist>.add-item .cbi-button-add{font-weight:normal;font-size:1.2rem;display:flex;align-items:center;line-height:1.5rem;padding:.5rem .75rem;margin:.25rem .1rem .25rem 0;color:#fff;border:1px solid #5e72e4;border:1px solid var(--primary);border-radius:.25rem;outline:0;background-image:none;box-shadow:none;border-top-left-radius:0;border-bottom-left-radius:0}.cbi-dynlist>.add-item:not([ondrop])>input{overflow:hidden;width:100%;min-width:15rem;white-space:nowrap;text-overflow:ellipsis}.cbi-dynlist>.add-item[ondrop]>input{min-width:13rem}.cbi-dynlist,.cbi-dropdown{position:relative;display:inline-flex;padding:.2rem .2rem}.cbi-dropdown[placeholder*="select"]{max-width:25rem;height:auto;margin-top:-3px}.cbi-dropdown>ul{display:flex;overflow-x:hidden;overflow-y:auto;width:100%;margin:0 !important;padding:0;list-style:none;outline:0}.cbi-dropdown>ul.preview{display:none}.cbi-button-apply>ul.preview{display:none}.cbi-button-apply>ul.preview li{color:#fff}.cbi-button-apply>ul:first-child li{color:#fff}.cbi-dropdown>.open{flex-basis:15px}.cbi-dropdown>.open,.cbi-dropdown>.more{font-size:1rem;font-weight:900;line-height:2;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;justify-content:center;padding:0 .25em;cursor:default;text-align:center;outline:0}.cbi-dropdown>.more,.cbi-dropdown>ul>li[placeholder]{font-weight:bold;display:none;color:#777;text-shadow:1px 1px 0 #fff}.cbi-dropdown>ul>li{display:none;overflow:hidden;align-items:center;align-self:center;flex-grow:1;flex-shrink:1;min-height:20px;padding:.25em;white-space:nowrap;text-overflow:ellipsis}.cbi-dropdown>ul>li .hide-open{display:initial}.cbi-dropdown>ul>li .hide-close{display:none}.cbi-dropdown>ul>li[display]:not([display="0"]){border-left:thin solid #ccc}.cbi-dropdown[empty]>ul{max-width:1px}.cbi-dropdown>ul>li>form{display:none;margin:0;padding:0;pointer-events:none}.cbi-dropdown>ul>li img{margin-right:.25em;vertical-align:middle}.cbi-dropdown>ul>li>form>input[type="checkbox"]{height:auto;margin:0}.cbi-dropdown>ul>li input[type="text"]{height:20px}.cbi-dropdown[open]>ul.dropdown{position:absolute;z-index:1100;display:block;width:auto;min-width:100%;max-width:none;max-height:200px !important;border:0 solid #918e8c;background:#ffffff;box-shadow:0 0 4px #918e8c;border-bottom-left-radius:.35rem;border-bottom-right-radius:.35rem;color:var(--main-menu-color);margin-left:-0.2rem !important}.cbi-dropdown[open]>ul.dropdown li{color:#000}.cbi-dropdown>ul>li[display],.cbi-dropdown[open]>ul.preview,.cbi-dropdown[open]>ul.dropdown>li,.cbi-dropdown[multiple]>ul>li>label,.cbi-dropdown[multiple][open]>ul.dropdown>li,.cbi-dropdown[multiple][more]>.more,.cbi-dropdown[multiple][empty]>.more{display:flex;align-items:center;flex-grow:1}.cbi-dropdown[empty]>ul>li,.cbi-dropdown[optional][open]>ul.dropdown>li[placeholder],.cbi-dropdown[multiple][open]>ul.dropdown>li>form{display:block}.cbi-dropdown[open]>ul.dropdown>li .hide-open{display:none}.cbi-dropdown[open]>ul.dropdown>li .hide-close{display:initial}.cbi-dropdown[open]>ul.dropdown>li{border-bottom:thin solid #ccc;padding:.5rem .8rem}.cbi-dropdown[open]>ul.dropdown>li label{margin-left:.5rem}.cbi-dropdown[open]>ul.dropdown>li[selected]{background:#dce1fe}.cbi-dropdown[open]>ul.dropdown>li.focus{background:#dce1fe;outline:none}.cbi-dropdown[open]>ul.dropdown>li:last-child{margin-bottom:0;border-bottom:0}.cbi-dropdown[open]>ul.dropdown>li[unselectable]{opacity:.7}.cbi-dropdown[open]>ul.dropdown>li>input.create-item-input:first-child:last-child{width:100%}.cbi-dropdown[disabled]{pointer-events:none;opacity:.6}.cbi-dropdown .zonebadge{width:100%}.cbi-dropdown[open] .zonebadge{width:auto}.cbi-progressbar{position:relative;min-width:11rem;height:1.5rem;margin:0 0;border:thin solid #999;background:#eee;border-radius:4px;overflow:hidden}.cbi-progressbar>div{width:0;height:100%;transition:width .25s ease-in;background:#5bc0de;background:var(--bar-bg)}.cbi-progressbar::after{font-family:monospace;font-size:1em;font-weight:bold;font-size-adjust:.38;line-height:1.5rem;position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;content:attr(title);text-align:center;white-space:pre;text-overflow:ellipsis}#modal_overlay{position:fixed;z-index:900;top:0;right:10000px;bottom:0;left:-10000px;overflow-y:scroll;transition:opacity .125s ease-in;opacity:0;background:rgba(0,0,0,0.7);-webkit-overflow-scrolling:touch}.modal{display:flex;align-items:center;flex-wrap:wrap;width:90%;min-width:270px;max-width:600px;min-height:32px;margin:5em auto;padding:1em;border-radius:3px !important;background:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}.modal>*{line-height:normal;flex-basis:100%;margin-bottom:.5em;max-width:100%}.modal>pre,.modal>textarea{font-size:1rem;font-size-adjust:.35;overflow:auto;margin-bottom:.5em;padding:8.5px;cursor:auto;white-space:pre-wrap;color:#eee;outline:0;background-color:#101010;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}.modal>h4{margin:.5em 0}.modal ul{margin-left:2.2em}.modal li{list-style-type:square;color:#808080}.modal p{word-break:break-word}.modal .label{font-size:.6rem;font-weight:normal;padding:.1rem .3rem;padding-bottom:0;cursor:default;border-radius:0}.modal .label.warning{background-color:#f0ad4e !important}.modal .btn{padding:.45rem .8rem}.modal.cbi-modal{max-width:90%;max-height:none}body.modal-overlay-active{overflow:hidden;height:100vh}body.modal-overlay-active #modal_overlay{right:0;left:0;opacity:1}.spinning{position:relative;padding-left:32px !important}.spinning::before{position:absolute;top:0;bottom:0;left:.2em;width:32px;content:"";background:url(/luci-static/resources/icons/loading.gif) no-repeat center;background-size:16px}.hidden{display:none}.left,.left::before{text-align:left !important}.right,.right::before{text-align:right !important}.center,.center::before{text-align:center !important}.top{align-self:flex-start !important;vertical-align:top !important}.bottom{align-self:flex-end !important;vertical-align:bottom !important}.inline{display:inline}.cbi-page-actions{padding-top:1rem;text-align:right;justify-content:flex-end}.cbi-page-actions>form[method="post"]{display:inline-block}.th[data-type="button"],.td[data-type="button"],.th[data-type="fvalue"],.td[data-type="fvalue"]{flex:1 1 2em;text-align:center}.ifacebadge{display:inline-flex;gap:.2rem;padding:.5rem .8rem;border-bottom:thin solid #ccc;background:#eee;box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);border-radius:4px}td>.ifacebadge,.td>.ifacebadge{font-size:.8rem;background-color:#f0f0f0}.ifacebadge>em,.ifacebadge>img{display:inline-block;align-self:flex-start}.ifacebadge>img+img{margin:0 .2rem 0 0}.network-status-table{display:flex;flex-wrap:wrap}.network-status-table .ifacebox{flex-grow:1;border-radius:4px;overflow:hidden;margin:0 1.25rem 1rem 1.25rem}.network-status-table .ifacebox-body{display:flex;flex-direction:column;height:100%;gap:.5em}.network-status-table .ifacebox-body>span{flex:10 10 auto;height:100%}.network-status-table .ifacebox-body>div{display:flex;flex-wrap:wrap;gap:.5rem}.network-status-table .ifacebox-body .ifacebadge{align-items:center;flex:1 1 auto;min-width:220px;padding:.5em;background-color:#fff}.network-status-table .ifacebox-body .ifacebadge>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cbi-input-textarea{font-family:monospace;width:100%;font-size:.875rem;min-height:14rem;padding:.8rem;color:#000}#syslog{font-size:small;line-height:1.25;overflow-y:hidden;width:100%;min-height:15rem;padding:1rem;resize:none;color:#242424;border:0;border-radius:.375rem;background-color:#ffffff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}#syslog:focus{outline:0}.uci-change-list{font-family:monospace}.uci-change-list ins,.uci-change-legend-label ins{display:block;padding:2px;text-decoration:none;border:thin solid #0f0;background-color:#cfc}.uci-change-list del,.uci-change-legend-label del{font-style:normal;display:block;padding:2px;text-decoration:none;border:thin solid #f00;background-color:#fcc}.uci-change-list var,.uci-change-legend-label var{font-style:normal;display:block;padding:2px;text-decoration:none;border:thin solid #ccc;background-color:#eee}.uci-change-list var ins,.uci-change-list var del{font-style:normal;padding:0;white-space:pre;border:0}.uci-change-legend{padding:5px}.uci-change-legend-label{float:left;width:150px}.uci-change-legend-label>ins,.uci-change-legend-label>del,.uci-change-legend-label>var{display:block;float:left;width:10px;height:10px;margin-right:4px}.uci-change-legend-label var ins,.uci-change-legend-label var del{line-height:.4;border:0}.uci-change-list var,.uci-change-list del,.uci-change-list ins{padding:.5rem}#iwsvg,#iwsvg2,#bwsvg{border:thin solid #d4d4d4 !important}#iwsvg,[data-page="admin-status-realtime-bandwidth"] #bwsvg{border-top:0 !important}.ifacebox{line-height:1.25;display:inline-flex;overflow:hidden;flex-direction:column;border-radius:4px;min-width:100px;border-bottom:thin solid #ccc;background-color:#f9f9f9;box-shadow:inset 0 1px 0 rgba(255,255,255,0.4),0 1px 2px rgba(0,0,0,0.2)}.ifacebox-head{padding:.25em;background:#eee}.ifacebox-head.active{background:#5e72e4;background:var(--primary)}.ifacebox-head.active *{color:#fff;color:var(--white)}.ifacebox-body{padding:.875rem 1rem;line-height:1.6em}.cbi-image-button{margin-left:.5rem}.zonebadge{display:inline-block;padding:.2rem .5rem;border-radius:4px}.zonebadge .ifacebadge{margin:.1rem .2rem;padding:.2rem .3rem;border:thin solid #6c6c6c}.zonebadge>input[type="text"]{min-width:10rem;margin-top:.3rem;padding:.16rem 1rem}.zonebadge>em,.zonebadge>strong{display:inline-block;margin:0 .2rem}.cbi-value-field .cbi-input-checkbox,.cbi-value-field .cbi-input-radio{margin-top:.1rem}.cbi-value-field>ul>li{display:flex}.cbi-value-field>ul>li>label{margin-top:.5rem}.cbi-value-field>ul>li .ifacebadge{margin-top:-0.5rem;margin-left:.4rem;background-color:#eee}.cbi-section-table-row>.cbi-value-field .cbi-dropdown{min-width:3rem}.cbi-section-create{display:inline-flex;align-items:center;margin:.25rem 1.25rem}.cbi-section-create>*{margin:.5rem 0}.cbi-section-remove{padding:.5rem}div.cbi-value var,td.cbi-value-field var,.td.cbi-value-field var{font-style:italic;color:#0069d6}.cbi-optionals{padding:1rem 1rem 0 1rem;border-top:thin solid #ccc}.cbi-dropdown-container{position:relative}.cbi-tooltip-container,span[data-tooltip],span[data-tooltip] .label{cursor:help !important}.cbi-tooltip{position:absolute;z-index:1000;left:-1000px;padding:2px 5px;transition:opacity .25s ease-out;white-space:pre;pointer-events:none;opacity:0;border-radius:3px;background:#fff;box-shadow:0 0 2px #444}.cbi-tooltip-container:hover .cbi-tooltip{left:auto;transition:opacity .25s ease-in;opacity:1}.zonebadge .cbi-tooltip{margin:-1.5rem 0 0 -0.5rem;padding:.25rem;background:inherit}.zonebadge-empty{color:#404040;background:repeating-linear-gradient(45deg, rgba(204,204,204,0.5), rgba(204,204,204,0.5) 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}.zone-forwards{display:flex;min-width:10rem}.zone-forwards>*{flex:1 1 45%}.zone-forwards>span{flex-basis:10%;padding:0 .25rem;text-align:center}.zone-forwards .zone-src,.zone-forwards .zone-dest{display:flex;flex-direction:column}.label{font-size:.8rem;font-weight:bold;padding:.3rem .8rem;white-space:nowrap;text-decoration:none;text-transform:uppercase;color:#fff !important;border-radius:3px;background-color:#bfbfbf;text-shadow:none}label>input[type="checkbox"],label>input[type="radio"]{position:relative;top:.4rem;right:.2rem;margin:0;vertical-align:bottom}label[data-index][data-depends]{padding-right:2em}.showSide{display:none}.darkMask{position:fixed;z-index:99;display:none;width:100%;height:100%;content:"";top:0;background-color:rgba(0,0,0,0.56);transition:all .2s}.darkMask.active{display:block}#diag-rc-output>pre,#command-rc-output>pre,[data-page="admin-services-wol"] .notice code{font-size:1.2rem;font-size-adjust:.35;line-height:normal;display:block;overflow-y:hidden;width:100%;padding:8.5px;white-space:pre;color:#eee;background-color:#101010;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}[data-page="admin-network-diagnostics"] .table{box-shadow:none}input[name="ping"],input[name="traceroute"],input[name="nslookup"]{width:80%}.node-status-overview>.main fieldset:nth-child(4) .td:nth-child(2),.node-status-processes>.main .table .tr .td:nth-child(3){white-space:normal}[data-page="admin-system-reboot"] p{padding-left:1.5rem}[data-page="admin-system-reboot"] .cbi-button{background:#fb6340 !important}[data-page="admin-system-reboot"] p>span{position:relative;top:.1rem;left:1rem}[data-page="admin-vpn-passwall"] h4{background:transparent}#cbi-samba [data-tab="template"] .cbi-value-field{display:block}#cbi-samba [data-tab="template"] .cbi-value-title{width:auto;padding-bottom:.6rem}[data-page="admin-system-admin"] .cbi-map h2,[data-page="admin-system-admin-password"] .cbi-map h2,[data-page="admin-system-admin"] .cbi-map .cbi-map-descr,[data-page="admin-system-admin-password"] .cbi-map .cbi-map-descr{margin-left:0;color:#32325d;color:var(--gray-dark)}[data-page="admin-system-opkg"] h2{margin-left:0;color:#32325d;color:var(--gray-dark)}.controls{margin:.5em 1rem 1em 1rem !important}.controls>*>.btn:not([aria-label$="page"]){flex-grow:initial !important;margin-top:.25rem}.controls>#pager>.btn[aria-label$="page"]{font-size:1.4rem;font-weight:bold}.controls>*>label{margin-bottom:.2rem}[data-page="admin-system-opkg"] div.btn{line-height:3;display:inline;padding:.3rem .6rem}[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-page="admin-system-opkg"] #maincontent>.container{margin-top:2rem;padding-top:.1rem}[data-page="admin-system-opkg"] #maincontent>.container{margin:0 1.25rem 1rem 1.25rem;margin-bottom:1rem}.td.version,.td.size{white-space:normal !important;word-break:break-word}.cbi-tabmenu+.cbi-section{margin-top:0}[data-page="admin-system-crontab"] #view p{margin-bottom:1rem}[data-page="admin-system-flash"] .cbi-value{padding:0}[data-page="admin-system-flash"] .cbi-section .cbi-section{margin-top:0}[data-page="admin-system-flash"] .cbi-map-tabbed{border-radius:.375rem}[data-page="admin-system-flash"] legend{display:block !important;font-size:1.2rem;width:100%;display:block;margin-bottom:0;padding:1rem 0 1rem 1.5rem;border-bottom:1px solid rgba(0,0,0,0.05);line-height:1.5;margin-bottom:0rem;letter-spacing:.1rem;color:#32325d;font-weight:bold}[data-page="admin-system-flash"] .cbi-section-descr{font-weight:600;padding:1rem 0 1rem 1.5rem;color:#525f7f}[data-page="admin-system-flash"] .modal label>input[type="checkbox"]{top:-0.35rem}[data-page="admin-system-flash"] .modal .btn{white-space:normal !important}#cbi-wireless>#wifi_assoclist_table>.tr{box-shadow:inset 1px -1px 0 #ddd,inset -1px -1px 0 #ddd}#cbi-wireless>#wifi_assoclist_table>.tr.placeholder>.td{right:33px;bottom:33px;left:33px;border-top:thin solid #ddd !important}#cbi-wireless>#wifi_assoclist_table>.tr.table-titles{box-shadow:inset 1px 0 0 #ddd,inset -1px 0 0 #ddd}#cbi-wireless>#wifi_assoclist_table>.tr.table-titles>.th{border-bottom:thin solid #ddd;box-shadow:0 -1px 0 0 #ddd}#wifi_assoclist_table>.tr>.td[data-title="RX Rate / TX Rate"]{width:23rem}[data-page="admin-network-dhcp"] .cbi-value{padding:0}[data-page="admin-network-dhcp"] [data-tab-active="true"]{padding:1rem 0 !important}#iptables{margin:0}.Firewall form{margin:2rem 2rem 0 0;padding:0;box-shadow:none}#cbi-firewall-redirect table *,#cbi-network-switch_vlan table *,#cbi-firewall-zone table *{font-size:small}#cbi-firewall-redirect table input[type="text"],#cbi-network-switch_vlan table input[type="text"],#cbi-firewall-zone table input[type="text"]{width:5rem}#cbi-firewall-redirect table select,#cbi-network-switch_vlan table select,#cbi-firewall-zone table select{min-width:3.5rem}#cbi-network-switch_vlan .th,#cbi-network-switch_vlan .td{flex-basis:12%}#cbi-firewall-zone .table,#cbi-network-switch_vlan .table{display:block}#cbi-firewall-zone .td,#cbi-network-switch_vlan .td{width:100%}[data-page="admin-network-firewall-custom"] #view p,[data-page="admin-status-routes"] #view p{padding:0 1.5rem;margin-bottom:1rem}[data-page="admin-network-firewall-custom"] #view p textarea,[data-page="admin-status-routes"] #view p textarea{padding:1rem;border-radius:.375rem}#applyreboot-container{margin:2rem}#applyreboot-section{line-height:300%;margin:2rem}.OpenVPN a{line-height:initial !important}.commandbox{width:24% !important;margin:10px 0 0 10px !important;padding:.5rem 1rem;border-bottom:thin solid #ccc;background:#eee;box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.commandbox h3{line-height:normal !important;overflow:hidden;margin:6px 0 !important;white-space:nowrap;text-overflow:ellipsis}.commandbox div{left:auto !important}.commandbox code{position:absolute;overflow:hidden;max-width:60%;margin-left:4px;padding:2px 3px;white-space:nowrap;text-overflow:ellipsis}.commandbox code:hover{overflow-y:auto;max-height:50px;white-space:normal}.commandbox p:first-of-type{margin-top:-6px}.commandbox p:nth-of-type(2){margin-top:2px}[data-page^="admin-system-commands"] .panel-title,[data-page^="command-cfg"] .mobile-hide,[data-page^="command-cfg"] .showSide{display:none}#command-rc-output .alert-message{line-height:1.42857143;position:absolute;top:40px;right:32px;max-width:40%;margin:0;animation:anim-fade-in 1.5s forwards;word-break:break-word;opacity:0}@keyframes anim-fade-in{100%{opacity:1}}input[type="checkbox"]{appearance:none !important;-webkit-appearance:none !important;border:1px solid #dee2e6;width:16px !important;height:16px !important;padding:0;cursor:pointer;transition:all .2s;margin:1rem 0 0 0}input[type="checkbox"]:checked{border:1px solid #5e72e4;border:1px solid var(--primary);background-image:url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important;background-color:#5e72e4;background-color:var(--primary);background-size:70%;background-repeat:no-repeat;background-position:center}.fb-container .cbi-button{height:auto !important}#cbi-usb_printer-printer em{display:block;padding:1rem;text-align:center}pre.command-output{padding:1.5rem}[data-page="admin-nlbw-display"] .cbi-section[data-tab="export"]{padding:1.5rem !important}[data-page="admin-nlbw-backup"] form{padding-left:1.5rem}[data-page="admin-status-iptables"] .right{margin-bottom:0 !important}@media all and (-ms-high-contrast:none){.main>.main-left>.nav>.slide>.menu::before{top:30.25%}.main>.main-left>.nav>li:last-child::before{top:20%}.showSide::before{top:-12px}}@media screen and (max-width:1600px){header>.fill>.container>#logo{margin:0 2.5rem 0 .5rem}.main-left{width:calc(0% + 13rem)}.main-right{width:calc(100% - 13rem)}.btn:not(button),.cbi-button{font-size:.8rem}.label{padding:.2rem .6rem}.cbi-value-title{width:15rem;padding-right:.6rem}.cbi-value-field .cbi-dropdown,.cbi-value-field .cbi-input-select,.cbi-value input[type="text"],.cbi-value input[type="password"]{min-width:18rem}#cbi-firewall-zone .cbi-input-select{min-width:9rem}.cbi-input-textarea{font-size:small}.node-admin-status>.main fieldset li>a{padding:.3rem .6rem}}@media screen and (max-width:1366px){header>.fill>.container{cursor:default}.main-left{width:calc(0% + 13rem)}.main-right{width:calc(100% - 13rem)}.tabs>li>a,.cbi-tabmenu>li>a{padding:.2rem .8rem}.panel-title{font-size:1.1rem;padding-bottom:1rem}table{font-size:.7rem !important;width:100% !important}.table .cbi-input-text{width:100%}.cbi-value-field .cbi-dropdown,.cbi-value-field .cbi-input-select,.cbi-value input[type="text"],.cbi-value input[type="password"]{min-width:16rem}#cbi-firewall-zone .cbi-input-select{min-width:4rem}.main>.main-left>.nav>li,.main>.main-left>.nav>li>a,.main .main-left .nav>li>a:first-child,.main>.main-left>.nav>.slide>.menu,.main>.main-left>.nav>li>[data-title="Logout"]{font-size:.9rem}.main>.main-left>.nav>.slide>.slide-menu>li>a{font-size:.7rem}#modal_overlay{top:0rem}[data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table){display:block}[data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table),[data-page="admin-network-firewall-rules"] .table:not(.cbi-section-table),[data-page="admin-network-hosts"] .table,[data-page="admin-network-routes"] .table{overflow-y:visible}.commandbox{width:32% !important}.btn:not(button),.cbi-button{font-size:.8rem}}@media screen and (max-width:1152px){header>.fill>.container>#logo{display:none}header>.fill>.container>.brand{position:relative}html,.main{overflow-y:visible}.main>.loading>span{top:25%}.main-left{width:calc(0% + 13rem)}.main-right{width:calc(100% - 13rem)}body:not(.logged-in) .showSide{visibility:hidden;width:0;margin:0}.node-main-login>.main .cbi-value-title{text-align:left}.cbi-value-title{width:12rem;padding-right:1rem}.cbi-value-field .cbi-dropdown,.cbi-value-field .cbi-input-select,.cbi-value input[type="text"]{width:16rem;min-width:16rem}.cbi-value input[name^="pw"],.cbi-value input[data-update="change"]:nth-child(2){width:13rem !important;min-width:13rem}#diag-rc-output>pre,#command-rc-output>pre,[data-page="admin-services-wol"] .notice code{font-size:1rem}.table{display:block}.Interfaces .table{overflow-x:hidden}#packages.table{display:grid}.tr{display:flex;flex-direction:row;flex-wrap:wrap}.Overview .table[width="100%"]>.tr{flex-wrap:nowrap}.tr.placeholder{border-bottom:thin solid #ddd}.tr.placeholder>.td,#cbi-firewall .tr>.td,#cbi-network .tr:nth-child(2)>.td,.cbi-section #wifi_assoclist_table .tr>.td{border-top:0}.th,.td{display:inline-block;align-self:flex-start;flex:2 2 10%;text-overflow:ellipsis;word-wrap:break-word}.td select,.td input[type="text"]{width:100%;word-wrap:normal}.td [data-dynlist]>input,.td input.cbi-input-password{width:calc(100% - 1.5rem)}.td[data-type="button"],.td[data-type="fvalue"]{flex:1 1 12.5%;text-align:left}.th.cbi-value-field,.td.cbi-value-field,.th.cbi-section-table-cell,.td.cbi-section-table-cell{flex-basis:auto;padding-top:1rem}.cbi-section-table-row{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}.td.cbi-value-field,.cbi-section-table-cell{display:inline-block;flex:10 10 auto;flex-basis:50%;text-align:center}.td.cbi-section-actions{vertical-align:bottom}.tr.table-titles,.tr.cbi-section-table-titles,.tr.cbi-section-table-descr{display:none}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before{font-size:.9rem;display:block;flex:1 1 100%;border-bottom:thin solid rgba(0,0,0,0.26);background:#e9ecef}.td[data-title],[data-page^="admin-status-realtime"] .td[id]{text-align:left}.td[data-title]::before{display:block}.cbi-button+.cbi-button{margin-left:0}.td.cbi-section-actions>*>*,.td.cbi-section-actions>*>form>*{margin:2.1px 3px}.Firewall form{position:static !important;margin:0 0 2rem 0;padding:2rem;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}.Firewall form input{width:100% !important;margin:0;margin-top:1rem}.Firewall .center,.Firewall .center::before{text-align:left !important}.commandbox{width:100% !important;margin-left:0 !important}.btn:not(button),.cbi-button{font-size:.8rem}}@media screen and (max-width:768px){body{font-size:.8rem}.cbi-progressbar::after{font-size:.6rem}.main-left{position:fixed;z-index:100;width:0}.main-left.active{width:13rem}.main-right{width:100%}.main-right.active{overflow-y:hidden}.darkMask.active{display:block}.showSide{padding:.1rem;position:relative;z-index:99;display:inline-block !important}.showSide::before{font-family:'argon' !important;font-style:normal !important;font-weight:normal !important;font-variant:normal !important;text-transform:none !important;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\e20e";font-size:1.7rem}header>.fill>.container>.flex1>.brand{display:inline-block}.main>.main-left>.nav>.slide>.slide-menu>li>a{font-size:.8rem}}@media screen and (max-width:600px){.mobile-hide{display:none}#maincontent>.container{margin:0 1rem 1rem 1rem}.cbi-value-title{text-align:left}[data-page="admin-system-flash"] legend{padding:1rem 0 1rem 1rem}[data-page="admin-system-flash"] .cbi-section-descr{padding:1rem 0 1rem 1rem}[data-page="admin-system-flash"] .cbi-value{padding:0 1rem}[data-page="admin-network-dhcp"] [data-tab-active="true"]{padding:1rem 1rem !important}.cbi-dynlist p{padding:.5rem 1rem}body{overflow-x:hidden}.node-main-login .main .main-right #maincontent .container .cbi-map .cbi-section .cbi-section-node .cbi-value .cbi-value-field{width:16rem}.node-main-login footer{display:none}.tabs::-webkit-scrollbar,.cbi-tabmenu::-webkit-scrollbar{width:0px;height:0px}.cbi-value-field,.cbi-value-description{display:block !important;padding-left:0 !important;padding-right:0 !important}[data-page="admin-system-admin-password"] .cbi-value-field{display:table-cell !important}.modal.cbi-modal{max-width:100%;max-height:none}.modal{display:flex;align-items:center;flex-wrap:wrap;width:100%;min-width:270px;max-width:600px;min-height:32px;margin:5em auto;padding:1em;border-radius:3px !important;background:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.16),0 0 2px 0 rgba(0,0,0,0.12)}.cbi-dropdown[open]>ul.dropdown{left:.2rem !important;right:0 !important;margin-bottom:1rem}.login-page .login-container footer{display:none}}@media screen and (min-width:600px){::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar,::-webkit-scrollbar-corner{background:transparent}::-webkit-scrollbar-thumb{background:#9e9e9e}::-webkit-scrollbar-thumb:hover{background:#757575}::-webkit-scrollbar-thumb:active{background:#424242}}@media screen and (max-width:480px){.mobile-hide{display:none}.login-page .login-container{margin-left:0rem !important;width:100%}.login-page .login-container .login-form .form-login .input-group::before{color:#525461}.login-page .login-container .login-form .form-login .input-group input{color:#525461;border-bottom:white 1px solid;border-bottom:var(--white) 1px solid;border-radius:0}} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css deleted file mode 100644 index 0a5759093..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css +++ /dev/null @@ -1 +0,0 @@ -body{background:#1e1e1e;color:#cccccc}.login-page .login-container .login-form{background-color:#1e1e1e;-webkit-backdrop-filter:blur(var(--blur-radius-dark));backdrop-filter:blur(var(--blur-radius-dark));background-color:rgba(0, 0, 0, var(--blur-opacity-dark))}.login-page .login-container .login-form .brand{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group::before{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group input{background-color:transparent !important;color:#adb5bd;border-bottom:#adb5bd 1px solid !important;border-radius:0 !important;border-top:none !important;border-left:none !important;border-right:none !important;box-shadow:none}.login-page .login-container .login-form .form-login .cbi-button-apply{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.login-page .login-container .login-form .form-login .cbi-button-apply:hover,.login-page .login-container .login-form .form-login .cbi-button-apply:focus{opacity:.9}header::after{background-color:#1e1e1e !important}.main .main-left{background-color:#333333 !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.15)}.main .main-left .sidenav-header .brand{color:#ccc}.main .main-left .nav .slide .slide-menu .active a{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#cccccc !important}.main .main-left .nav .slide .slide-menu li a{color:#cccccc}.main .main-left .nav .slide .slide-menu li a:hover{background:none !important}.main .main-left .nav .slide .menu.active{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#cccccc !important}.main .main-left .nav .slide .menu.active a::after{background-color:#cccccc !important}.main .main-left .nav li a{color:#cccccc !important}.main .main-left .nav li a:hover{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#cccccc !important}.main .main-left::-webkit-scrollbar-thumb{background-color:#252526 !important}.main .main-left::-webkit-scrollbar-track{background-color:#333}.main .main-right{background-color:#1e1e1e}h2{color:#ccc;background:#333333}h3{color:#ccc;border-bottom:0;background:#333333}a:-webkit-any-link{color:-webkit-link;cursor:pointer;color:#483d8b;color:var(--dark-primary)}input:-webkit-autofill{background-color:#3c3c3c !important}.cbi-value-field .cbi-input-apply,.cbi-button-apply,.cbi-button-edit{color:#fff !important;background-color:#483d8b !important;background-color:var(--dark-primary) !important;border-color:#483d8b !important;border-color:var(--dark-primary) !important}.cbi-section em{color:#ccc}header.bg-primary{background-color:#1e1e1e !important}.cbi-map-descr{color:#ccc}.cbi-section{background:none;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}.panel-title{color:#ccc;background-color:#333333;border-bottom:0px}div>table>tbody>tr:nth-of-type(2n),div>.table>.tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#ccc}fieldset>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{border-top:1px solid #252526}#swaptotal>div>div,#swapfree>div>div,#memfree>div>div,#membuff>div>div,#conns>div>div,#memtotal>div>div{background-color:#32325d !important}#swaptotal>div>div>div>small,#swapfree>div>div>div>small,#memfree>div>div>div>small,#membuff>div>div>div>small,#conns>div>div>div>small,#memtotal>div>div>div>small{color:#ccc !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last{line-height:1.8em}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"]{border:1px solid #999999 !important;background-color:transparent !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div{background-color:#32325d !important}table>tbody>tr>th,table>tfoot>tr>th,table>thead>tr>th{background-color:#252526;border-bottom:black 1px solid !important}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row::before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:#666 !important}.cbi-section>h3:first-child,.panel-title,h3{color:#ccc;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}h4{background-color:#1e1e1f}.cbi-progressbar{position:relative;min-width:170px;height:20px;margin:6px 0;border:thin solid #999;background:transparent;border-radius:.2rem;overflow:hidden}.cbi-progressbar div{background-color:#32325d !important}.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell{background-color:#1e1e1f}.cbi-button{color:#ccc !important;background-color:#483d8b;background-color:var(--dark-primary)}.cbi-section-node{background:none;border-radius:0 0 .375rem .375rem;padding:0rem}abbr{color:#5e72e4}div>table>tbody>tr:nth-of-type(2n),div>.table>.tbody>.tr:nth-of-type(2n){background-color:#252526}#content_syslog{box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}#syslog{color:#ccc;background-color:#1e1e1e}#iwsvg,#iwsvg2,#bwsvg{overflow:hidden;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35);background-color:#1e1e1e !important}.tabs{background-color:#252526}.tabs>li[class~="active"]>a{color:#ccc}.tabs>li[class~="active"],.tabs>li:hover{border-bottom:.18751rem solid #483d8b;border-bottom:.18751rem solid var(--dark-primary);color:#ccc;background-color:#181819}.cbi-tabmenu>li>a,.tabs>li>a{color:#ccc}.cbi-tabmenu>li>a:hover,.tabs>li>a:hover{color:#ccc}.cbi-tabmenu>li{background:#2d2d2d}.cbi-tabmenu li[class~="cbi-tab"] a{color:#ccc}.cbi-tabmenu>li:hover{color:#ccc;background:#2d2d2d}.cbi-tabmenu>li[class~="cbi-tab"]{background-color:#181819}.cbi-tabcontainer>.cbi-value:nth-of-type(2n){background-color:#252526}.cbi-value-title{color:#ccc}select,input{color:#ccc;background-color:transparent !important;border:1px solid #252526;box-shadow:none}select:not([multiple="multiple"]):focus,input:focus{border-color:#483d8b !important;border-color:var(--dark-primary) !important;outline:0}select{background-color:#1e1e1e !important}#cbi-dropbear h2,#cbi-dropbear .cbi-map-descr,#cbi-dropbear .cbi-map-descr abbr,#cbi-rc h2,#cbi-rc .cbi-map-descr,#cbi-distfeedconf h2,#cbi-distfeedconf .cbi-map-descr,#cbi-customfeedconf h2,#cbi-customfeedconf .cbi-map-descr,#cbi-download h2,#cbi-filelist h2{color:#ccc !important}.cbi-value-field>ul>li .ifacebadge{background-color:#3c3c3c}.cbi-section-descr{color:#ccc}.cbi-input-textarea{background-color:#1e1e1e;color:#ccc}.cbi-section-remove:nth-of-type(2n),.cbi-section-node:nth-of-type(2n){background-color:#1e1e1e}.node-system-packages>.main table tr td:nth-last-child(1){color:#ccc}.cbi-section-node .cbi-value{padding:1rem 1rem .3rem 1rem}.ifacebox{background-color:none;border:1px solid #1e1e1e}.ifacebox-head{color:#666}.ifacebox-body{background-color:#333}.zonebadge strong{color:#333}.zonebadge>.ifacebadge{background-color:#3c3c3c}div.cbi-value var,td.cbi-value-field var{color:#5e72e4}#diag-rc-output>pre{color:#ccc;background-color:#1e1e1e}.node-services-vssr .block{background-color:#3c3c3c !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}.node-services-vssr .block h4{color:#ccc !important}.node-services-vssr .status-bar{color:#ccc;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35);background-color:#1e1e1e}.node-services-vssr .cbi-section-table-row{color:#ccc;background-color:#3c3c3c !important;box-shadow:0 0 5px 0 rgba(0,0,0,0.35)}.node-services-vssr .cbi-section-table-row.fast{background:#483d8b !important;background:var(--dark-primary) !important;color:#fff}.node-services-vssr .ssr-button{color:#ccc}.node-services-vssr .incon:nth-child(2){border-right:#1e1e1e 1px solid}#xhr_poll_status>.label.success{color:#ccc !important;background-color:darkolivegreen !important}.notice{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.cbi-input-find,.cbi-input-save,.cbi-button-add,.cbi-button-save,.cbi-button-find,.cbi-input-reload,.cbi-button-reload{color:#fff !important;background:darkolivegreen !important;border-color:darkolivegreen !important}.cbi-button-reset,.cbi-input-remove{color:#fff !important;background-color:darkorange !important;border-color:darkorange !important}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit.important,.cbi-button-apply.important,.cbi-button-reload.important,.cbi-button-action.important{border:1px #483d8b solid !important;border:1px var(--dark-primary) solid !important}.btn[value="Dismiss"],.cbi-button[value="Terminate"],.cbi-button[value="Reset"],.cbi-button[value="Disabled"],.cbi-button[onclick^="iface_reconnect"],.cbi-button[onclick="handleReset(event)"],.cbi-button-neutral[value="Disable"]{font-weight:normal;color:#fff;border:thin solid darkorange !important;background-color:darkorange !important}fieldset[id^="cbi-apply-"]{background-color:#333333}#detail-bubble>div{border:1px solid #ccc;border-radius:2px;padding:5px;background:#252525}.ifacebox-head.active{background-color:#32325d !important}header .fill .status span[data-style="active"]{color:#ccc !important;background-color:darkolivegreen !important}#cbi-wireless .td,#cbi-network .tr:first-child>.td,.table[width="100%"]>.tr:first-child>.td,[data-page="admin-network-diagnostics"] .tr>.td,.tr.table-titles>.th,.tr.cbi-section-table-titles>.th{background-color:#252526;border-bottom:black 1px solid !important}.network-status-table .ifacebox-body .ifacebadge{background-color:#252526;border-bottom:0;box-shadow:none}td>.ifacebadge,.td>.ifacebadge{background-color:#483d8b;background-color:var(--dark-primary);border:0}.btn.danger,.cbi-section-remove>.cbi-button,.cbi-button-remove,.cbi-button-reset,.cbi-button-negative,.cbi-button[value="Stop"],.cbi-button[value="Kill"],.cbi-button[onclick="reboot(this)"],.cbi-button-neutral[value="Restart"]{border:thin solid darkorange !important;background-color:darkorange !important}.cbi-section,.cbi-section-error,#iptables,.Firewall form,#cbi-network>.cbi-section-node,#cbi-wireless>.cbi-section-node,#cbi-wireless>#wifi_assoclist_table,[data-tab-title],[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear),[data-page="admin-system-opkg"] #maincontent>.container{background:#1e1e1e !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}div[style="width:100%;height:300px;border:1px solid #000;background:#fff"]{background:transparent !important}[data-page="admin-system-admin"] .cbi-map h2,[data-page="admin-system-admin-password"] .cbi-map h2,[data-page="admin-system-admin"] .cbi-map .cbi-map-descr,[data-page="admin-system-admin-password"] .cbi-map .cbi-map-descr{color:#ccc}[data-page="admin-system-flash"] .modal label>input[type="checkbox"]{top:-0.35rem}[data-page="admin-system-flash"] .modal .btn{white-space:normal !important;background-color:darkseagreen}[data-page="admin-system-flash"] .modal .alert-message{background-color:transparent !important}[data-page="admin-system-flash"] .modal .danger{border:thin solid darkorange !important;background-color:darkorange !important}.cbi-value input[type="password"]+.cbi-button-neutral{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.btn,button,select,input,.cbi-dropdown{border:1px solid #3c3c3c !important}.cbi-dropdown .preview{color:#ccc}.cbi-section-table-row{background-color:#1e1e1e !important}.modal{background-color:#1e1e1e}.cbi-button-positive{color:#fff !important;background-color:darkolivegreen !important}[data-page="admin-system-flash"] legend{color:#ccc}.logout:before{color:#adb5bd !important}.cbi-dropdown[open]{border-color:#483d8b !important;border-color:var(--dark-primary) !important}.cbi-dropdown[open]>ul.dropdown{background:#252526 !important;color:#ccc !important;box-shadow:none;border:1px solid #3c3c3c !important}.cbi-dropdown[open]>ul.dropdown li{color:#ccc;border-bottom:1px solid #3c3c3c !important}.cbi-dropdown[open]>ul.dropdown>li[selected]{background-color:#483d8b !important;background-color:var(--dark-primary) !important;border-bottom:1px solid #3c3c3c !important}.cbi-dropdown[open]>ul.dropdown>li.focus{background:#483d8b;background:var(--dark-primary);outline:none}.ifacebadge{background-color:#333333}.cbi-dynlist>.item>span{border:1px solid #3c3c3c !important}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit,.cbi-button-apply,.cbi-button-reload,.cbi-button-action,.cbi-button[value="Submit"],.cbi-button[value="Upload"],.cbi-button[value$="Apply"],.cbi-button[onclick="addKey(event)"]{background:#483d8b !important;background:var(--dark-primary) !important}.btn.primary,.cbi-page-actions .cbi-button-save,.cbi-page-actions .cbi-button-apply+.cbi-button-save,.cbi-button-add,.cbi-button-save,.cbi-button-positive,.cbi-button-link,.cbi-button[value="Enable"],.cbi-button[value="Scan"],.cbi-button[value^="Back"],.cbi-button-neutral[onclick="handleConfig(event)"]{background:#483d8b;background:var(--dark-primary)}[data-page="admin-system-opkg"] h2{color:#ccc !important}@media screen and (max-width:480px){.node-status-iptables>.main div>.cbi-map>form{background-color:#1e1e1e;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/favicon.ico b/luci-theme-argon/htdocs/luci-static/argon/favicon.ico deleted file mode 100644 index 4611336803d49af0896adf2698cfaec54e96b800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeHOS(6l1+Aimtxu5UiyYb4a2`=YquIC?c$rnKcFd(SdY`p@~O|vyk3y7eIil|`Y zj=Q)uD2moN>WsU%6b>T|O*h$HYwr2Z^PF5ND=V|A8w_J6W-{WCRn?j2JnuR0d6(xs zL?CjRu;U3M~ z)vL*_-m@~aVP0`yk@qk#bpAhrJQ8Ax6BGyxf#eV5=v5y}T z^dT-jqYq&pGn;PHiv26ac=H7@-gr)o*G`D>{9|H$^qyF!Ult4fu`lQAzlr_Yvtl1T zAnqsc3vjRxZFZ1olf9`11hY399=zWcS40W*&?drxA>_fsnbjTr|C(b|4 zM>yP{&a2<-)2}4^(55ylXCJ~o%17=}&j~Ki(4_?IWnkxLb)jDqa)z>SU8dGAXCJ~o ztgk=yAG0l~+&8Rb;e1r@9}y3~@p8WXBAO4b?PTB0+T{A1g?+f?qI$;q>TeD6!9MJ; z?{X=cQ|iZ+zGY}P3;S?OGyeN{Hk^-ePVH|#Q-AX?Mz}82v5DTL+C<+nVISs~fAybn zY$*YA*hl5T-2iT@zpt5ZAGw5A9;tqO%vf7E7{^a8ARujq6xAr|9GCc-NA7st@8&vS2mplg!V@?+NV~R3=aOPGO%)Cd2`2DWphV?t-6J6m1?!E zs|#%UHnugYLDvgx*t=+*1?VhVmuk*XSHT(TE;z&81y{A6g15_WGSW8&`?8Q@5)<#G z{*@1v25$G%+;8rP^nm(QyL(XdqxV3!L!05-jnH<4dkz?s4Y9EQvH!&0sq8>#PeQxo z+qaQkPj>Yk=Gd6;g;+OF>CeFJg1ML4Lwlw6$bPBNMvWd48@j3=-mNg`z+=Lm>BGHZ zLU)Wk8^wfuP&Vw5ePZpoL+l4eFn+h#kM39FE8BWttGJIHRO2fft1$E~oaw)9EYurf zFweXu&fmWm8}`8d^g}hibKwVZ&VP$}fQ_BJEY_LV#eDI&vSqY8eBKyYuk4ZY-W%fL zc?;j&i+_*i!G)c6PraO&hrTiBegPN)8+*IB+N6{rTM0JWoxUpiQxA!aJ!AbfFUHeH z#4AlJn`6H}CbXaC3!~x!n+4zEUcI6)c*MAWP&{o)?E80#4WHnC_oX6KUF~`KY1}+o+%LFzH zcl*6J#eVq-v9Jct2dBjWP8)v1o1PLEzDun|gn{GVg68`fVyL2j&ar#tvgnX4O((H0 z0$Vv-o$M6n)u+Y2cY9qQd<+HH4>f)qLlONKp?i@|(sw5I#oRHZ?Tc=VzXI)6Wz!ol z1U|O`1N}DEu(EY+VC!S^u)S0HKpp#V)_W7SLEFgjZ-Jj}jiLJRKA~VxZM^42*>;#&5(>I=rW8-r2v6*rfzrZ`c>uo0TEhd)Vxz z3+rIQe{uX23~Kx^&Wq23e)g@Vu3Xr#BF9eKo5Zjawsq!e(|dOQZH%4jH>2^B7;N~I za(vaGkLly@Z)+!O$I`~XlHo7b6efC>7W_E75rYMvn!IYTDedf} zaq5-iYlshi!1ys+9j(Qh!ex#h#Oa7lRlLtRs38tXUd$t=cXVZ9DA8w^{9Gmet_2?) z+DSjh2>s@2HNJ}R6Bwos?o8i*g>PjVdo4K+Md-erGH0}%jOUX6!q=h-DeawT8si(){&$(%Qy1FL!HT7Z%H4L_xT9ZE2Jl=W zBkM0H83LUF_A@d2qimp(VcR;X+_^z2yEjS&@s(PG-FK+`$9VNAsp0n;=2hWme!XXt z7~ns2%qyFLXASU82Kq2}qk&I1F_+f9ezCxVS$j8$4LoWs(3g#O$%ClI`A070f^%{2 z-dtY;)&Z0ZSO@4*d0^#&;--~G(x;NAG2ebwaZnE8eCyBeNOj+4sRsC+AHPG+^qJzT zD1!xV#`*jsalZRXEbz7lI5Xz1=7V>NjX25%N2Rzl@J`P6UyF5Ur#Pr9*x>!isX4Da zrFb3nIh29C8vLP4?hEondPIFvy416v*nit-lrzNgC+6~QQ4`~>7es&Yad1DE#QOMb zgx^5UW1M^%T-T3MgYQ+G7WB%*@08no_F-|6`x@Yw?9cupHn4InY;aHFy5gLA39(^O zT*zn*13x$`=Nz~_?g`?@-DUiU7~RDjr0oanXJXG2e}fF*g&c5j)`#y%3HfCSai)nn zhgY1ID&iI9&&KnkqCasMeAc+s?%Rnxy%h1^?&XVWUA$^pacIt$pNIq5P3Vhz{+zIl4qIXU|l?{v5jYmpPyaoAnHfU88V^^pzO z+XISEHF6jdK{EQ15 zWvGBlb0;T)xjv`(106V8+14Qp}{Ui_`CDq_wwc!*$N>LbeeM|ctI<4Q{1=`9K~1>~ z8G^VaRTHu>iDx|s62UCcJPXIXx|Iy%W{98sYg8jjSqI~TQw`n6zi>~MamJ}B2WqnpHJtfqwVxg28|`_G zwfTv@rFqubTFF38IqPz+T#_Q6eaTn{#z{P1lXa2vXqN+p_~UiHG#OgrN4{If-<-#(y^taUZ7gHI ztc&%jWbB<>2iPYy|HR))26d({V;~3l^$a+nmN^jdCuFF=N4Y7r;BXiRyo18uG8bKw zN1Zi~TC>8RB|{D8iZUx~dpdu)+n;~p&yr!1{2R{fwYnG^v0mIth9YxCU~d;k zF-{`Sl$FQDWXPk2lvnlD0Dr0s@NXq>h3#TzD4FnlNCi1eac{rO4EIS9aVtMpa5hre z8$8qM;ut!7Z@o6&m;)vDbcDa13{yCp*2)ewU_w0P;*6r=8NoI3b86nz@RI+0zB&w>P(3HzxV&n!1c_)KLG~0 BLQ((# diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot deleted file mode 100644 index efce636a84d6da92d5e40498fc945e93a90e4307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33846 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 M>%j(UEQQ4X1Pp)(oB#j- diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg deleted file mode 100644 index c555b7594..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg +++ /dev/null @@ -1,1191 +0,0 @@ - - - - -Created by FontForge 20090622 at Tue Jul 23 03:29:07 2019 - By deploy user -TypoGraphica ©Sharkshock Productions 2015. All Rights Reserved - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf deleted file mode 100644 index e11f89a0f749b95a9001e33de3100be7a0bb858e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33632 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 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff deleted file mode 100644 index fef38ca003e3d02372d80287057424843e6bd4f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17816 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 P{|_V(EFb^?vO@>^k62-U diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot deleted file mode 100644 index e28f6db55e898dd8a1d9ead5318f7528ec9286c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8888 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 JAO6eX{{!P-6bb+U diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg deleted file mode 100644 index 1e12b5f6a..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf deleted file mode 100644 index 3d062dcf264462eae98dbe9565560187362e7f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8732 zcmbVR3vgW3c|PZ!``*2G_wMe!`;d0E5ACjGJ$6_7k}X+QE!iO3*g$L{116Sj;YY9x z#s*^&Fr5r-fsz18n=~FuGbFe;kA|jY20KJ#Xu^azO*2i}nbMTf3=L({$@DQy6KU1& z+`BS@B#`#*o^$^5pa1;-dH&}={~?qR;v;7WBjp_*C=CTd#x1~HMA*Ck=r7AwS#A z7M2&tI72`oAB&YQ?E+jH51lCUQsz>15|JDN-oa=vA_JFx&G(x5+9R*CH|#fV``Pa0 zrR8Op!`par8Bdr0CHX(ew~{9lVpMg$82Bc5td{LoY)6z(a0;v{7YJ#tb;;kZ^FBB* zp^OOY`B>4YMw?OL#nEN5Oh#W6)&rmbAditV9Yel4+7;PqRMKK}fz>@P74Lvr!$2^5EDJMaEAcV@Jy6krBt4m^g4^ z+qM%2CMIgN_3Ix<4(}ZtoSbYn*X^5}y#D&h$$i^*?i?HYFs7A|P@`Te4$@+Q4Y@^4*(Jy};9+qT`7&J6eT;Q!!Fdyc$kDO)HOfA@wP4&AWh>N~R8T<-L>*X-#T9_~4^=cWgH zdKSrhmGbG7$jtHrJBR-0=uwHRCtC^Wpy)vcT?l9LqZEzpqdcI+yw#o5&PX+kqhnhU zIhQTe*?Z(ZlHSpz7n(b|7JttAnrqGuc6_6=bat@Hu5SIv2?QJ-&i@i1yts64!4f=eaY$+RM zxlazsNOsadAY4iO;zW?9Hs%wHk9Oqq9dym%V0loucs9(X)oXW_%9@riOr1UzZiHKj zAm>Muf+m)j$eD`}!coE%iY3x7_Q_x!f(Ut|V#%I<>cf86#rJVoqeWUI^o(%ke5>yV z^n44@(|`yuF(es)GG%GtpI4t6}@sX4pZ-1W^C??;LWU9I;ch1obev$o8H|TR@pvd4FC^_qDiyJl$1~ArhKHx}alT06 z`HMZB$)28MXU`Y)hi@@abmf0cQWQy6lpS0&f}jTi zI>I%c;LyWC+lE{x@I03rN+izP$)wH0r?}WyIvtzw#O5QNJw2VBy}gIK`un@O`ue&a z&6GXC7d@d>u0yy^d>wQ9N7#8d)`vbc?Y zb+sOK>x7%wgW)2LQZmJ!om!ll@)C9@huO1k1kl~vp8oaDg8<}ZtW2Co_)!F5n7-6P zSR`J`7Fy?*b_v5vFVS7C^YkSSq0RF0H$|B}hf^hubyv^er%^WKBx$Y=R`se4<(7eV zv!LBF!cyyTx{qqDx4zvwI>*`1jrO*Ndq+om=}XT(`RylLZ?)cHY_#{~mluEd^2;30 z*7S~o`^tH-(%vwMLNAfL*We6qxErc=&PK>Ux{W~3P#lJCaG@m+esvrlT^L^)A7|qW z%NUPk(rOb53s0mMo_OL_J|`l{FJEA1eZrW?HBUyS{5TzrMUmSF4)DrVcM`R|XS7>&)Gz=B}toi}B zao{QV)qtXyS}*##Ut(fPGnFePS(dJpOkWCmWxuS6y(uN2u0ap>V^mgA1awe{`z4*N znf4l3fqjB?F5rA`;e78TN3jN0><{;dgDK?MD}0jVT)qy21%J$P5eP4n1LS2C(0Umg zke7*q*2`1@d6}li0vUnSOM{yt_%;oe>Z@VeiZxTJV}>*4UG_j68T9BJ8lP&$;sf?c zv&%ALGBRzlwC|KN5Q{fcf-XNLgRBvc_dBPIOxTD^osHPnS45OHg(H#hrqYVI^B&W9 zY`{5Xrh}X*sy0%ZZJJ%i36JS2+5OI4W+uFvj5pEgZ#Qw3{)xg~njwdwe>`h03HvD7 z-YM&`v2uMV;8s$SvIuNK83W2ug&cItP-8uHqd}VUOvtt|SoO?BkQH;38!Sb>%bHPc zQ`+orCMuN)JCU$|!lV4-<*sz;LsES}FLjj?k=9T4*oi%bX4jV7-krPd?at@B@7=X? z@7`Uz?#bt=xTm#ma&%-S5trGk%>t{%_)3n&?dLeJ=j?c_t6c7iwI0$FzNz~vo%x6C z_)T$pPqT1RH}d&=cJ11`nyW9NxAv)-^!^PSHrZ?Je<~H4Gp^p5!g_la>n%$*;Xd*R z#%IX2j`;|<%f~as(6#l@Em%j@wbXillKT6TSVIn9mMMy9_+?obMR$opoIob;85!A= zO(m08SF7_QBlFej)yZTkyJuwNp2`1j*$S6;b6v>`n&0qu$7Unlmerx@__Pko>W<9D zx>3-YGW@(WoVTn5FVyvfW#z-X)Nj0kz^mqiR)<&EVFmNNDryOjt`JW}@>Xz#AZXNa$!Cf8Y6s@ zcku`Zf&)u8$3DOKOukmj)6-wJI+)lQp%;*{4*MB;H^<-qSe4nz6A{5LKOJ-lK2l|l zeAWSC!Agiy!eO7RcQ1XsyFOtDos<)Fk`wiA;nwbYYvUj4O#4w)k$J&=fPb)2(QGS@ z<1=*mT%94GAzvf^P8}R*Tj*YTl0HoTjDCmyGkr@43td7@*n%~xp?w*jt>uq`*1g?{eVdx+)9UTcA9? zT*bR$wQp7t8Ru{m?ZQdva4|Sn>mEhXyL-6>99w8K8xALRsrii)NZw>wiQ+!uH5PXm zs2Hn6WXX@2r9LPS5xsClXBI2qtqu87yQSE(Mzgfvgs|8L z!cR%6gwtO!7#L}mDw=*p6C_=hG?BrG=Xin1qO42I)Km?2K2rh;!}S71xTK+amrv6S zCTB`C7RIhul%*>oN zeX^_^pkU~eV8BE)gHnyNwmbfdQnXywDD`WiE(+4u(Fnip3-Iw%j1;AiCHQ2F9sZCYsH&9WaXEnqtb)0Y}rQt}+q*3U0O6 zIGW$Dsg^2WUuG9Gez8{87KhO$@3EuBEt`>gFKkAP`eSof$I~01)oTXyND8 zpc;+QLJH%dhgDOS#8^ZN>qRh!41M5+K~)z7E;lu2=wS3UBVmX-S_Pxc?zO`*mY|B+!E8m)x&*`u5(T*c8$4lPXiz2#YEbzL z*(dohhFV0IO;Oe?$^Q)rD4k+@6Mj*pia#j%hs49XT$LT=uGm_GA^04rN@E^n`M58NS9B2UU%87DU zj_^Y3XJ(H%V44dHCX%8_g8`F14lHs#<_j+XHE5bHm3!`zJC^^IJ-|Lq23((EhHEBQ z4e?u5`-oXNf9#b*dF2RpWPbK;!0Eayx9q7=`Z$dKP5`n{FbZ-wBb^DG8Dpj-7!5p zJT^O+X+4lGmC_WoTOZbf0sW4^P^z<6*4FjMdi{66OIRdZ#cB52xY-8Wn{17Yl1Z|S z>?Aj0_?lg~S;AsyryF1_@cafEwRtKz(MHsU=T%ZV^9O(vFl7fP;^iKx}8IlH+-wLu;tBd3N?hEWMyhBt-H=NQ2dGM0BRfb zQCL%*_~mK)qC0Haa(Hp__lALX?|#m&~s1x{4}I#(;#%e5Q| zaY~{_krNflMV^KKu2RgFD;&?SIkGZLa|jg$NZ22_NEVA-sc;ld+Hxd^4gpt=*x5+M zR*-`sP<9c+yqy0%0Da*_kxCR%l$SUa%KEZhd$$!pe6a6|8FJ{lNc>2k*9Gm#7%CPFu0>P$_1)dC9|f z2p&UI;oUHx3u1H9J$Ih4Sj8`Iz*S9j(T`XRC zWwF@J*w*?rS8P6*O0qM_)WOYHEY(x@ZyBxCw>#0Ov%Ov$-Ex1bE=Qe-zW#E#zi+~c zVtnwic{WcXID_W6+**+@D}_5_qI?FMc*g>+h=&73#$yazEI58wJp-<$#3SL`zk1Yt zC&Z&2YV-F)uNq$X1OgBLJY4+k|$Q&mC2{u2GMwGK^-Go*C-vi$?D<^|hi>G>w26 zb_~M^LjBvGU|-1c>9TB^reWKO`FF8%MPN=aFE`&@zx&u{J{TDNZ{ow_7`}hl|CQTU zQg{U};6z_QUgf@g_d`AR9hy6smzSRwr(I6%LN`f!oIDh-CV~XGGYHeX3}L37a`@dr zZsYPug*H6JrFk$NM|uZBv0YX`3dK#j5ymm!-lt>UQ+Q9>MoyF0=r%lvIk2u%@YUYL z9%bJZzYlk@F8{qUrXSHiq5s_XDZ??Qjb}{N+-QCuEcp1Og{|D5fN!PuZl)cXp`4(QwA zuS5Y!Lz4`W+PmoAmA!WE;K^HNkCSUr^&mM(ZsDBYMYH+X{E76zx%s){vnS>br1#yG zp4xxxs$<9I2gznv(h0~q2nO@6{8@4W=>g#Ok-HF2VXTgks}Ojr1~IzseqKHN?}Yys DNS*~X diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff deleted file mode 100644 index ef1e9c2c434f786a409d2e3ac47a5035872e98e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8808 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 b$ejqMF;>UORRG?q5=PhE&nt)jo%sI(Ce#aG diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png b/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png deleted file mode 100644 index 7c17009d3d83e8d0aedf334165c8fcdf95df501b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6411 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 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png deleted file mode 100644 index 5308d66b779b26d1828690516a4ab5dc01b7cec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5222 zcmX9?cU)6T)23Gu1g=zR7DQ2`C~~ERjx7{l5s==i^n?&X2_+x`iZp=$3Q9++C`h@Y zAT5Y==`C~!Nk}8fckXxhch2n0?Cj3-%EzR)PSXKM0$&bg`LIX{v%_+=^b_86uRLB+xLvz z3qq0uJp*^WqI0MaFVGcf)*B$4V3KMaT?I)$zS0bwY*J9Nh*ayJM` z3QnN-B95NLAA7>~0OemDN%~I#WI!wd7;=r+atv8_3|WJuG64mUfYT3g1bF_71U$gw zAA<)>zzJjoOhEUD-1#rwC;HF_e&`O_@sA}0CsF{k!HHBRlj#jV0EU1pz+AtWBj0G8 zF9HXk@`~CAzym1&Qo#viARRyoSiw1L!!=?vB#{Du2LQW4w!%?#|5!Xg$2)32D1jW7 zd;*XKNC9L+lTHA>Kpg=5KvDpeJ7n7(x(yKYg6)MSQ9UDfJ)k>&F?hF#t*~U8a~L)- zp2%P_UBfqlx`iase4`J;P$xd{1E9#>QHKC{pnA{Z$pC&jgXsy|1=#t;90N4xmQRQz z=EfHN>}L{LFoBOi%6mG9xyg{ z=wE-(fvxm}?dO(Lf)ntm`NZu##_~EnA)ERvo^pt1x*2XaTXuy+icq7l&?;9oLARwjMG({iJ`CQBXk+N}#e z)It7xd}T8!Add90ogRcdj(bI#nxi$elZSuPLlRF=c_+{m;Fui+#2rUIKM73+&IU0E zNqJF#3ydQLC(?qDhkTt6 zzZUslCoO8yJnz6I!AZ%mKWILfZ`M8#4I-J$9wM>|$@>)T)kEmKFQS!1TZZ$qun2uJ zHv&C^&JNE-J{6rh#}ec_d&#F@{JoEqs78uS^YAZ?hAAg0_RGl;_76k^8h!37T$&O7 zZEaJOu>X^--DUoZQj~spE^T_4Z7}D2iFk9r(g!&k9%oC1GpiHFU-M_877A>?uac6d zOqT`=H1P{GI^w<=3al+mZ7LURTXnn-XFuoUkyd}BS4FIrFZu$h z6z*Cv8Lfz*MnmSl3*o=6h%LK-Rp8=1lwV`(8N*RbNFBMa-T^mq=inqYRgZxaj3Eo8 z1^j8HGe}*WXV_O?Xf8~5M$^B( zoFOTM|Mo5Cy7Q8svB)AL2NB`MafSu{t zPO)o;nOD?%E$m4bSG4#|>EhCIH%&h+vK!r-vkAbl4+eHA-a1asX!kreSfre^+v~(! z2K)Py4XE+gxwxG>0~;9`J@M|x$h0H1&n#DW>qNMrzsYq!>t<(kP)6TN9T}ZKE&JK= zb<9X8x&LLCgH&DDsG60nqoeJwke*v`pT1JVf;vA&CT??TzNDlNd$>%3`Jc~9=dHXu z_EIHl9b)!qjJIzM6+qtR&!56Z{$%GH6A@{8_o3XyKrt70VsL57N761SSxvqE+bSz3 zHYMeASSd(Z5sH#qn;6Ksn%^FO+y(+gy0!}1XjErP&XzUWpy!3pm6;kL<8i&cgtR9Y zv`@=7JUV4+%Do8ve!SsZgrwfjp2W#JPL6P@0k%oa@Y zZ+|SGgNx^T`{ihGzEG!AE&>yTEEEgt&nCj_WO%+nWNa`I1r9&j(=#W;lW)U1K>p}} zKPo8Rg>X*GBF$dx8jh_Y9TRolY9Tzi&J~q~r5v>B*R0|fQ0Wl%((2vy&_kZ5a>tZV zHyIfW#}Cx}DqBO;b+brK@h=@_5rP7)U5fz|9a8DaUZT~C=^PDF+kPl1?lWiYMGN{k zU2RqBlsr1LcntimyW>XXT8Y(a*_w*-5;}b=@*q;fo~FNThgPbUoBYD6fC22f7V0zG znd7F0C*V1Hpb)IH=GaH3P5|NJ5P26~#03NqC3lzHA4o>M?MX@2c8V1U%LrEE zzjJ@$yFpqq*YXH*Jx@TRw4m96s1sv+Aldj}`vwGLCo*Cf7liFWOAeh~KrH)uE>Xfr znZMI1*T;(tn!VUL4Kl!|HqK^gp7K&F&ZT&%+B=w+3+=Epuz2v}D7}WLj!+X4Phn^elf^ zjdNR1rMbXwT^N%y>fG<={A)WhDqBZ(;!gt9yZY$(owf!~ww`tx?27NU`V8L9vIvz7 zpXDt}W|P;M@;#&erO>`JP!vbMJ*1G($7!%;6Q$fH(YsB7sIHW%{!%i4PO^?_?i;Qb zXN;?Z@BI^;Vz2vqbO`>={CULW?nvQoOu_5pDR3pJzsNd*4lnF%#vJ%kf# zH0AYYw;wM`_hleQ`J{XY@71niJ0e*~tzMpO^M>92yIG|1ZC);=n+c1+jZawO?(kEa_d&pK9zg+v@mxWH^AS&0sNUCQToe`5m1K%d zpuzy?g|Az}D~~S8&J6d6$om^fC+^k)6L_gIjf~EB=1I3h^B_%AkOaQo&xVhQ5(9=v z3pz{k(OQN4ip3)38RzypDLs=&$Mc|mMuOq3@t%p09L&a5SdTWLydP?R?GMDP{ zy^bKxY?@iYt_NOR^2l=W!J@_he)f}(P*sfEqonH&H9d~?MIPK1=5^+4-0p)dgvH&UC;uY0Z4bt|cEPeL$SfOOevMuYXw9yBafft7WS)wPDs8I3 z?pj_{cdD$c7^E=FR$(YF7s z4F2A+t}lO5?g|zZN-&6R^oQer)N#7TzOvcmjM%2SRvS;YQ4VJ2)is4 z#k|r5dEH?3@baHT1`+h@6n@!MjZ0DJIq+fM{IDKl+Z(oVueP73#^#cJ{^8aD>uDL` zFtJ>QV`sj(yP7A*BzIQPrAuI0u?+6s*$e@r%AuQ{OlnDqdeET4@}_x6+--ssUf@Ah ztY><}d+Ju&WQ=fS6<1s2Q@KDoW-lADy#l-(}$6S8uY?Gd#1Guq|HAGxz{0&|;3?I=KLPPmPA2Cm$$P{!F1z7l0cxZ^uRrovC)aTe2c{pxRNtcBFhxtWlHiQ|gQ0JBTWDEx1NRm{@o z-tN<=>u4$moKdBpA=V$In`JEGV2N%r;5SLFuMtcXv%$njr@Z(Y(A)v1Ze4s`AT6 z>$UbONT*n=IIrX%d}800(F{m%38aYNlWoXkpj^+L?MaK=FB z*IZ=<=O5CW$2}wF5-PPywxe>Z<+rTl9)L8p8>-q#dv{Ko)YYxA;Lc@qs!B zZyH-GcdesdRkZu>>M?OrvYP!~(FYU%fWy-Lu^Gw@w|6rf_qi5h!qp>>M#tCjW3{>FLY5H1%6B)hp5I;=>{@`V z>{2PHllG!tfi34$WwAa@$zf zF6N6wkl+ytsnqc(NMC9Az5dpu8-Z$!WC$})m` zZ^04qDi6xaKHSrv24k&CjQE-%bSmiRM*i6Sbv9kCmhc^Omb=$Jo7I1)Z_{VU@YoUf znRvCCJ;ez0Rpp@@-_nw6wl2QpcP}&P=V90`luc>c)lRN{W|Tw+l=VIe*>Gt5&8}VS zAm^(S9>=C#U-v|`@ygt@m?zVY9G#%IqRQu9oQA%;`@%r@g3_Pj8g8eiu&1N>oKlxw zX+Al3y3bk8J9f9m3Q`=4H*;KJ{k3yP0H(UIh~KuZHZb^hLaI(II(wvAs`gS3uI%G0 zrUPE^$kG1#CiZ`{HUxLaH~T)9S58~3=gRbXne3Xn8KdZAk~X+-k3Th84oaPREsZ(G zpZIxr_pf}wauZ}FZ=zp|z=d?d@!eDv`K2bXkYeol^2X{Oi@W@uN~6@T1fGi*PMSDs zbd|Jt=YtYQ(IH62+JbC)&+|;!$3YB!cmBDd!PzA4ee8?jFcB8ZSq`0Xo^qj}826%- zKU(uK@ej4~xM(6iqo(6LbP?r>nWe6s_ree36;T(sp$ra?u;6BPr6lxbimDTaTQ5eq z)APLYA^gmr+09YZch`F_8;YLZm#;9aF8X-6NIfX#_I%9K>YoEufs-V~y1|yoi3!`D zr>)f!v->LDh}DxklXue7u+K)dTI%5vyEa)|6WecAqqJ!+Dyt-0>;i~H_{Udp+uvgo zaoBS~@Mr(KELyuqpuFZ-AG&Pk#X&%Xe{uRXGY@&At%5x!6(7VzMlU|D_Lv&jT%-Q2+nJOabr`H^&C$s? aWS&p(fIu!(CjkFLSj>$d8r2y%$NwKzaNBSI diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png deleted file mode 100644 index f18dfa49cd35fa6d5cb882ea8ae703c852e313df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2561 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 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png deleted file mode 100644 index bb3e2423331068c72c5ad0e1bc49a51e1fdd71af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2877 zcmYjSc{tSD8=r0}vX+WuN!ij(L|36)A(HGRB#dS3W{feIF_y*{)QDuu_ERKVCP@?$ zB}*himadx^%Ph>8efxcTe*gT=bIyCt`8?12p3nO^?|Dv^i<6z~UX{Hd5J>ily^R|% z+y5StI{^zewnhMx1jOo^6$nJkl@bi=&4v0EVJB1CblC z89e_uQdAlfl0*$oB*$e6pm#V3ya*h><_BMnNoU1pi^DPWkR(b(3Ox|H9-h4Q+hXWI zhh=bqemnM8Sn?)-0}Euf_;&0v;P}6Fe3l46klDX&L<%D^l>r2aOkn_92#O{aivh=| z)a`K0Rw$YV;6P;P9X2?A6@sG1W^jR+(P_*G3?1--VmSc_QXp~-pyVI70>g3uN&sOP zmIucP5O^WLJUX2fo52r5Zw4i-$J}8DC2T;FC}C(Ca5O+EJb4q~6Ou>{PS^-V(Lzzw z$W$gkDKLHwNES#WDvcF{Tn8goMIvzkVik_#0h$2%1jLcTF${rF3emkLMBVhV2YMVLV-Z+2VVilugBp9TMRLqBOadySaBw2g(1J?rIKmCr3g>n z{{BN4il+1UVxdrcx0DWumQl!wPG@%y@E4bbs~f_I6eev;H1bt|y2piKw`0;73qJ)> zY3#;!AYV@Zh+uGB2x$1clMP00)V^Scq5-Y8!jkFj?>H}egs6LhgsknAHPP5NVPp#P zO+T-whSl(jgSpQyuNS1{^QxPfkty_bvWUYK|J?v-&rjq%|b4B{I> zX`QgJhTqg7#6AQ9ZX&Zb8{3)T=#Bg;I<9cDs*w?#u--c;>K)=`77KDK1sDQ=P@bU) zQ@|VeGtSM)9rXVHTi;Ie_qtP|9Q9D$soJzOb55=LbZr_(eY!8Lc8WiDdRYnt+Vl8| zjg`mEzNVSPn~D$>(59=8&nbtkS8P_x0ON#&2j1JK&3m8z2JvU}Ou_6EZ>(11n-Im8 zyrWVlur2s`Nj>&)S-hm=AF)ZUP2{9hyWXAsHz-|E$nP;{j7yMmll8R9!C!30?zf(} zqo1Ja#?(aJGwQH@#WQQ=^Vs4t$}IvBprNC!?Q36uZTZ&?n+#PmEs63r%a?r(ODKd{?T@Z5)Y8AG z(sQdLYPJ?T___REWoXoPui=cTfqFLX#Af0isGj6DQE|~F$`S|TJI|iD|Llc8j#qXC zLY0(B>+akyVs%{QCO6JW7{ANus_eL^{D;%fb*Rj%%J&?hVUv^lO0vpX8CFZp-NqouQt3Kng0xwwO%WQ7@@ z-AVs~*1{Z@&ebeK^?b#;&=9aB)v_~g=4dcQe08T&&Tf`Za@)Rh%1L)y?bfmb>>hp~ zc^%fJdY^>EnL<_f|0D-?(!4ub4W}Kvltxmr4EAp`6*aarXg6V=

l43o znrK}nG+gtc>gLx>3i3^0x2Jw8raK+QC7@P3yP)0$WkXdfo&(SJ7avZx7?9gye*=Fh z7^#U3mveCVTs5L%k>I3&;}DR@Gbl&OjgX3u6tH~ViyWGN=xhHJmXqb75p?YjBWI!7 zXQOk-o;;ew1%hU;dPQNyb1>nPku#Dsp8165-LI*cm;3`hb@pts4Q9lGd3wP*%H&|w z#Y>P2Qdtzn;Zr^Nrr-KTgP$9mN;J=My)3^EvJclURe zzxaz!|C)L*;B4u@+V+tfo@4yjLty;pzP;DbiSEZ!{C2@hNG7H+L8>yc0aV=!#xqsf_rp|b*a?=O zdkVxzBZ`Xxvy1NF!Of&k>bbv|?No7}*&6tlNnM-BoI~GLkBVxAjG^a7Bjs-?yuPT{ zaCZ9d049+>}fFM zCuM`!K6?G2=tfO`8%FKLCo0w-FIs3?#=UL&dYAFn92b2cl7NrqHomX5^lw6=lPxZ;uW0c%Ty}83g+jQYV9D~#HHw~lDUs=oH8a=Hj`uh= z!BzHhEOD6gYOc$2dw7sCJ#_5-L+xxIh_vkW9Hl+35F2w2p`x1c-S~PyU#40vro1qf z*QDd|-L1B<&Pe-a=&Hu+2vT?+eYlk`b3I7pU$^P^vQ=OUo=@of5wksfpx*xpfoHPg z!}gpIjQ$ldh4xh7F>6ZzF;idtxrrv>4EFQ(l?hCGu#Ysm{Jp zXJe*zQIKhfkM@M2hi6x1BfELj=@yOO&>qu%Go-mBjM(Vo_eJ%p|Htkl^Wku3@3Zi>ZKo#XAY5CTVcnVy;=;QYF>U;ju%hgvOoXWk7$Wk8E$eH zKVY6^yFDE_AM>65v32|SDW&Lg9*xEG9bJW#WJW69eso4uvF_WS$dy0c_5LCYUSYC@ zDDu<@1|K+ld`9`>$0d)uPr%!slyse{)ip#KSRIf?hg$kD@Xdp+*gDxXU-D1?FEo)L Ao&W#< diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg deleted file mode 100644 index ebeca958b..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml b/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml deleted file mode 100644 index c55414822..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml +++ /dev/null @@ -1,2 +0,0 @@ - -#ffffff \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png deleted file mode 100644 index 308843a09261dc8c5d95f01a3b4e6592e1a83ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 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 aWS&p(fIu!(CjkFLSj>$d8r2y%$NwKzaNBSI diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg deleted file mode 100644 index 6ddd3b3ed..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg deleted file mode 100644 index 654e2fe24..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg b/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg deleted file mode 100644 index 26a52a5351f3c68d326dcacbf98fe3cf9ac485a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159265 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 z 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

Y2#d_pOEdAHz8x0cU)30N4^@W{p|L> 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

",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 - * - * Have a bug? Please create an issue here on GitHub! - * https://github.com/jerrykuku/luci-theme-argon/issues - * - * luci-theme-material: - * Copyright 2015 Lutty Yang - * https://github.com/LuttyYang/luci-theme-material/ - * - * Agron Theme - * https://demos.creative-tim.com/argon-dashboard/index.html - * - * Login background - * https://unsplash.com/ - * Font generate by Icomoon - * - * Licensed to the public under the Apache License 2.0 - */ - -/* - * Include base and custom css - */ -@import url("pure-min.less"); -@import url("fonts.less"); - - -:root { - --primary: #5e72e4; - --dark-primary: #483d8b; - --main-color: #09c; - --header-bg: #09c; - --header-color: #fff; - --bar-bg: #5e72e4; - --menu-bg-color: #fff; - --menu-color: #5f6368; - --menu-color-hover: #202124; - --main-menu-color: #202124; - --submenu-bg-hover: #d4d4d4; - --submenu-bg-hover-active: #09c; - --blue: #5e72e4; - --indigo: #5603ad; - --purple: #8965e0; - --pink: #f3a4b5; - --red: #f5365c; - --orange: #fb6340; - --yellow: #ffd600; - --green: #2dce89; - --teal: #11cdef; - --cyan: #2bffc6; - --white: #fff; - --gray: #8898aa; - --gray-dark: #32325d; - --light: #ced4da; - --lighter: #e9ecef; - --secondary: #f7fafc; - --success: #2dce89; - --info: #11cdef; - --warning: #fb6340; - --danger: #f5365c; - --light: #adb5bd; - --dark: #212529; - --default: #172b4d; - --white: #fff; - --neutral: #fff; - --darker: black; - --background-color: #f4f5f7; - --login-form-bg-color: rgba(244, 245, 247, 0.8); - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --blur-radius: 10px; - --blur-opacity: 0.5; - --blur-radius-dark: 10px; - --blur-opacity-dark: 0.5; - --font-family-sans-serif: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; - --font-family-normal: Open Sans, PingFangSC-Regular, Microsoft Yahei, WenQuanYi Micro Hei, "Helvetica Neue", Helvetica, Hiragino Sans GB, sans-serif; -} - -html, -body { - margin: 0px; - padding: 0px; - height: 100%; - font-size: 16px; - font-family: "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"; - font-family: var(--font-family-sans-serif); -} - -html { - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - font-size: 0.875rem; - background-color: #f4f5f7; - - background-color: var(--background-color); - color: #32325d; - color: var(--gray-dark); - -webkit-tap-highlight-color: transparent; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -::selection { - background-color: #5e72e4; - background-color: var(--primary); - color: #ffffff; - color: var(--white); -} - -a:link, -a:visited, -a:active { - color: #5e72e4; - color: var(--primary); - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -li { - list-style-type: none; -} - - - -.table { - position: relative; - display: table; -} - -.tr { - display: table-row; -} - -.thead { - display: table-header-group; -} - -.tbody { - display: table-row-group; -} - -.tfoot { - display: table-footer-group; -} - -.td, -.th { - line-height: normal; - display: table-cell; - padding: .5em; - text-align: center; - vertical-align: middle; -} - -.th { - font-weight: bold; - white-space: nowrap; -} - -.tr.placeholder { - height: 4em; -} - -.tr.placeholder>.td { - line-height: 3; - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 0.4rem 0 !important; - text-align: center !important; - background: inherit; -} - -.td[width="33%"] { - padding: 1.1em 1.5rem; -} - -.table[width="33%"], -.th[width="33%"], -.td[width="33%"] { - width: 33%; -} - -.table[width="100%"], -.th[width="100%"], -.td[width="100%"] { - width: 100%; -} - -.col-1 { - flex: 1 1 30px !important; -} - -.col-2 { - flex: 2 2 60px !important; -} - -.col-3 { - flex: 3 3 90px !important; -} - -.col-4 { - flex: 4 4 120px !important; -} - -.col-5 { - flex: 5 5 150px !important; -} - -.col-6 { - flex: 6 6 180px !important; -} - -.col-7 { - flex: 7 7 210px !important; -} - -.col-8 { - flex: 8 8 240px !important; -} - -.col-9 { - flex: 9 9 270px !important; -} - -.col-10 { - flex: 10 10 300px !important; -} - -* { - box-sizing: border-box; - margin: 0; - padding: 0; - -} - -.h1, -.h2, -.h3, -.h4, -.h5, -.h6, -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: inherit; - font-weight: normal; - line-height: 1.1 !important; - color: inherit; -} - - - -select { - padding: .36rem .8rem; - color: #555; - border: thin solid #ccc; - background-color: #fff; - background-image: none; -} - -.btn, -button, -select, -input, -.cbi-dropdown { - line-height: 1.5rem; - padding: .5rem .75rem; - margin: 0.25rem 0.1rem; - color: #8898aa; - border: 1px solid #dee2e6; - - border-radius: .25rem; - outline: 0; - background-image: none; - box-shadow: none; - transition: box-shadow .15s ease; -} - -select, -.cbi-dropdown { - width: inherit; - cursor: default; -} - -select:not([multiple="multiple"]):focus, -input:not(.cbi-button):focus, -.cbi-dropdown:focus { - border-color: #5e72e4; - border-color: var(--primary); - box-shadow: 0 3px 9px rgba(50, 50, 9, 0), 3px 4px 8px rgba(94, 114, 228, .1); -} - -.cbi-dropdown, -select[multiple="multiple"] { - height: auto; -} - -pre { - overflow: auto; -} - -code { - font-size: 1rem; - font-size-adjust: .35; - padding: 1px 3px; - color: #101010; - border-radius: 2px; - background: #ddd; -} - -abbr { - cursor: help; - text-decoration: underline; - color: #5e72e4; - color: var(--primary); -} - -hr { - margin: 1rem 0; - opacity: .1; - border-color: #eee; -} - - - - -/*********************** -* -* Login Page -* -***************************/ - -.login-page { - height: 100%; - - .video { - position: absolute; - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - background-color: #000; - background-color: var(--darker); - overflow: hidden; - - video { - width: 100%; - height: auto; - } - } - - .volume-control { - position: fixed; - right: 1rem; - top: 1rem; - width: 1.5rem; - height: 1.5rem; - z-index: 5000; - cursor: pointer; - background-size: contain; - background-image: url(../img/volume_high.svg); - - &.mute { - background-image: url(../img/volume_off.svg); - } - } - - .main-bg { - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - background-image: url(../img/blank.png); - background-repeat: no-repeat; - background-position: center; - background-size: cover; - transition: all 0.5s; - } - - .login-container { - height: 100%; - margin-left: 4.5rem; - position: absolute; - top: 0px; - display: flex; - flex-direction: column; - -webkit-box-pack: center; - justify-content: center; - align-items: flex-start; - min-height: 100%; - z-index: 2; - width: 420px; - box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 35px -5px; - margin-left: 5%; - background: transparent; - - .login-form { - display: flex; - flex-direction: column; - -webkit-box-align: center; - align-items: center; - position: absolute; - top: 0px; - width: 100%; - min-height: 100%; - max-width: 420px; - background-color: #fff; - background-color: var(--white); - -webkit-backdrop-filter: blur(var(--blur-radius)); - backdrop-filter: blur(var(--blur-radius)); - background-color: rgba(244, 245, 247, var(--blur-opacity)); - - .brand { - display: flex; - -webkit-box-align: center; - align-items: center; - margin: 50px auto 100px 50px; - color: #525461; - color: var(--default); - - .icon { - width: 50px; - height: auto; - margin-right: 25px; - } - - .brand-text { - font-size: 1.25rem; - font-weight: 700; - font-family: "TypoGraphica"; - - } - - &:hover { - text-decoration: none; - } - } - - .form-login { - width: 100%; - padding: 20px 50px; - box-sizing: border-box; - - .errorbox { - text-align: center; - color: #fb6340; - color: var(--warning); - padding-bottom: 2rem; - } - - .input-group { - margin-bottom: 1.25rem; - position: relative; - - &::before { - font-family: 'argon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #525461; - color: var(--default); - font-size: 1.5rem; - position: absolute; - z-index: 100; - left: 10px; - top: 10px; - } - - .border { - position: absolute; - width: 100%; - height: 1px; - bottom: 0; - border-bottom: 1px #5e72e4 solid; - border-bottom: 1px var(--primary) solid; - transform: scaleX(0); - transition: transform 0.3s; - } - - input { - font-size: 1rem; - line-height: 1.5em; - display: block; - width: 100%; - padding: .5rem .75rem 0.5rem 3rem; - margin: 0.825rem 0; - box-sizing: border-box; - transition: all .3s cubic-bezier(.68, -.55, .265, 1.55); - color: #525461; - color: var(--default); - border: 0; - border-radius: 0; - border-bottom: 1px solid #fff; - border-bottom: 1px solid var(--white); - background-color: transparent; - background-clip: padding-box; - box-shadow: 0 3px 2px rgba(233, 236, 239, .05); - outline: none; - - &:focus+.border { - transform: scaleX(1); - } - } - - .cbi-input-password { - margin-bottom: 2rem; - position: relative; - } - } - - .user-icon::before { - content: "\e971"; - } - - .pass-icon::before { - content: "\e910"; - - } - } - - .cbi-button-apply { - width: 100% !important; - box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 50px 0px; - font-weight: 600; - font-size: 15px; - color: #fff; - color: var(--white); - text-align: center; - width: 100%; - cursor: pointer; - min-height: 50px; - background-color: #5e72e4 !important; - background-color: var(--primary) !important; - border-radius: 6px; - outline: none; - border-width: initial; - border-style: none; - border-color: initial; - border-image: initial; - padding: 10px 0px; - margin: 30px 0px 100px; - transition: all 0.3s !important; - letter-spacing: 0.8rem; - - &:hover, - :focus { - opacity: 0.9; - } - } - } - - footer { - box-sizing: border-box; - width: 100%; - text-align: center; - line-height: 1.6rem; - display: flex; - justify-content: space-evenly; - margin-top: auto; - padding: 0px 0px 30px; - z-index: 10; - color: #525461; - color: var(--default); - position: absolute; - bottom: 0; - - .ftc { - position: absolute; - bottom: 30px; - width: 100%; - } - - .luci-link { - display: block; - } - } - } -} - - -header, -.main { - width: 100%; -} - - -footer { - font-size: .8rem; - overflow: hidden; - padding: 1rem; - text-align: right; - white-space: nowrap; - color: #aaa; -} - -footer>a { - text-decoration: none; - color: #aaa; -} - -small { - font-size: 90%; - line-height: 1.42857143; - white-space: normal; -} - -.main { - position: relative; - top: 0; - bottom: 0; - overflow-y: auto; - height: 100%; -} - -.main-left { - position: fixed; - top: 0; - float: left; - overflow-x: auto; - width: 15%; - width: calc(0% + 15rem); - height: 100%; - background-color: #fff; - background-color: var(--menu-bg-color); - box-shadow: rgba(0, 0, 0, 0.75) 0px 0px 15px -5px; - overflow-x: auto; - position: fixed; - z-index: 100; - - - .sidenav-header { - padding: 1.5rem .5rem; - text-align: center; - - .brand { - font-size: 1.8rem; - color: #5e72e4; - color: var(--primary); - font-family: "TypoGraphica"; - text-decoration: none; - text-align: center; - cursor: default; - vertical-align: text-bottom; - } - } - - &::-webkit-scrollbar { - width: 5px; - height: 1px; - } - - &::-webkit-scrollbar-thumb { - background-color: #f6f9fc - } - - &::-webkit-scrollbar-track { - background-color: #fff; - } -} - -.main-right { - float: right; - width: 85%; - width: calc(100% - 15rem); - height: 100%; - transition: all 0.2s; -} - -.main-right>#maincontent { - position: relative; - z-index: 50; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.nowrap:not(.td) { - white-space: nowrap; -} - -[disabled="disabled"] { - pointer-events: none; -} - -header { - color: #fff; - color: var(--header-color); - padding: 0; - position: relative; - - &.bg-primary { - background-color: #5e72e4 !important; - background-color: var(--primary) !important; - } - - &::after { - content: ""; - position: absolute; - height: 2rem; - width: 100%; - background-color: #5e72e4 !important; - background-color: var(--primary) !important; - } - - .fill { - padding: 0.8rem 0; - border-bottom: 0px solid rgba(255, 255, 255, .08) !important; - display: flex; - - .container { - height: 2rem; - padding: 0 1.25rem; - display: flex; - align-items: center; - width: 100%; - - .flex1 { - flex: 1; - - .showSide { - display: none; - color: #fff; - font-size: 1.4rem; - - &:hover { - text-decoration: none; - } - } - - .brand { - font-size: 1.5rem; - color: #fff; - font-family: "TypoGraphica"; - text-decoration: none; - padding-left: 1rem; - cursor: default; - vertical-align: text-bottom; - display: none; - } - } - - - .pull-right { - float: right; - margin-top: 0rem; - display: flex; - } - } - - .status { - span{ - display: inline-block; - font-size: 0.8rem; - font-weight: bold; - padding: 0.3rem 0.8rem; - white-space: nowrap; - text-decoration: none; - text-transform: uppercase; - text-shadow: none; - border-radius: 4px; - cursor: pointer; - transition: all 0.3s; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); - margin: 0 0.25rem; - &:last-child{ - margin-right: 0; - } - } - - span[data-indicator="poll-status"] { - color: #32325d; - background-color: #fff; - } - - span[data-style="active"] { - - background-color: var(--green); - - } - - span[data-style="inactive"] { - color: #ffffff !important; - background-color: #32325d; - - } - } - } -} - - - -#xhr_poll_status { - display: flex; - margin-left: 0.5rem; - - * { - color: #fff; - } -} - -div[style="width:100%;height:300px;border:1px solid #000;background:#fff"] { - border: 0 !important; -} - -.danger { - background-color: #ff7d60 !important; -} - -.warning { - background-color: #f0e68c !important; -} - -.success { - background-color: #5cb85c !important; -} - -.notice { - background-color: #11cdef !important; - color: #fff; -} - -.error { - color: #f00; -} - -.alert, -.alert-message { - font-weight: bold; - margin-bottom: 1.25rem; - padding: 1rem 1.25rem; - border: 0; - border-radius: 0.375rem !important; - background-color: #fff; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); - text-shadow: 1px 1px rgba(0, 0, 0, .1); - - &.error { - background-color: #ffd600; - } - - h4 { - padding: 0.25rem 0rem; - border-radius: 4px; - background-color: #ffd600; - } - - .btn { - height: auto; - } -} - -.alert-message>h4 { - font-size: 110%; - font-weight: bold; -} - -.alert-message>* { - margin: .5rem 0; -} - -.alert-message .btn { - padding: .3rem .6rem; -} - -.container .alert, -.container .alert-message { - margin-top: 0rem; -} - - -/* - * Main Menu - */ - -.main { - .main-left { - transition: all 0.2s; - - .nav { - margin-top: 0.5rem; - - >li>a:first-child { - display: block; - margin: 0.1rem .5rem 0.1rem .5rem; - padding: .675rem 0 .675rem 2.5rem; - border-radius: .375rem; - text-decoration: none; - cursor: default; - font-size: 1rem; - transition: all 0.2s; - position: relative; - - &.active { - color: #fff; - background: #5e72e4; - background: var(--primary); - - &::before { - color: #fff !important; - } - - &::after { - transform: rotate(90deg); - color: #fff !important; - } - } - - &:hover { - cursor: pointer; - color: #fff; - background: #5e72e4; - background: var(--primary); - - &::before { - color: #fff !important; - } - } - - &::before { - font-family: 'argon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: absolute; - left: 0.8rem; - padding-top: 3px; - transition: all 0.3s; - content: "\e915"; - color: #5e72e4; - color: var(--primary); - } - } - - li { - padding: 0.5rem 1rem; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - padding: 0; - - a { - display: block; - color: #5f6368; - color: var(--menu-color); - } - - &.slide { - padding: 0; - - ul { - display: none; - overflow: hidden; - } - - &:hover { - background: none; - } - - .slide-menu { - margin: 0 0.5rem 0 2.5rem; - padding: 0rem 0.5rem; - - &.active { - display: block; - - } - - - li { - position: relative; - border-radius: 0.375rem; - margin: 0; - padding: 0.5rem 0rem; - background: none; - list-style: none; - - a { - text-decoration: none; - } - - &::after { - content: ""; - position: absolute; - left: 0; - bottom: 0; - width: 0; - height: 2px; - background-color: #5e72e4; - background-color: var(--primary); - transition: all 0.2s; - } - - &:hover { - background: none; - - &::after { - width: 100%; - } - } - - } - - .active { - background: none; - - color: var(--menu-color); - - a { - color: var(--menu-color); - } - - &::after { - content: ""; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - height: 2px; - background-color: #5e72e4; - background-color: var(--primary); - transition: all 0.2s; - } - - &:hover { - - background: none; - - &::after { - width: 100%; - } - } - } - } - - } - - - - .menu { - display: block; - margin: 0.1rem .5rem 0.1rem .5rem; - padding: .675rem 0 .675rem 2.5rem; - border-radius: .375rem; - text-decoration: none; - cursor: default; - font-size: 1rem; - transition: all 0.2s; - position: relative; - - &.active { - color: #fff; - background: #5e72e4; - background: var(--primary); - - &::before { - color: #fff !important; - } - - &::after { - transform: rotate(90deg); - color: #fff !important; - } - } - - &:hover { - cursor: pointer; - color: #fff; - background: #5e72e4; - background: var(--primary); - - &::before { - color: #fff !important; - } - } - - &::before { - font-family: 'argon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: absolute; - left: 0.8rem; - padding-top: 3px; - transition: all 0.3s; - content: "\e915"; - color: #5e72e4; - color: var(--primary); - } - - &::after { - position: absolute; - right: 0.5rem; - top: 0.8rem; - font-family: 'argon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - content: '\e90f'; - transition: all .15s ease; - color: #ced4da; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - transition: all 0.3s; - } - } - - - .menu[data-title=Status]:before { - content: "\e906"; - color: #5e72e4; - color: var(--primary); - } - - .menu[data-title=System]:before { - content: "\e90a"; - color: #fb6340; - } - - .menu[data-title=Services]:before { - content: "\e909"; - color: #11cdef; - } - - .menu[data-title=NAS]:before { - content: "\e90c"; - color: #f3a4b5; - } - - .menu[data-title=VPN]:before { - content: "\e90b"; - color: #8965e0; - } - - .menu[data-title=Network]:before { - content: "\e908"; - color: #8965e0; - } - - .menu[data-title=Bandwidth_Monitor]:before { - content: "\e90d"; - color: #2dce89; - } - - .menu[data-title=Docker]:before { - content: "\e911"; - color: #6699ff; - } - - .menu[data-title=Statistics]:before { - content: "\e913"; - color: #8965e0; - } - - .menu[data-title=Control]:before { - content: "\e912"; - color: #5e72e4; - color: var(--primary); - } - - .menu[data-title=Asterisk]:before { - content: "\e914"; - color: #fb6340; - } - - a[data-title=Logout]:before { - content: "\e907"; - color: #adb5bd; - } - } - } - } -} - -.lg { - margin: 0; - padding: 0 !important; -} - -.logout { - display: block; - margin: 0.8rem .5rem 0.1rem 0.5rem; - padding: .675rem 0 .675rem 2.5rem; - border-radius: .375rem; - text-decoration: none; - font-size: 1rem; - transition: all 0.2s; - position: relative; -} - -.logout:before { - font-family: 'argon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - position: absolute; - left: 0.8rem; - padding-top: 3px; - transition: all 0.3s; - content: "\e907"; - color: #32325d !important; -} - - -body[class*="node-"]>.main>.main-left>.nav>.slide>.menu::before { - transition: transform .1s ease-in-out; -} - -body[class*="node-"]>.main>.main-left>.nav>.slide>.menu.active::before { - transition: transform .2s ease-in-out; -} - -.main>.main-left[style*="overflow: hidden"]>.nav>.slide>.menu::before { - display: none; -} - - - - -#maincontent>.container { - margin: 0 1.25rem 1rem 1.25rem; -} - -ul { - line-height: normal; -} - -li { - list-style-type: none; -} - -h1 { - font-size: 2rem; - padding-bottom: 10px; - border-bottom: thin solid #eee; -} - -h2 { - margin: 0 0 1rem 0; - font-size: 1.25rem; - letter-spacing: 0.1rem; - padding: 1rem 1.25rem; - color: #32325d; - border-radius: .375rem; - background: #fff; - box-shadow: 0 4px 8px rgba(0, 0, 0, .03); - font-weight: bold; - -} - -h3 { - font-size: 1.1rem; - line-height: 1; - display: block; - width: 100%; - margin: 0; - margin-bottom: 0; - padding: 0.8755rem 1.25rem; - color: #32325d; - color: var(--gray-dark); - border-radius: .375rem; - background: #fff; - font-weight: bold; -} - -h4 { - margin: 0; - padding: 0.75rem 1.25rem; - font-size: 0.7rem; - font-weight: 600; - color: #525f7f; - background-color: #e9ecef; - background-color: var(--lighter); - font-weight: bold; - - em { - padding: 0 0.5rem; - } - -} - -h5 { - font-size: 1rem; - margin: 2rem 0 0 0; - padding-bottom: 10px; -} - -.cbi-section, -.cbi-section-error, -#iptables, -.Firewall form, -#cbi-network>.cbi-section-node, -#cbi-wireless>.cbi-section-node, -#cbi-wireless>#wifi_assoclist_table, -[data-tab-title], -[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear), -[data-page="admin-system-opkg"] #maincontent>.container { - font-family: inherit; - font-weight: normal; - font-style: normal; - line-height: normal; - min-width: inherit; - margin: 1.25rem 0; - padding: 0rem; - border: 0; - - border-radius: 0.375rem; - background-color: #fff; - box-shadow: 0 0 1rem 0 rgba(136, 152, 170, .15) -} - -.cbi-modal .cbi-section, -.cbi-section .cbi-section { - padding: 0; - box-shadow: none; -} - -.cbi-modal .cbi-tabmenu { - margin-left: 0; -} - -.cbi-map-descr { - font-size: small; - line-height: 1.5; - padding: 0 1.25rem; -} - -.cbi-section-descr:not(:empty) { - - font-size: small; - line-height: 1.5; - padding: 1rem 1.25rem 0 1.25rem; -} - -.cbi-map-descr+fieldset { - margin-top: 1rem; -} - -.cbi-map-descr>abbr { - cursor: help; - text-decoration: underline; -} - -.cbi-section>legend { - display: none !important; -} - -fieldset>fieldset, -.cbi-section>.cbi-section { - margin: 0; - padding: 0; - border: 0; - box-shadow: none; -} - -.cbi-section>h3:first-child, -.panel-title { - font-size: 1.1rem; - line-height: 1; - display: block; - width: 100%; - margin: 0; - margin-bottom: 0; - padding: 0.8755rem 1.25rem; - color: #32325d; - color: var(--gray-dark); - -} - -.cbi-section>h3:first-child, -.cbi-section>h4:first-child, -.cbi-section>p:first-child, -[data-tab-title]>h3:first-child, -[data-tab-title]>h4:first-child, -[data-tab-title]>p:first-child { - padding: 1rem 1.25rem; -} - -.cbi-section p { - padding: 1rem; -} - -.cbi-tblsection { - overflow-x: scroll; -} - -table { - border-spacing: 0; - border-collapse: collapse; -} - -table, -.table { - overflow-y: hidden; - width: 100%; - font-size: 90%; -} - -.table .table-titles th { - background-color: #e9ecef; - background-color: var(--lighter); -} - -table>tbody>tr>td, -table>tbody>tr>th, -table>tfoot>tr>td, -table>tfoot>tr>th, -table>thead>tr>td, -table>thead>tr>th, -.table>.tbody>.tr>.td, -.table>.tbody>.tr>.th, -.table>.tfoot>.tr>.td, -.table>.tfoot>.tr>.th, -.table>.thead>.tr>.td, -.table>.thead>.tr>.th, -.table>.tr>.td.cbi-value-field, -.table>.tr>.th.cbi-section-table-cell { - padding: .5rem; -} - -.container>.cbi-section:first-of-type>.table[width="100%"]>.tr>.td { - padding: .6rem; -} - -.cbi-section-table-cell { - line-height: 1.1; - align-self: flex-end; - flex: 1 1 auto; -} - -tr>td, -tr>th, -.tr>.td, -.tr>.th, -.cbi-section-table-row::before, -#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2) { - border-top: thin solid #ddd; - padding: 1.1em 1.25rem; -} - -#cbi-wireless .td, -#cbi-network .tr:first-child>.td, -.table[width="100%"]>.tr:first-child>.td, -[data-page="admin-network-diagnostics"] .tr>.td, -.tr.table-titles>.th, -.tr.cbi-section-table-titles>.th { - border-top: 0 !important; - background-color: #f6f9fc; - padding: 1.1em 1.25rem; - line-height: 1.3rem; -} - -.table[width="100%"]>.tr:first-child>.td { - margin: auto 0; -} - -.cbi-section-table-row { - margin-bottom: 1rem; - text-align: center !important; - background: #f4f4f4; -} - -.cbi-section-table-row:last-child { - margin-bottom: 0; -} - -.cbi-section-table-row>.cbi-value-field .cbi-dropdown, -.cbi-section-table-row>.cbi-value-field .cbi-input-select, -.cbi-section-table-row>.cbi-value-field .cbi-input-text, -.cbi-section-table-row>.cbi-value-field .cbi-input-password { - width: 100%; -} - -.cbi-section-table-row>.cbi-value-field .cbi-input-text, -.cbi-section-table-row>.cbi-value-field .cbi-input-password { - min-width: 80px; -} - -.cbi-section-table-row>.cbi-value-field [data-dynlist]>input, -.cbi-section-table-row>.cbi-value-field input.cbi-input-password { - width: calc(100% - 1.5rem); -} - -.cbi-section-table-row .td { - text-align: center !important; -} - -.control-group { - display: inline-flex; - width: 100%; - flex-wrap: wrap; - gap: 2px; -} - -div>table>tbody>tr:nth-of-type(2n), -div>.table>.tr:nth-of-type(2n) { - background-color: #f9f9f9; -} - -/* fix multiple table */ -table table, -.table .table, -.cbi-value-field table, -.cbi-value-field .table, -td>table>tbody>tr>td, -.td>.table>.tbody>.tr>.td, -.cbi-value-field>table>tbody>tr>td, -.cbi-value-field>.table>.tbody>.tr>.td { - border: 0; -} - -/* button style */ -.btn, -.cbi-button, -.item::after { - font-size: .8rem; - display: inline-block; - width: auto !important; - padding: 0.45rem .8rem; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - transition: all .2s ease-in-out; - text-align: center; - vertical-align: middle; - white-space: nowrap; - text-decoration: none; - text-transform: uppercase; - color: rgba(0, 0, 0, .87); - border: 0; - border-radius: .2rem; - background-color: #f0f0f0; - background-image: none; - -webkit-appearance: none; - -ms-touch-action: manipulation; - touch-action: manipulation; -} - -.cbi-button-up, -.cbi-button-down { - font-size: 1.2rem; - display: inline-block; - min-width: 0; - padding: .2rem 1rem; - font-size: 0; - color: transparent !important; - background: url(../icon/arrow.svg) no-repeat center; - background-size: 12px 20px; -} - -.cbi-button-up { - transform: scaleY(-1); -} - -.cbi-button:not(select) { - -webkit-appearance: none !important; -} - - -.btn:hover, -.btn:focus, -.btn:active, -.cbi-button:hover, -.cbi-button:focus, -.cbi-button:active, -.item:hover::after, -.item:focus::after, -.item:active::after, -.cbi-page-actions .cbi-button-apply+.cbi-button-save:hover, -.cbi-page-actions .cbi-button-apply+.cbi-button-save:focus, -.cbi-page-actions .cbi-button-apply+.cbi-button-save:active { - text-decoration: none; - outline: 0; -} - -.btn:hover, -.btn:focus, -.cbi-button:hover, -.cbi-button:focus, -.item:hover::after, -.item:focus::after { - box-shadow: 0 0 2px rgba(0, 0, 0, .12), 0 2px 2px rgba(0, 0, 0, .2); -} - -.btn:active, -.cbi-button:active, -.item:active::after { - box-shadow: 0 10px 20px rgba(0, 0, 0, .19), 0 6px 6px rgba(0, 0, 0, .23); -} - -.cbi-button-up:hover, -.cbi-button-up:focus { - box-shadow: 0 0 2px rgba(0, 0, 0, .12), 0 -2px 2px rgba(0, 0, 0, .2); -} - -.cbi-button-up:active { - box-shadow: 0 -10px 20px rgba(0, 0, 0, .19), 0 -6px 6px rgba(0, 0, 0, .23); -} - -.btn:disabled, -.cbi-button:disabled { - cursor: not-allowed; - pointer-events: none; - opacity: .5; - box-shadow: none; -} - -/* gray */ -.alert-message [class="btn"], -.modal div[class="btn"], -.cbi-button-find, -.cbi-button-link, -.cbi-button-up, -.cbi-button-down, -.cbi-button-neutral, -.cbi-button[name="zero"], -.cbi-button[name="restart"], -.cbi-button[onclick="hide_empty(this)"] { - font-weight: bold; - color: #fff; - border: thin solid #8898aa; - background-color: #8898aa; -} - -/* dark blue */ -.btn.primary, -.cbi-page-actions .cbi-button-save, -.cbi-page-actions .cbi-button-apply+.cbi-button-save, -.cbi-button-add, -.cbi-button-save, -.cbi-button-positive, -.cbi-button-link, -.cbi-button[value="Enable"], -.cbi-button[value="Scan"], -.cbi-button[value^="Back"], -.cbi-button-neutral[onclick="handleConfig(event)"] { - font-weight: normal; - color: #fff !important; - border: thin solid #5e72e4; - border: thin solid var(--primary); - background-color: #5e72e4; - background-color: var(--primary); - ; -} - -/* light blue */ -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit, -.cbi-button-edit, -.cbi-button-apply, -.cbi-button-reload, -.cbi-button-action, -.cbi-button[value="Submit"], -.cbi-button[value="Upload"], -.cbi-button[value$="Apply"], -.cbi-button[onclick="addKey(event)"] { - font-weight: normal; - color: #fff !important; - border: thin solid #5e72e4; - border: thin solid var(--primary); - - background-color: #5e72e4; - background-color: var(--primary); -} - -/* red */ -.btn.danger, -.cbi-section-remove>.cbi-button, -.cbi-button-remove, -.cbi-button-reset, -.cbi-button-negative, -.cbi-button[value="Stop"], -.cbi-button[value="Kill"], -.cbi-button[onclick="reboot(this)"], -.cbi-button-neutral[value="Restart"] { - font-weight: normal; - color: #fff; - border: thin solid #f5365c; - border: thin solid var(--red); - background-color: #f5365c; - background-color: var(--red); -} - -/* yellow */ -.btn[value="Dismiss"], -.cbi-button[value="Terminate"], -.cbi-button[value="Reset"], -.cbi-button[value="Disabled"], -.cbi-button[onclick^="iface_reconnect"], -.cbi-button[onclick="handleReset(event)"], -.cbi-button-neutral[value="Disable"] { - font-weight: normal; - color: #fff; - border: thin solid #eea236; - background-color: #f0ad4e; -} - -/* green */ -.cbi-button-success, -.cbi-button-download, -.cbi-button[name="backup"], -.cbi-button[value="Download"], -.cbi-button[value="Save mtdblock"] { - font-weight: normal; - color: #fff; - border: thin solid #4cae4c; - background-color: #5cb85c; -} - -.cbi-page-actions .cbi-button-link:first-child { - float: left; -} - -.a-to-btn { - text-decoration: none; -} - -.cbi-value-field .cbi-button-add { - font-weight: bold; - margin: 4px 0 4px 3px; - padding: 1px 6px; - display: flex; - align-items: center; -} - -.tabs { - margin: 0 0 1rem 0; - padding: 0 1rem; - background-color: #FFFFFF; - border-radius: 0.375rem; - box-shadow: 0 4px 8px rgba(0, 0, 0, .03); - white-space: nowrap; - overflow-x: auto; - - &::-webkit-scrollbar { - width: 1px; - height: 5px; - } - - &::-webkit-scrollbar-thumb { - background-color: #f6f9fc - } - - &::-webkit-scrollbar-track { - background-color: #fff; - } - - li[class~="active"], - li:hover { - cursor: pointer; - border-bottom: 0.18751rem solid #5e72e4; - border-bottom: 0.18751rem solid var(--primary); - color: #5e72e4; - color: var(--primary); - background-color: #dce1fe; - margin-bottom: 0; - border-radius: 0; - - a { - color: #5e72e4; - color: var(--primary); - } - } - - li { - font-size: 0.875rem; - display: inline-block; - padding: 0.875rem 0rem; - border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); - margin: 0; - transition: all 0.2s; - - a { - text-decoration: none; - color: #404040; - padding: 0.5rem 0.8rem; - } - - &:hover { - border-bottom: 0.18751rem solid #5e72e4; - border-bottom: 0.18751rem solid var(--primary); - } - } -} - - - - -.cbi-tabmenu { - color: white; - padding: 0.5rem 1rem 0 1rem; - white-space: nowrap; - overflow-x: auto; - - &::-webkit-scrollbar { - width: 1px; - height: 5px; - } - - &::-webkit-scrollbar-thumb { - background-color: #f6f9fc - } - - &::-webkit-scrollbar-track { - background-color: #fff; - } - - li { - background: #dce3e9; - display: inline-block; - font-size: 0.875rem; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; - padding: 0.5rem 0rem; - border-bottom: 0.18751rem solid rgba(0, 0, 0, 0); - margin: 0 0.2rem; - - a { - text-decoration: none; - color: #404040; - padding: 0.5rem 0.8rem; - } - - &:hover { - cursor: pointer; - border-bottom: 0.18751rem solid #5e72e4; - border-bottom: 0.18751rem solid var(--primary); - color: #5e72e4; - color: var(--primary); - background-color: #dce1fe; - margin-bottom: 0; - - a { - color: #525f7f; - } - } - } - - li[class~="cbi-tab"] { - border-bottom: 0.18751rem solid #5e72e4; - border-bottom: 0.18751rem solid var(--primary); - color: #5e72e4; - color: var(--primary); - background-color: #dce1fe; - margin-bottom: 0; - - a { - color: #5e72e4; - color: var(--primary); - } - } -} - -.cbi-tab-descr { - padding: 0.5rem 1.5rem; -} - -.cbi-section-node { - padding: 1rem 0; -} - -.cbi-section .cbi-section-remove:nth-of-type(2n), -.container>.cbi-section .cbi-section-node:nth-of-type(2n) { - background-color: #f9f9f9; -} - -[data-tab-title] { - overflow: hidden; - height: 0; - opacity: 0; - margin: 0; - padding: 0rem 0rem !important; - - p { - margin-left: 1rem; - margin-bottom: 1rem; - } -} - - - -[data-tab-active="true"] { - overflow: visible; - height: auto; - opacity: 1; - transition: opacity .25s ease-in; - margin: inherit !important; -} - - -.cbi-section[id] .cbi-section-remove:nth-of-type(4n+3), -.cbi-section[id] .cbi-section-node:nth-of-type(4n+4) { - background-color: #f9f9f9; -} - -.cbi-section-node-tabbed { - margin-top: 0; - padding: 0; - border: 0 solid #d4d4d4; - border-radius: 0.375rem; -} - -.cbi-tabcontainer>.cbi-value:nth-of-type(2n) { - background-color: #f9f9f9; -} - -.cbi-value-field, -.cbi-value-description { - line-height: 1.25; - display: table-cell; - - abbr { - color: #32325d; - color: var(--gray-dark); - } -} - -.cbi-value-description { - font-size: small; - padding: .5rem; - opacity: .5; -} - -.cbi-value-title { - display: table-cell; - float: left; - width: 23rem; - padding-top: .25rem; - padding-right: 2rem; - text-align: right; - word-wrap: break-word; -} - -.cbi-value { - display: inline-block; - width: 100%; - padding: .35rem 1rem .2rem 1rem; - line-height: 2.4rem; -} - -.cbi-value ul { - line-height: 1.25; -} - -.cbi-value-field .cbi-dropdown, -.cbi-value-field .cbi-input-select, -.cbi-value input[type="text"], -.cbi-value input[type="password"] { - min-width: 18rem; -} - -.cbi-value input[type="password"] { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: 0; -} - -.cbi-value input[type="password"]+.cbi-button-neutral { - height: 42px; - border-bottom-left-radius: 0; - border-top-left-radius: 0; - margin-left: 0; - border: 0; -} - -#cbi-firewall-zone .cbi-input-select, -#cbi-network-switch_vlan .cbi-input-select { - min-width: 11rem; -} - -#cbi-network-switch_vlan .cbi-input-text { - max-width: 3rem; -} - -.cbi-input-invalid { - color: #f5365c; - border-bottom-color: #f5365c; -} - -.cbi-section-error { - font-weight: bold; - line-height: 1.42857143; - margin: 18px; - padding: 6px; - border: thin solid #f5365c; - border-radius: 3px; - background-color: #fce6e6; -} - -.cbi-section-error ul { - margin: 0 0 0 20px; -} - -.cbi-section-error ul li { - font-weight: bold; - color: #f5365c; -} - -.td[data-title]::before { - font-weight: bold; - display: none; - padding: .25rem 0; - content: attr(data-title) ":\20"; - text-align: left; - white-space: nowrap; -} - -.tr.placeholder .td[data-title]::before { - display: none; -} - -.tr[data-title]::before, -.tr.cbi-section-table-titles.named::before { - font-weight: bold; - display: table-cell; - align-self: center; - flex: 1 1 5%; - padding: .25rem; - content: attr(data-title) "\20"; - text-align: center; - vertical-align: middle; - white-space: normal; - word-wrap: break-word; -} - -.cbi-rowstyle-1 { - background-color: #f9f9f9; -} - -.cbi-rowstyle-2 { - background-color: #eee; -} - -.cbi-rowstyle-2 .cbi-button-up, -.cbi-rowstyle-2 .cbi-button-down, -body:not(.Interfaces) .cbi-rowstyle-2:first-child { - background-color: #fff !important; -} - -.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { - width: auto !important; -} - -.td.cbi-section-actions { - text-align: right !important; - vertical-align: middle; -} - -.td.cbi-section-actions>* { - display: inline-flex; -} - -.td.cbi-section-actions>*>*, -.td.cbi-section-actions>*>form>* { - margin: 0 5px; - display: flex; - align-items: center; -} - -.td.cbi-section-actions>*>form { - display: inline-flex; - margin: 0; -} - -.cbi-checkbox { - margin: 0 0.25rem; -} - -/* lists */ -.cbi-dynlist { - line-height: 1.3; - flex-direction: column; - min-height: 30px; - cursor: text; -} - -.cbi-dynlist>.item { - position: relative; - max-width: 25rem; - pointer-events: none; - color: #8898aa; - outline: 0; -} - -.cbi-dynlist[name="sshkeys"]>.item { - max-width: none; -} - -.cbi-dynlist>.item::after { - position: absolute; - width: 2.2rem !important; - height: calc(100% - 0.5rem - 2px); - right: 0; - bottom: 0; - content: "\00D7"; - pointer-events: auto; - background-color: var(--red); - font-weight: normal; - font-size: 1.2rem; - display: flex; - align-items: center; - justify-content: center; - line-height: 1.5rem; - padding: 0; - margin: 0.25rem 0.1rem 0.25rem 0; - color: #fff; - border: 1px solid #f5365c; - border-radius: 0.25rem; - outline: 0; - background-image: none; - box-shadow: none; - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.cbi-dynlist>.item>span { - white-space: normal; - word-break: break-word; - line-height: 1.5rem; - padding: 0.5rem 0.5rem; - margin: 0.25rem 0.1rem; - color: #8898aa; - border: 1px solid #dee2e6; - border-radius: 0.25rem; - outline: 0; - background-image: none; - box-shadow: none; - display: block; - transition: box-shadow 0.15s ease; - box-sizing: border-box; - min-width: 15rem; -} - -.cbi-dynlist>.add-item { - display: inline-flex; - align-items: center; - width: 100%; - min-width: 16rem; -} - -.cbi-dynlist>.add-item input { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-right: 0; - border-right: none; -} - -.cbi-dynlist>.add-item .cbi-button-add { - font-weight: normal; - font-size: 1.2rem; - display: flex; - align-items: center; - line-height: 1.5rem; - padding: 0.5rem 0.75rem; - margin: 0.25rem 0.1rem 0.25rem 0; - color: #fff; - border: 1px solid #5e72e4; - border: 1px solid var(--primary); - border-radius: 0.25rem; - outline: 0; - background-image: none; - box-shadow: none; - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.cbi-dynlist>.add-item:not([ondrop])>input { - overflow: hidden; - width: 100%; - min-width: 15rem; - white-space: nowrap; - text-overflow: ellipsis; -} - -.cbi-dynlist>.add-item[ondrop]>input { - min-width: 13rem; -} - -.cbi-dynlist, -.cbi-dropdown { - position: relative; - display: inline-flex; - padding: 0.2rem 0.2rem; -} - -.cbi-dropdown[placeholder*="select"] { - max-width: 25rem; - height: auto; - margin-top: -3px; -} - -.cbi-dropdown>ul { - display: flex; - overflow-x: hidden; - overflow-y: auto; - width: 100%; - margin: 0 !important; - padding: 0; - list-style: none; - outline: 0; -} - - -.cbi-dropdown>ul.preview { - display: none; - -} - -.cbi-button-apply>ul.preview { - display: none; - - li { - color: #fff; - } - -} - -.cbi-button-apply>ul:first-child { - li { - color: #fff; - } - -} - -.cbi-dropdown>.open { - flex-basis: 15px; -} - -.cbi-dropdown>.open, -.cbi-dropdown>.more { - font-size: 1rem; - font-weight: 900; - line-height: 2; - display: flex; - flex-direction: column; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; - padding: 0 .25em; - cursor: default; - text-align: center; - outline: 0; -} - -.cbi-dropdown>.more, -.cbi-dropdown>ul>li[placeholder] { - font-weight: bold; - display: none; - color: #777; - text-shadow: 1px 1px 0 #fff; -} - -.cbi-dropdown>ul>li { - display: none; - overflow: hidden; - align-items: center; - align-self: center; - flex-grow: 1; - flex-shrink: 1; - min-height: 20px; - padding: .25em; - white-space: nowrap; - text-overflow: ellipsis; - -} - -.cbi-dropdown>ul>li .hide-open { - display: initial; -} - -.cbi-dropdown>ul>li .hide-close { - display: none; -} - -.cbi-dropdown>ul>li[display]:not([display="0"]) { - border-left: thin solid #ccc; -} - -.cbi-dropdown[empty]>ul { - max-width: 1px; -} - -.cbi-dropdown>ul>li>form { - display: none; - margin: 0; - padding: 0; - pointer-events: none; -} - -.cbi-dropdown>ul>li img { - margin-right: .25em; - vertical-align: middle; -} - -.cbi-dropdown>ul>li>form>input[type="checkbox"] { - height: auto; - margin: 0; -} - -.cbi-dropdown>ul>li input[type="text"] { - height: 20px; -} - -.cbi-dropdown[open]>ul.dropdown { - position: absolute; - z-index: 1100; - display: block; - width: auto; - min-width: 100%; - max-width: none; - max-height: 200px !important; - border: 0 solid #918e8c; - background: #ffffff; - box-shadow: 0 0 4px #918e8c; - border-bottom-left-radius: 0.35rem; - border-bottom-right-radius: 0.35rem; - color: var(--main-menu-color); - margin-left: -0.2rem !important; - - li { - color: #000; - } -} - - -.cbi-dropdown>ul>li[display], -.cbi-dropdown[open]>ul.preview, -.cbi-dropdown[open]>ul.dropdown>li, -.cbi-dropdown[multiple]>ul>li>label, -.cbi-dropdown[multiple][open]>ul.dropdown>li, -.cbi-dropdown[multiple][more]>.more, -.cbi-dropdown[multiple][empty]>.more { - display: flex; - align-items: center; - flex-grow: 1; - -} - -.cbi-dropdown[empty]>ul>li, -.cbi-dropdown[optional][open]>ul.dropdown>li[placeholder], -.cbi-dropdown[multiple][open]>ul.dropdown>li>form { - display: block; -} - -.cbi-dropdown[open]>ul.dropdown>li .hide-open { - display: none; -} - -.cbi-dropdown[open]>ul.dropdown>li .hide-close { - display: initial; -} - -.cbi-dropdown[open]>ul.dropdown>li { - border-bottom: thin solid #ccc; - padding: 0.5rem 0.8rem; -} - -.cbi-dropdown[open]>ul.dropdown>li label { - margin-left: 0.5rem; -} - -.cbi-dropdown[open]>ul.dropdown>li[selected] { - background: #dce1fe; -} - -.cbi-dropdown[open]>ul.dropdown>li.focus { - background: #dce1fe; - outline: none; -} - -.cbi-dropdown[open]>ul.dropdown>li:last-child { - margin-bottom: 0; - border-bottom: 0; -} - -.cbi-dropdown[open]>ul.dropdown>li[unselectable] { - opacity: .7; -} - -.cbi-dropdown[open]>ul.dropdown>li>input.create-item-input:first-child:last-child { - width: 100%; -} - -.cbi-dropdown[disabled] { - pointer-events: none; - opacity: .6; -} - -.cbi-dropdown .zonebadge { - width: 100%; -} - -.cbi-dropdown[open] .zonebadge { - width: auto; -} - -/* progressbar */ -.cbi-progressbar { - position: relative; - min-width: 11rem; - height: 1.5rem; - margin: 0 0; - border: thin solid #999; - background: #eee; - border-radius: 4px; - overflow: hidden; -} - -.cbi-progressbar>div { - width: 0; - height: 100%; - transition: width .25s ease-in; - background: #5bc0de; - background: var(--bar-bg); -} - -.cbi-progressbar::after { - font-family: monospace; - font-size: 1em; - font-weight: bold; - font-size-adjust: .38; - line-height: 1.5rem; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - overflow: hidden; - content: attr(title); - text-align: center; - white-space: pre; - text-overflow: ellipsis; -} - -#modal_overlay { - position: fixed; - z-index: 900; - top: 0; - right: 10000px; - bottom: 0; - left: -10000px; - overflow-y: scroll; - transition: opacity .125s ease-in; - opacity: 0; - background: rgba(0, 0, 0, .7); - -webkit-overflow-scrolling: touch; -} - -.modal { - display: flex; - align-items: center; - flex-wrap: wrap; - width: 90%; - min-width: 270px; - max-width: 600px; - min-height: 32px; - margin: 5em auto; - padding: 1em; - border-radius: 3px !important; - background: #fff; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); -} - -.modal>* { - line-height: normal; - flex-basis: 100%; - margin-bottom: .5em; - max-width: 100%; -} - -.modal>pre, -.modal>textarea { - font-size: 1rem; - font-size-adjust: .35; - overflow: auto; - margin-bottom: .5em; - padding: 8.5px; - cursor: auto; - white-space: pre-wrap; - color: #eee; - outline: 0; - background-color: #101010; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); -} - -.modal>h4 { - margin: .5em 0; -} - -.modal ul { - margin-left: 2.2em; -} - -.modal li { - list-style-type: square; - color: #808080; -} - -.modal p { - - word-break: break-word; -} - -.modal .label { - font-size: .6rem; - font-weight: normal; - padding: .1rem .3rem; - padding-bottom: 0; - cursor: default; - border-radius: 0; -} - -.modal .label.warning { - background-color: #f0ad4e !important; -} - -.modal .btn { - padding: 0.45rem 0.8rem; -} - -.modal.cbi-modal { - max-width: 90%; - max-height: none; -} - -body.modal-overlay-active { - overflow: hidden; - height: 100vh; -} - -body.modal-overlay-active #modal_overlay { - right: 0; - left: 0; - opacity: 1; -} - - - -.spinning { - position: relative; - padding-left: 32px !important; -} - -.spinning::before { - position: absolute; - top: 0; - bottom: 0; - left: .2em; - width: 32px; - content: ""; - background: url(/luci-static/resources/icons/loading.gif) no-repeat center; - background-size: 16px; -} - -/* luci */ -.hidden { - display: none; -} - -.left, -.left::before { - text-align: left !important; -} - -.right, -.right::before { - text-align: right !important; -} - -.center, -.center::before { - text-align: center !important; -} - -.top { - align-self: flex-start !important; - vertical-align: top !important; -} - -.bottom { - align-self: flex-end !important; - vertical-align: bottom !important; -} - -.inline { - display: inline; -} - -.cbi-page-actions { - padding-top: 1rem; - text-align: right; - justify-content: flex-end; -} - -.cbi-page-actions>form[method="post"] { - display: inline-block; -} - -.th[data-type="button"], -.td[data-type="button"], -.th[data-type="fvalue"], -.td[data-type="fvalue"] { - flex: 1 1 2em; - text-align: center; -} - -.ifacebadge { - display: inline-flex; - gap: .2rem; - padding: .5rem .8rem; - border-bottom: thin solid #ccc; - background: #eee; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); - border-radius: 4px; -} - -td>.ifacebadge, -.td>.ifacebadge { - font-size: .8rem; - background-color: #f0f0f0; -} - -.ifacebadge>em, -.ifacebadge>img { - display: inline-block; - align-self: flex-start; -} - -.ifacebadge>img+img { - margin: 0 .2rem 0 0; -} - -.network-status-table { - display: flex; - flex-wrap: wrap; -} - -.network-status-table .ifacebox { - flex-grow: 1; - border-radius: 4px; - overflow: hidden; - margin: 0 1.25rem 1rem 1.25rem; -} - -.network-status-table .ifacebox-body { - display: flex; - flex-direction: column; - height: 100%; - gap: 0.5em; -} - -.network-status-table .ifacebox-body>span { - flex: 10 10 auto; - height: 100%; -} - -.network-status-table .ifacebox-body>div { - display: flex; - flex-wrap: wrap; - gap: .5rem; -} - -.network-status-table .ifacebox-body .ifacebadge { - align-items: center; - flex: 1 1 auto; - min-width: 220px; - padding: .5em; - background-color: #fff; - - >span { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } -} - -/* textarea */ -.cbi-input-textarea { - font-family: monospace; - width: 100%; - font-size: 0.875rem; - min-height: 14rem; - padding: .8rem; - color: #000; -} - -#syslog { - font-size: small; - line-height: 1.25; - overflow-y: hidden; - width: 100%; - min-height: 15rem; - padding: 1rem; - resize: none; - color: #242424; - border: 0; - border-radius: 0.375rem; - background-color: #ffffff; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); -} - -#syslog:focus { - outline: 0; -} - -/* config changes */ -.uci-change-list { - font-family: monospace; -} - -.uci-change-list ins, -.uci-change-legend-label ins { - display: block; - padding: 2px; - text-decoration: none; - border: thin solid #0f0; - background-color: #cfc; -} - -.uci-change-list del, -.uci-change-legend-label del { - font-style: normal; - display: block; - padding: 2px; - text-decoration: none; - border: thin solid #f00; - background-color: #fcc; -} - -.uci-change-list var, -.uci-change-legend-label var { - font-style: normal; - display: block; - padding: 2px; - text-decoration: none; - border: thin solid #ccc; - background-color: #eee; -} - -.uci-change-list var ins, -.uci-change-list var del { - font-style: normal; - padding: 0; - white-space: pre; - border: 0; -} - -.uci-change-legend { - padding: 5px; -} - -.uci-change-legend-label { - float: left; - width: 150px; -} - -.uci-change-legend-label>ins, -.uci-change-legend-label>del, -.uci-change-legend-label>var { - display: block; - float: left; - width: 10px; - height: 10px; - margin-right: 4px; -} - -.uci-change-legend-label var ins, -.uci-change-legend-label var del { - line-height: .4; - border: 0; -} - -.uci-change-list var, -.uci-change-list del, -.uci-change-list ins { - padding: .5rem; -} - -/* other fix */ -#iwsvg, -#iwsvg2, -#bwsvg { - border: thin solid #d4d4d4 !important; -} - -#iwsvg, -[data-page="admin-status-realtime-bandwidth"] #bwsvg { - border-top: 0 !important; -} - -.ifacebox { - line-height: 1.25; - display: inline-flex; - overflow: hidden; - flex-direction: column; - border-radius: 4px; - min-width: 100px; - border-bottom: thin solid #ccc; - background-color: #f9f9f9; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .4), 0 1px 2px rgba(0, 0, 0, .2); -} - -.ifacebox-head { - padding: .25em; - background: #eee; -} - -.ifacebox-head.active { - background: #5e72e4; - background: var(--primary); - - * { - color: #fff; - color: var(--white); - } - -} - -.ifacebox-body { - padding: 0.875rem 1rem; - line-height: 1.6em; -} - -.cbi-image-button { - margin-left: .5rem; -} - -.zonebadge { - display: inline-block; - padding: .2rem .5rem; - border-radius: 4px; -} - -.zonebadge .ifacebadge { - margin: .1rem .2rem; - padding: .2rem .3rem; - border: thin solid #6c6c6c; -} - -.zonebadge>input[type="text"] { - min-width: 10rem; - margin-top: .3rem; - padding: .16rem 1rem; -} - -.zonebadge>em, -.zonebadge>strong { - display: inline-block; - margin: 0 .2rem; -} - -.cbi-value-field .cbi-input-checkbox, -.cbi-value-field .cbi-input-radio { - margin-top: .1rem; -} - -.cbi-value-field>ul>li { - display: flex; -} - -.cbi-value-field>ul>li>label { - margin-top: .5rem; -} - -.cbi-value-field>ul>li .ifacebadge { - margin-top: -.5rem; - margin-left: .4rem; - background-color: #eee; -} - -.cbi-section-table-row>.cbi-value-field .cbi-dropdown { - min-width: 3rem; -} - -.cbi-section-create { - display: inline-flex; - align-items: center; - margin: 0.25rem 1.25rem; -} - -.cbi-section-create>* { - margin: .5rem 0; -} - -.cbi-section-remove { - padding: .5rem; -} - -div.cbi-value var, -td.cbi-value-field var, -.td.cbi-value-field var { - font-style: italic; - color: #0069d6; -} - -.cbi-optionals { - padding: 1rem 1rem 0 1rem; - border-top: thin solid #ccc; -} - -.cbi-dropdown-container { - position: relative; -} - -.cbi-tooltip-container, -span[data-tooltip], -span[data-tooltip] .label { - cursor: help !important; -} - -.cbi-tooltip { - position: absolute; - z-index: 1000; - left: -1000px; - padding: 2px 5px; - transition: opacity .25s ease-out; - white-space: pre; - pointer-events: none; - opacity: 0; - border-radius: 3px; - background: #fff; - box-shadow: 0 0 2px #444; -} - -.cbi-tooltip-container:hover .cbi-tooltip { - left: auto; - transition: opacity .25s ease-in; - opacity: 1; -} - -.zonebadge .cbi-tooltip { - margin: -1.5rem 0 0 -.5rem; - padding: .25rem; - background: inherit; -} - -.zonebadge-empty { - color: #404040; - background: repeating-linear-gradient(45deg, rgba(204, 204, 204, .5), rgba(204, 204, 204, .5) 5px, rgba(255, 255, 255, .5) 5px, rgba(255, 255, 255, .5) 10px); -} - -.zone-forwards { - display: flex; - min-width: 10rem; -} - -.zone-forwards>* { - flex: 1 1 45%; -} - -.zone-forwards>span { - flex-basis: 10%; - padding: 0 .25rem; - text-align: center; -} - -.zone-forwards .zone-src, -.zone-forwards .zone-dest { - display: flex; - flex-direction: column; -} - -.label { - font-size: .8rem; - font-weight: bold; - padding: .3rem .8rem; - white-space: nowrap; - text-decoration: none; - text-transform: uppercase; - color: #fff !important; - border-radius: 3px; - background-color: #bfbfbf; - text-shadow: none; -} - -label>input[type="checkbox"], -label>input[type="radio"] { - position: relative; - top: .4rem; - right: .2rem; - margin: 0; - vertical-align: bottom; -} - -label[data-index][data-depends] { - padding-right: 2em; -} - -.showSide { - display: none; -} - -.darkMask { - position: fixed; - z-index: 99; - display: none; - width: 100%; - height: 100%; - content: ""; - top: 0; - background-color: rgba(0, 0, 0, .56); - transition: all 0.2s; - - &.active { - display: block; - } -} - -/* diagnostics */ -#diag-rc-output>pre, -#command-rc-output>pre, -[data-page="admin-services-wol"] .notice code { - font-size: 1.2rem; - font-size-adjust: .35; - line-height: normal; - display: block; - overflow-y: hidden; - width: 100%; - padding: 8.5px; - white-space: pre; - color: #eee; - background-color: #101010; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); -} - -[data-page="admin-network-diagnostics"] .table { - box-shadow: none; -} - -input[name="ping"], -input[name="traceroute"], -input[name="nslookup"] { - width: 80%; -} - - - -/* fix status */ -.node-status-overview>.main fieldset:nth-child(4) .td:nth-child(2), -.node-status-processes>.main .table .tr .td:nth-child(3) { - white-space: normal; -} - -/* fix system reboot */ -[data-page="admin-system-reboot"] p { - padding-left: 1.5rem; -} - -[data-page="admin-system-reboot"] .cbi-button { - background: #fb6340 !important; -} - -[data-page="admin-system-reboot"] p>span { - position: relative; - top: .1rem; - left: 1rem; -} - -[data-page="admin-vpn-passwall"] h4 { - background: transparent; -} - -/* samba */ -#cbi-samba [data-tab="template"] .cbi-value-field { - display: block; -} - -#cbi-samba [data-tab="template"] .cbi-value-title { - width: auto; - padding-bottom: .6rem; -} - -/* admin-system-admin-password */ -[data-page="admin-system-admin"] .cbi-map h2, -[data-page="admin-system-admin-password"] .cbi-map h2, -[data-page="admin-system-admin"] .cbi-map .cbi-map-descr, -[data-page="admin-system-admin-password"] .cbi-map .cbi-map-descr { - margin-left: 0; - color: #32325d; - color: var(--gray-dark); -} - - -/* software */ -[data-page="admin-system-opkg"] h2 { - margin-left: 0; - color: #32325d; - color: var(--gray-dark); -} - -.controls { - margin: .5em 1rem 1em 1rem !important; -} - -.controls>*>.btn:not([aria-label$="page"]) { - flex-grow: initial !important; - margin-top: .25rem; -} - -.controls>#pager>.btn[aria-label$="page"] { - font-size: 1.4rem; - font-weight: bold; -} - -.controls>*>label { - margin-bottom: .2rem; -} - -[data-page="admin-system-opkg"] div.btn { - line-height: 3; - display: inline; - padding: .3rem .6rem; -} - -[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear), -[data-page="admin-system-opkg"] #maincontent>.container { - margin-top: 2rem; - padding-top: .1rem; -} - -[data-page="admin-system-opkg"] #maincontent>.container { - margin: 0 1.25rem 1rem 1.25rem; - margin-bottom: 1rem; -} - -.td.version, -.td.size { - white-space: normal !important; - word-break: break-word; -} - -.cbi-tabmenu+.cbi-section { - margin-top: 0; -} - -/* admin-system-crontab*/ -[data-page="admin-system-crontab"] #view p { - margin-bottom: 1rem; -} - -/*admin-system-flash*/ - -[data-page="admin-system-flash"] { - .cbi-value { - padding: 0; - } - - .cbi-section { - .cbi-section { - margin-top: 0; - } - } - - .cbi-map-tabbed { - border-radius: 0.375rem; - } - - legend { - display: block !important; - font-size: 1.2rem; - width: 100%; - display: block; - margin-bottom: 0; - padding: 1rem 0 1rem 1.5rem; - border-bottom: 1px solid rgba(0, 0, 0, .05); - line-height: 1.5; - margin-bottom: 0rem; - letter-spacing: 0.1rem; - color: #32325d; - font-weight: bold; - } - - .cbi-section-descr { - font-weight: 600; - padding: 1rem 0 1rem 1.5rem; - color: #525f7f; - } - - .modal { - - - label>input[type="checkbox"] { - top: -0.35rem; - } - - .btn { - white-space: normal !important; - } - } -} - -/* wireless overview */ -#cbi-wireless>#wifi_assoclist_table>.tr { - box-shadow: inset 1px -1px 0 #ddd, inset -1px -1px 0 #ddd; -} - -#cbi-wireless>#wifi_assoclist_table>.tr.placeholder>.td { - right: 33px; - bottom: 33px; - left: 33px; - border-top: thin solid #ddd !important; -} - -#cbi-wireless>#wifi_assoclist_table>.tr.table-titles { - box-shadow: inset 1px 0 0 #ddd, inset -1px 0 0 #ddd; -} - -#cbi-wireless>#wifi_assoclist_table>.tr.table-titles>.th { - border-bottom: thin solid #ddd; - box-shadow: 0 -1px 0 0 #ddd; -} - -#wifi_assoclist_table>.tr>.td[data-title="RX Rate / TX Rate"] { - width: 23rem; -} - -[data-page="admin-network-dhcp"] .cbi-value { - padding: 0; - -} - -[data-page="admin-network-dhcp"] [data-tab-active="true"] { - padding: 1rem 0 !important; -} - -/* firewall */ -#iptables { - margin: 0; -} - -.Firewall form { - margin: 2rem 2rem 0 0; - padding: 0; - box-shadow: none; -} - -#cbi-firewall-redirect table *, -#cbi-network-switch_vlan table *, -#cbi-firewall-zone table * { - font-size: small; -} - -#cbi-firewall-redirect table input[type="text"], -#cbi-network-switch_vlan table input[type="text"], -#cbi-firewall-zone table input[type="text"] { - width: 5rem; -} - -#cbi-firewall-redirect table select, -#cbi-network-switch_vlan table select, -#cbi-firewall-zone table select { - min-width: 3.5rem; -} - -#cbi-network-switch_vlan .th, -#cbi-network-switch_vlan .td { - flex-basis: 12%; -} - -#cbi-firewall-zone .table, -#cbi-network-switch_vlan .table { - display: block; -} - -#cbi-firewall-zone .td, -#cbi-network-switch_vlan .td { - width: 100%; -} - -[data-page="admin-network-firewall-custom"] #view p, -[data-page="admin-status-routes"] #view p { - padding: 0 1.5rem; - margin-bottom: 1rem; - - textarea { - padding: 1rem; - border-radius: 0.375rem; - } -} - -/* applyreboot fix */ -#applyreboot-container { - margin: 2rem; -} - -#applyreboot-section { - line-height: 300%; - margin: 2rem; -} - -/* openvpn bug fix */ -.OpenVPN a { - line-height: initial !important; -} - -/* custom commands */ -.commandbox { - width: 24% !important; - margin: 10px 0 0 10px !important; - padding: .5rem 1rem; - border-bottom: thin solid #ccc; - background: #eee; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); -} - -.commandbox h3 { - line-height: normal !important; - overflow: hidden; - margin: 6px 0 !important; - white-space: nowrap; - text-overflow: ellipsis; -} - -.commandbox div { - left: auto !important; -} - -.commandbox code { - position: absolute; - overflow: hidden; - max-width: 60%; - margin-left: 4px; - padding: 2px 3px; - white-space: nowrap; - text-overflow: ellipsis; -} - -.commandbox code:hover { - overflow-y: auto; - max-height: 50px; - white-space: normal; -} - -.commandbox p:first-of-type { - margin-top: -6px; -} - -.commandbox p:nth-of-type(2) { - margin-top: 2px; -} - -[data-page^="admin-system-commands"] .panel-title, -[data-page^="command-cfg"] .mobile-hide, -[data-page^="command-cfg"] .showSide { - display: none; -} - -#command-rc-output .alert-message { - line-height: 1.42857143; - position: absolute; - top: 40px; - right: 32px; - max-width: 40%; - margin: 0; - animation: anim-fade-in 1.5s forwards; - word-break: break-word; - opacity: 0; -} - -@keyframes anim-fade-in { - 100% { - opacity: 1; - } -} - -/* other fix */ -input[type="checkbox"] { - appearance: none !important; - -webkit-appearance: none !important; - border: 1px solid #dee2e6; - - width: 16px !important; - height: 16px !important; - padding: 0; - cursor: pointer; - transition: all 0.2s; - margin: 1rem 0 0 0; -} - -input[type="checkbox"]:checked { - border: 1px solid #5e72e4; - border: 1px solid var(--primary); - background-image: url('data:image/svg+xml,%3csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 8 8\'%3e%3cpath fill=\'%23fff\' d=\'M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z\'/%3e%3c/svg%3e') !important; - background-color: #5e72e4; - background-color: var(--primary); - background-size: 70%; - background-repeat: no-repeat; - background-position: center; -} - -.fb-container .cbi-button { - height: auto !important; -} - -#cbi-usb_printer-printer em { - display: block; - padding: 1rem; - text-align: center; -} - -pre.command-output { - padding: 1.5rem; -} - -[data-page="admin-nlbw-display"] .cbi-section[data-tab="export"] { - padding: 1.5rem !important; -} - -[data-page="admin-nlbw-backup"] form { - padding-left: 1.5rem; -} - -[data-page="admin-status-iptables"] .right { - margin-bottom: 0 !important; -} - -/* IE hacks */ -@media all and (-ms-high-contrast: none) { - .main>.main-left>.nav>.slide>.menu::before { - top: 30.25%; - } - - .main>.main-left>.nav>li:last-child::before { - top: 20%; - } - - .showSide::before { - top: -12px; - } -} - -@media screen and (max-width: 1600px) { - header>.fill>.container>#logo { - margin: 0 2.5rem 0 .5rem; - } - - .main-left { - width: calc(0% + 13rem); - } - - .main-right { - width: calc(100% - 13rem); - } - - .btn:not(button), - .cbi-button { - font-size: .8rem; - } - - .label { - padding: .2rem .6rem; - } - - - .cbi-value-title { - width: 15rem; - padding-right: .6rem; - } - - .cbi-value-field .cbi-dropdown, - .cbi-value-field .cbi-input-select, - .cbi-value input[type="text"], - .cbi-value input[type="password"] { - min-width: 18rem; - } - - #cbi-firewall-zone .cbi-input-select { - min-width: 9rem; - } - - .cbi-input-textarea { - font-size: small; - } - - .node-admin-status>.main fieldset li>a { - padding: .3rem .6rem; - } -} - -@media screen and (max-width: 1366px) { - - - header>.fill>.container { - - cursor: default; - } - - - - .main-left { - width: calc(0% + 13rem); - } - - .main-right { - width: calc(100% - 13rem); - } - - - .tabs>li>a, - .cbi-tabmenu>li>a { - padding: .2rem .8rem; - } - - .panel-title { - font-size: 1.1rem; - padding-bottom: 1rem; - } - - table { - font-size: .7rem !important; - width: 100% !important; - } - - .table .cbi-input-text { - width: 100%; - } - - .cbi-value-field .cbi-dropdown, - .cbi-value-field .cbi-input-select, - .cbi-value input[type="text"], - .cbi-value input[type="password"] { - min-width: 16rem; - } - - #cbi-firewall-zone .cbi-input-select { - min-width: 4rem; - } - - .main>.main-left>.nav>li, - .main>.main-left>.nav>li>a, - .main .main-left .nav>li>a:first-child, - .main>.main-left>.nav>.slide>.menu, - .main>.main-left>.nav>li>[data-title="Logout"] { - font-size: .9rem; - } - - .main>.main-left>.nav>.slide>.slide-menu>li>a { - font-size: .7rem; - } - - #modal_overlay { - top: 0rem; - } - - [data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table) { - display: block; - } - - [data-page="admin-network-firewall-forwards"] .table:not(.cbi-section-table), - [data-page="admin-network-firewall-rules"] .table:not(.cbi-section-table), - [data-page="admin-network-hosts"] .table, - [data-page="admin-network-routes"] .table { - overflow-y: visible; - } - - .commandbox { - width: 32% !important; - } - - .btn:not(button), - .cbi-button { - font-size: 0.8rem; - - } -} - -@media screen and (max-width: 1152px) { - header>.fill>.container>#logo { - display: none; - } - - header>.fill>.container>.brand { - position: relative; - } - - html, - .main { - overflow-y: visible; - } - - .main>.loading>span { - top: 25%; - } - - .main-left { - width: calc(0% + 13rem); - } - - .main-right { - width: calc(100% - 13rem); - } - - - - body:not(.logged-in) .showSide { - visibility: hidden; - width: 0; - margin: 0; - } - - .node-main-login>.main .cbi-value-title { - text-align: left; - } - - .cbi-value-title { - width: 12rem; - padding-right: 1rem; - } - - .cbi-value-field .cbi-dropdown, - .cbi-value-field .cbi-input-select, - .cbi-value input[type="text"] { - width: 16rem; - min-width: 16rem; - } - - /*.cbi-value input[type="password"],*/ - .cbi-value input[name^="pw"], - .cbi-value input[data-update="change"]:nth-child(2) { - width: 13rem !important; - min-width: 13rem; - } - - #diag-rc-output>pre, - #command-rc-output>pre, - [data-page="admin-services-wol"] .notice code { - font-size: 1rem; - } - - .table { - display: block; - } - - .Interfaces .table { - overflow-x: hidden; - } - - #packages.table { - display: grid; - } - - .tr { - display: flex; - flex-direction: row; - flex-wrap: wrap; - } - - .Overview .table[width="100%"]>.tr { - flex-wrap: nowrap; - } - - .tr.placeholder { - border-bottom: thin solid #ddd; - } - - .tr.placeholder>.td, - #cbi-firewall .tr>.td, - #cbi-network .tr:nth-child(2)>.td, - .cbi-section #wifi_assoclist_table .tr>.td { - border-top: 0; - } - - .th, - .td { - display: inline-block; - align-self: flex-start; - flex: 2 2 10%; - text-overflow: ellipsis; - word-wrap: break-word; - } - - .td select, - .td input[type="text"] { - width: 100%; - word-wrap: normal; - } - - .td [data-dynlist]>input, - .td input.cbi-input-password { - width: calc(100% - 1.5rem); - } - - .td[data-type="button"], - .td[data-type="fvalue"] { - flex: 1 1 12.5%; - text-align: left; - } - - .th.cbi-value-field, - .td.cbi-value-field, - .th.cbi-section-table-cell, - .td.cbi-section-table-cell { - flex-basis: auto; - padding-top: 1rem; - } - - .cbi-section-table-row { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: space-between; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); - } - - .td.cbi-value-field, - .cbi-section-table-cell { - display: inline-block; - flex: 10 10 auto; - flex-basis: 50%; - text-align: center; - } - - .td.cbi-section-actions { - vertical-align: bottom; - } - - .tr.table-titles, - .tr.cbi-section-table-titles, - .tr.cbi-section-table-descr { - display: none; - } - - .tr[data-title]::before, - .tr.cbi-section-table-titles.named::before { - font-size: .9rem; - display: block; - flex: 1 1 100%; - border-bottom: thin solid rgba(0, 0, 0, .26); - background: #e9ecef; - } - - .td[data-title], - [data-page^="admin-status-realtime"] .td[id] { - text-align: left; - } - - .td[data-title]::before { - display: block; - } - - .cbi-button+.cbi-button { - margin-left: 0; - } - - .td.cbi-section-actions>*>*, - .td.cbi-section-actions>*>form>* { - margin: 2.1px 3px; - } - - .Firewall form { - position: static !important; - margin: 0 0 2rem 0; - padding: 2rem; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); - } - - .Firewall form input { - width: 100% !important; - margin: 0; - margin-top: 1rem; - } - - .Firewall .center, - .Firewall .center::before { - text-align: left !important; - } - - .commandbox { - width: 100% !important; - margin-left: 0 !important; - } - - .btn:not(button), - .cbi-button { - font-size: 0.8rem; - } -} - - - - -@media screen and (max-width: 768px) { - body { - font-size: .8rem; - } - - .cbi-progressbar::after { - font-size: .6rem; - } - - - - .main-left { - position: fixed; - z-index: 100; - width: 0; - - &.active { - width: 13rem; - } - } - - .main-right { - width: 100%; - - &.active { - overflow-y: hidden; - } - } - - .darkMask.active { - display: block; - } - - .showSide { - padding: 0.1rem; - position: relative; - z-index: 99; - display: inline-block !important; - - &::before { - font-family: 'argon' !important; - font-style: normal !important; - font-weight: normal !important; - font-variant: normal !important; - text-transform: none !important; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - content: "\e20e"; - font-size: 1.7rem; - } - } - - - header>.fill>.container>.flex1>.brand { - display: inline-block; - } - - - - .main>.main-left>.nav>.slide>.slide-menu>li>a { - font-size: 0.8rem; - } - - - -} - -@media screen and (max-width: 600px) { - .mobile-hide { - display: none; - } - - #maincontent>.container { - margin: 0 1rem 1rem 1rem; - } - - .cbi-value-title { - text-align: left; - } - - [data-page="admin-system-flash"] legend { - padding: 1rem 0 1rem 1rem; - - } - - [data-page="admin-system-flash"] .cbi-section-descr { - padding: 1rem 0 1rem 1rem; - - } - - [data-page="admin-system-flash"] .cbi-value { - padding: 0 1rem; - } - - [data-page="admin-network-dhcp"] [data-tab-active="true"] { - padding: 1rem 1rem !important; - } - - .cbi-dynlist p { - padding: 0.5rem 1rem; - } - - body { - overflow-x: hidden; - } - - .node-main-login .main .main-right #maincontent .container .cbi-map .cbi-section .cbi-section-node .cbi-value .cbi-value-field { - width: 16rem; - } - - .node-main-login footer { - display: none; - } - - .tabs, - .cbi-tabmenu { - &::-webkit-scrollbar { - width: 0px; - height: 0px; - } - } - - .cbi-value-field, - .cbi-value-description { - display: block !important; - padding-left: 0 !important; - padding-right: 0 !important; - } - - [data-page="admin-system-admin-password"] .cbi-value-field { - display: table-cell !important; - } - - .modal.cbi-modal { - max-width: 100%; - max-height: none; - } - - .modal { - display: flex; - align-items: center; - flex-wrap: wrap; - width: 100%; - min-width: 270px; - max-width: 600px; - min-height: 32px; - margin: 5em auto; - padding: 1em; - border-radius: 3px !important; - background: #fff; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 2px 0 rgba(0, 0, 0, 0.12); - } - - .cbi-dropdown[open]>ul.dropdown { - left: 0.2rem !important; - right: 0 !important; - margin-bottom: 1rem; - } - - .login-page .login-container footer { - display: none; - } -} - - - -@media screen and (min-width: 600px) { - ::-webkit-scrollbar { - width: 10px; - height: 10px; - } - - ::-webkit-scrollbar, - ::-webkit-scrollbar-corner { - background: transparent; - } - - ::-webkit-scrollbar-thumb { - background: #9e9e9e; - } - - ::-webkit-scrollbar-thumb:hover { - background: #757575; - } - - ::-webkit-scrollbar-thumb:active { - background: #424242; - } - - - - -} - - - -@media screen and (max-width: 480px) { - .mobile-hide { - display: none; - } - - .login-page .login-container { - margin-left: 0rem !important; - width: 100%; - - .login-form { - .form-login { - .input-group { - &::before { - color: #525461; - } - - input { - color: #525461; - border-bottom: white 1px solid; - border-bottom: var(--white) 1px solid; - border-radius: 0; - } - - } - } - } - - } - - -} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/dark.less b/luci-theme-argon/htdocs/luci-static/argon/less/dark.less deleted file mode 100644 index 1e0568ad6..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/less/dark.less +++ /dev/null @@ -1,830 +0,0 @@ -// compress: true , sourceMap: false -/** - * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template - * - * luci-theme-argon - * Copyright 2020 Jerryk - * - * Have a bug? Please create an issue here on GitHub! - * https://github.com/jerrykuku/luci-theme-argon/issues - * - * luci-theme-bootstrap: - * Copyright 2008 Steven Barth - * Copyright 2008 Jo-Philipp Wich - * Copyright 2012 David Menting - * - * MUI: - * https://github.com/muicss/mui - * - * luci-theme-material: - * https://github.com/LuttyYang/luci-theme-material/ - * - * Agron Theme - * https://demos.creative-tim.com/argon-dashboard/index.html - * - * Login background - * https://unsplash.com/ - * - * Licensed to the public under the Apache License 2.0 - */ - -body { - background: #1e1e1e; - color: #cccccc; -} - -.login-page .login-container { - - .login-form { - background-color: #1e1e1e; - -webkit-backdrop-filter: blur(var(--blur-radius-dark)); - backdrop-filter: blur(var(--blur-radius-dark)); - background-color: rgba(0, 0, 0, var(--blur-opacity-dark)); - - .brand { - color: #adb5bd; - } - - .form-login { - .input-group { - &::before { - color: #adb5bd; - } - - input { - background-color: transparent !important; - color: #adb5bd; - border-bottom: #adb5bd 1px solid !important; - border-radius: 0 !important; - border-top: none !important; - border-left: none !important; - border-right: none !important; - box-shadow: none; - } - - } - - .cbi-button-apply { - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; - - &:hover, - &:focus { - opacity: 0.9; - } - } - } - } - -} - -header::after { - background-color: #1e1e1e !important; -} - - -.main { - .main-left { - - background-color: #333333 !important; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .15); - - .sidenav-header .brand { - color: #ccc; - } - - .nav { - .slide { - .slide-menu { - .active { - a { - color: #cccccc; - - &::after { - background-color: #cccccc !important; - } - } - } - - li { - a { - color: #cccccc; - } - - a:hover { - background: none !important; - } - } - } - - .menu.active { - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; - color: #cccccc !important; - - a::after { - background-color: #cccccc !important; - } - } - } - - li { - a { - color: #cccccc !important; - } - - a:hover { - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; - color: #cccccc !important; - } - } - } - - - &::-webkit-scrollbar-thumb { - background-color: #252526 !important; - } - - &::-webkit-scrollbar-track { - background-color: #333; - } - } - - .main-right { - background-color: #1e1e1e; - } -} - -h2 { - color: #ccc; - background: #333333; -} - -h3 { - color: #ccc; - border-bottom: 0; - background: #333333; -} - -a:-webkit-any-link { - color: -webkit-link; - cursor: pointer; - color: #483d8b; - color: var(--dark-primary); -} - - -input:-webkit-autofill { - background-color: #3c3c3c !important; -} - -.cbi-value-field .cbi-input-apply, -.cbi-button-apply, -.cbi-button-edit { - color: #fff !important; - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; - border-color: #483d8b !important; - border-color: var(--dark-primary) !important; -} - - -.cbi-section em { - color: #ccc; -} - -header.bg-primary { - background-color: #1e1e1e !important; -} - -.cbi-map-descr { - color: #ccc; -} - -.cbi-section { - background: none; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35) -} - -.panel-title { - color: #ccc; - background-color: #333333; - border-bottom: 0px; -} - -div>table>tbody>tr:nth-of-type(2n), -div>.table>.tr:nth-of-type(2n) { - background-color: #252526; -} - -table>tbody>tr>td, -table>tfoot>tr>td, -table>thead>tr>td { - color: #ccc; -} - -fieldset>table>tbody>tr:nth-of-type(2n) { - background-color: #252526; -} - -table>tbody>tr>td, -table>tfoot>tr>td, -table>thead>tr>td { - border-top: 1px solid #252526; -} - -#swaptotal>div>div, -#swapfree>div>div, -#memfree>div>div, -#membuff>div>div, -#conns>div>div, -#memtotal>div>div { - background-color: #32325d !important; -} - -#swaptotal>div>div>div>small, -#swapfree>div>div>div>small, -#memfree>div>div>div>small, -#membuff>div>div>div>small, -#conns>div>div>div>small, -#memtotal>div>div>div>small { - - color: #ccc !important; -} - -.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last { - line-height: 1.8em; - - div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] { - border: 1px solid #999999 !important; - background-color: transparent !important; - - div { - background-color: #32325d !important; - } - } - -} - -table>tbody>tr>th, -table>tfoot>tr>th, -table>thead>tr>th { - - background-color: #252526; - border-bottom: black 1px solid !important; -} - -tr>td, -tr>th, -.tr>.td, -.tr>.th, -.cbi-section-table-row::before, -#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2) { - border-top: 0; -} - -.cbi-rowstyle-2 { - background-color: #1e1e1e; -} - -.cbi-rowstyle-1 { - background-color: #252526; -} - -.cbi-rowstyle-2 .cbi-button-up, -.cbi-rowstyle-2 .cbi-button-down, -body:not(.Interfaces) .cbi-rowstyle-2:first-child { - background-color: rgb(102, 102, 102) !important; -} - -.cbi-section>h3:first-child, -.panel-title, -h3 { - color: #ccc; - border-bottom: 0; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -h4 { - background-color: #1e1e1f; -} - -.cbi-progressbar { - position: relative; - min-width: 170px; - height: 20px; - margin: 6px 0; - border: thin solid #999; - background: transparent; - border-radius: 0.2rem; - overflow: hidden; - - div { - background-color: #32325d !important; - } -} - -.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { - background-color: #1e1e1f; -} - -.cbi-button { - color: #ccc !important; - background-color: #483d8b; - background-color: var(--dark-primary); -} - -.cbi-section-node { - background: none; - border-radius: 0 0 .375rem .375rem; - padding: 0rem; -} - -abbr { - color: #5e72e4; -} - -div>table>tbody>tr:nth-of-type(2n), -div>.table>.tbody>.tr:nth-of-type(2n) { - background-color: #252526; -} - -#content_syslog { - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35) -} - -#syslog { - color: #ccc; - background-color: #1e1e1e; -} - -#iwsvg, -#iwsvg2, -#bwsvg { - overflow: hidden; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); - background-color: #1e1e1e !important; -} - -.tabs { - background-color: #252526; -} - -.tabs>li[class~="active"]>a { - color: #ccc; -} - -.tabs>li[class~="active"], -.tabs>li:hover { - border-bottom: 0.18751rem solid #483d8b; - border-bottom: 0.18751rem solid var(--dark-primary); - color: #ccc; - background-color: #181819; -} - -.cbi-tabmenu>li>a, -.tabs>li>a { - color: #ccc; - - &:hover { - color: #ccc; - } -} - -.cbi-tabmenu>li { - background: #2d2d2d; -} - -.cbi-tabmenu li[class~="cbi-tab"] a { - color: #ccc; -} - -.cbi-tabmenu>li:hover { - color: #ccc; - background: #2d2d2d; -} - -.cbi-tabmenu>li[class~="cbi-tab"] { - background-color: #181819; -} - -.cbi-tabcontainer>.cbi-value:nth-of-type(2n) { - background-color: #252526; -} - -.cbi-value-title { - color: #ccc; -} - -select, -input { - color: #ccc; - background-color: transparent !important; - border: 1px solid #252526; - box-shadow: none; -} - -select:not([multiple="multiple"]):focus, -input:focus { - border-color: #483d8b !important; - border-color: var(--dark-primary) !important; - outline: 0; - -} - -select { - background-color: #1e1e1e !important; -} - -#cbi-dropbear h2, -#cbi-dropbear .cbi-map-descr, -#cbi-dropbear .cbi-map-descr abbr, -#cbi-rc h2, -#cbi-rc .cbi-map-descr, -#cbi-distfeedconf h2, -#cbi-distfeedconf .cbi-map-descr, -#cbi-customfeedconf h2, -#cbi-customfeedconf .cbi-map-descr, -#cbi-download h2, -#cbi-filelist h2 { - color: #ccc !important; -} - -.cbi-value-field>ul>li .ifacebadge { - background-color: #3c3c3c; -} - -.cbi-section-descr { - color: #ccc; -} - -.cbi-input-textarea { - background-color: #1e1e1e; - color: #ccc; -} - - - -.cbi-section-remove:nth-of-type(2n), -.cbi-section-node:nth-of-type(2n) { - background-color: #1e1e1e; -} - -.node-system-packages>.main table tr td:nth-last-child(1) { - color: #ccc; - -} - -.cbi-section-node .cbi-value { - padding: 1rem 1rem 0.3rem 1rem; -} - -.ifacebox { - background-color: none; - border: 1px solid #1e1e1e; -} - -.ifacebox-head { - color: #666; -} - -.ifacebox-body { - background-color: #333; -} - -.zonebadge strong { - color: #333; -} - -.zonebadge>.ifacebadge { - background-color: #3c3c3c; -} - -div.cbi-value var, -td.cbi-value-field var { - color: #5e72e4; -} - -#diag-rc-output>pre { - color: #ccc; - background-color: #1e1e1e; -} - -.node-services-vssr .block { - background-color: #3c3c3c !important; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); -} - -.node-services-vssr .block h4 { - color: #ccc !important; -} - -.node-services-vssr .status-bar { - color: #ccc; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); - background-color: #1e1e1e; -} - -.node-services-vssr .cbi-section-table-row { - color: #ccc; - background-color: #3c3c3c !important; - box-shadow: 0 0 5px 0 rgba(0, 0, 0, .35) -} - -.node-services-vssr .cbi-section-table-row.fast { - background: #483d8b !important; - background: var(--dark-primary) !important; - color: #fff; -} - -.node-services-vssr .ssr-button { - color: #ccc; - -} - -.node-services-vssr .incon:nth-child(2) { - border-right: #1e1e1e 1px solid; -} - -#xhr_poll_status>.label.success { - color: #ccc !important; - - background-color: darkolivegreen !important; -} - -.notice { - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; -} - -.cbi-input-find, -.cbi-input-save, -.cbi-button-add, -.cbi-button-save, -.cbi-button-find, -.cbi-input-reload, -.cbi-button-reload { - color: #fff !important; - background: darkolivegreen !important; - border-color: darkolivegreen !important; -} - -.cbi-button-reset, -.cbi-input-remove { - color: #fff !important; - background-color: darkorange !important; - border-color: darkorange !important; -} - -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit, -.cbi-button-edit.important, -.cbi-button-apply.important, -.cbi-button-reload.important, -.cbi-button-action.important { - border: 1px #483d8b solid !important; - border: 1px var(--dark-primary) solid !important; -} - -.btn[value="Dismiss"], -.cbi-button[value="Terminate"], -.cbi-button[value="Reset"], -.cbi-button[value="Disabled"], -.cbi-button[onclick^="iface_reconnect"], -.cbi-button[onclick="handleReset(event)"], -.cbi-button-neutral[value="Disable"] { - font-weight: normal; - color: #fff; - border: thin solid darkorange !important; - background-color: darkorange !important; -} - -fieldset[id^="cbi-apply-"] { - background-color: #333333; -} - -#detail-bubble>div { - border: 1px solid #ccc; - border-radius: 2px; - padding: 5px; - background: #252525; -} - -.ifacebox-head.active { - background-color: #32325d !important; -} - -header .fill .status span[data-style="active"] { - color: #ccc !important; - background-color: darkolivegreen !important; -} - -#cbi-wireless .td, -#cbi-network .tr:first-child>.td, -.table[width="100%"]>.tr:first-child>.td, -[data-page="admin-network-diagnostics"] .tr>.td, -.tr.table-titles>.th, -.tr.cbi-section-table-titles>.th { - background-color: #252526; - border-bottom: black 1px solid !important; - -} - -.network-status-table .ifacebox-body .ifacebadge { - background-color: #252526; - border-bottom: 0; - box-shadow: none; -} - -td>.ifacebadge, -.td>.ifacebadge { - - background-color: #483d8b; - background-color: var(--dark-primary); - border: 0; -} - -.btn.danger, -.cbi-section-remove>.cbi-button, -.cbi-button-remove, -.cbi-button-reset, -.cbi-button-negative, -.cbi-button[value="Stop"], -.cbi-button[value="Kill"], -.cbi-button[onclick="reboot(this)"], -.cbi-button-neutral[value="Restart"] { - border: thin solid darkorange !important; - background-color: darkorange !important; -} - -.cbi-section, -.cbi-section-error, -#iptables, -.Firewall form, -#cbi-network>.cbi-section-node, -#cbi-wireless>.cbi-section-node, -#cbi-wireless>#wifi_assoclist_table, -[data-tab-title], -[data-page^="admin-system-admin"]:not(.node-main-login) .cbi-map:not(#cbi-dropbear), -[data-page="admin-system-opkg"] #maincontent>.container { - background: #1e1e1e !important; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, 0.35); -} - -div[style="width:100%;height:300px;border:1px solid #000;background:#fff"] { - background: transparent !important; -} - -[data-page="admin-system-admin"] .cbi-map h2, -[data-page="admin-system-admin-password"] .cbi-map h2, -[data-page="admin-system-admin"] .cbi-map .cbi-map-descr, -[data-page="admin-system-admin-password"] .cbi-map .cbi-map-descr { - color: #ccc; -} - -[data-page="admin-system-flash"] { - .modal { - label>input[type="checkbox"] { - top: -0.35rem; - } - - .btn { - white-space: normal !important; - background-color: darkseagreen; - } - - .alert-message { - background-color: transparent !important; - } - - .danger { - border: thin solid darkorange !important; - background-color: darkorange !important; - } - } -} - -.cbi-value input[type="password"]+.cbi-button-neutral { - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; -} - -.btn, -button, -select, -input, -.cbi-dropdown { - border: 1px solid #3c3c3c !important; -} - - -.cbi-dropdown .preview { - color: #ccc; -} - -.cbi-section-table-row { - background-color: #1e1e1e !important; -} - -.modal { - background-color: #1e1e1e; -} - -.cbi-button-positive { - color: #fff !important; - background-color: darkolivegreen !important; -} - -[data-page="admin-system-flash"] legend { - color: #ccc; -} - -.logout:before { - color: #adb5bd !important; -} - -.cbi-dropdown[open] { - border-color: #483d8b !important; - border-color: var(--dark-primary) !important; -} - -.cbi-dropdown[open]>ul.dropdown { - background: #252526 !important; - color: #ccc !important; - box-shadow: none; - border: 1px solid #3c3c3c !important; - - -} - -.cbi-dropdown[open]>ul.dropdown li { - color: #ccc; - border-bottom: 1px solid #3c3c3c !important; -} - -.cbi-dropdown[open]>ul.dropdown>li[selected] { - background-color: #483d8b !important; - background-color: var(--dark-primary) !important; - border-bottom: 1px solid #3c3c3c !important; -} - -.cbi-dropdown[open]>ul.dropdown>li.focus { - background: #483d8b; - background: var(--dark-primary); - outline: none; -} - -.ifacebadge { - background-color: #333333; -} - -.cbi-dynlist>.item>span { - border: 1px solid #3c3c3c !important; -} - -.cbi-page-actions .cbi-button-apply, -.cbi-section-actions .cbi-button-edit, -.cbi-button-edit, -.cbi-button-apply, -.cbi-button-reload, -.cbi-button-action, -.cbi-button[value="Submit"], -.cbi-button[value="Upload"], -.cbi-button[value$="Apply"], -.cbi-button[onclick="addKey(event)"] { - background: #483d8b !important; - background: var(--dark-primary) !important; -} - -.btn.primary, -.cbi-page-actions .cbi-button-save, -.cbi-page-actions .cbi-button-apply+.cbi-button-save, -.cbi-button-add, -.cbi-button-save, -.cbi-button-positive, -.cbi-button-link, -.cbi-button[value="Enable"], -.cbi-button[value="Scan"], -.cbi-button[value^="Back"], -.cbi-button-neutral[onclick="handleConfig(event)"] { - background: #483d8b; - background: var(--dark-primary); -} - -[data-page="admin-system-opkg"] h2 { - color: #ccc !important; -} - - - - -@media screen and (max-width: 480px) { - .node-status-iptables>.main div>.cbi-map>form { - background-color: #1e1e1e; - box-shadow: 0 0 0.5rem 0 rgba(0, 0, 0, .35); - } - - -} diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/fonts.less b/luci-theme-argon/htdocs/luci-static/argon/less/fonts.less deleted file mode 100644 index 71dd0fed7..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/less/fonts.less +++ /dev/null @@ -1,190 +0,0 @@ -// out: false -/** - * Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material and Argon Template - * - * luci-theme-argon - * Copyright 2020 Jerryk - * - * Have a bug? Please create an issue here on GitHub! - * https://github.com/jerrykuku/luci-theme-argon/issues - * - * luci-theme-bootstrap: - * Copyright 2008 Steven Barth - * Copyright 2008 Jo-Philipp Wich - * Copyright 2012 David Menting - * - * MUI: - * https://github.com/muicss/mui - * - * luci-theme-material: - * https://github.com/LuttyYang/luci-theme-material/ - * - * Agron Theme - * https://demos.creative-tim.com/argon-dashboard/index.html - * - * Login background - * https://unsplash.com/ - * - * Licensed to the public under the Apache License 2.0 - */ - - - @font-face { - font-family: 'Google Sans'; - src: url('data:application/font-woff2;charset=utf-8;base64,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') format('woff2'), - url('data:application/font-woff;charset=utf-8;base64,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') format('woff'); - font-weight: normal; - font-style: normal; -} - -/* Logo Font */ -@font-face { - font-family: 'TypoGraphica'; - src: url('../fonts/TypoGraphica.eot?#iefix') format('embedded-opentype'), - url('../fonts/TypoGraphica.woff') format('woff'), - url('../fonts/TypoGraphica.ttf') format('truetype'), - url('../fonts/TypoGraphica.svg#TypoGraphica') format('svg'); - font-weight: normal; - font-style: normal; -} - -/* ICON Font */ - -@font-face { - font-family: 'argon'; - src: url('../fonts/argon.eot?u6kthm'); - src: url('../fonts/argon.eot?u6kthm#iefix') format('embedded-opentype'), - url('../fonts/argon.ttf?u6kthm') format('truetype'), - url('../fonts/argon.woff?u6kthm') format('woff'), - url('../fonts/argon.svg?u6kthm#argon') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; -} - -[class^="icon-"], -[class*=" icon-"] { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'argon' !important; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-expand_more:before { - content: "\e20b"; -} - -.icon-menu:before { - content: "\e20e"; -} - -.icon-favorite:before { - content: "\e291"; -} - -.icon-spinner:before { - content: "\e603"; -} - -.icon-delete:before { - content: "\e900"; -} - -.icon-edit:before { - content: "\e901"; -} - -.icon-use:before { - content: "\e902"; -} - -.icon-loading:before { - content: "\e903"; -} - -.icon-switch:before { - content: "\e904"; -} - -.icon-error:before { - content: "\e905"; -} - -.icon-dashboard:before { - content: "\e906"; -} - -.icon-logout:before { - content: "\e907"; -} - -.icon-Network:before { - content: "\e908"; -} - -.icon-services:before { - content: "\e909"; -} - -.icon-system:before { - content: "\e90a"; -} - -.icon-vpn:before { - content: "\e90b"; -} - -.icon-storage:before { - content: "\e90c"; -} - -.icon-statistics:before { - content: "\e90d"; -} - -.icon-hello-world:before { - content: "\e90e"; -} - -.icon-angle-right:before { - content: "\e90f"; -} - -.icon-password:before { - content: "\e910"; -} - -.icon-user:before { - content: "\e971"; -} - -.icon-question:before { - content: "\f059"; -} - -.icon-docker:before { - content: "\e911"; -} - -.icon-control:before { - content: "\e912"; -} - -.icon-statistics1:before { - content: "\e913"; -} - -.icon-asterisk:before { - content: "\e914"; -} - -.icon-app:before { - content: "\e915"; -} \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less b/luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less deleted file mode 100644 index 040c34a1f..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/less/pure-min.less +++ /dev/null @@ -1,12 +0,0 @@ -// out: false -/*! -Pure v2.0.3 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE.md -*/ -/*! -normalize.css v | MIT License | git.io/normalize -Copyright (c) Nicolas Gallagher and Jonathan Neal -*/ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto}.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}.pure-button{display:inline-block;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-.43em}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:rgba(0,0,0,.8);border:none transparent;background-color:#e6e6e6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:focus,.pure-button:hover{background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000}.pure-button-disabled,.pure-button-disabled:active,.pure-button-disabled:focus,.pure-button-disabled:hover,.pure-button[disabled]{border:none;background-image:none;opacity:.4;cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{margin:0;border-radius:0;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=color]:focus,.pure-form input[type=date]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=email]:focus,.pure-form input[type=month]:focus,.pure-form input[type=number]:focus,.pure-form input[type=password]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=text]:focus,.pure-form input[type=time]:focus,.pure-form input[type=url]:focus,.pure-form input[type=week]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129fea}.pure-form input:not([type]):focus{outline:0;border-color:#129fea}.pure-form input[type=checkbox]:focus,.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus{outline:thin solid #129fea;outline:1px auto #129fea}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=color][disabled],.pure-form input[type=date][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=email][disabled],.pure-form input[type=month][disabled],.pure-form input[type=number][disabled],.pure-form input[type=password][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=text][disabled],.pure-form input[type=time][disabled],.pure-form input[type=url][disabled],.pure-form input[type=week][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form select:focus:invalid,.pure-form textarea:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=checkbox]:focus:invalid:focus,.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=color],.pure-form-stacked input[type=date],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=email],.pure-form-stacked input[type=file],.pure-form-stacked input[type=month],.pure-form-stacked input[type=number],.pure-form-stacked input[type=password],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=text],.pure-form-stacked input[type=time],.pure-form-stacked input[type=url],.pure-form-stacked input[type=week],.pure-form-stacked label,.pure-form-stacked select,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned select,.pure-form-aligned textarea,.pure-form-message-inline{display:inline-block;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form .pure-input-rounded,.pure-form input.pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=color],.pure-group input[type=date],.pure-group input[type=datetime-local],.pure-group input[type=datetime],.pure-group input[type=email],.pure-group input[type=month],.pure-group input[type=number],.pure-group input[type=password],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=text],.pure-group input[type=time],.pure-group input[type=url],.pure-group input[type=week]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0 0}.pure-form-message,.pure-form-message-inline{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-active>.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected>.pure-menu-link,.pure-menu-selected>.pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} diff --git a/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js b/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js deleted file mode 100644 index cc8678f17..000000000 --- a/luci-theme-argon/htdocs/luci-static/resources/menu-argon.js +++ /dev/null @@ -1,158 +0,0 @@ -'use strict'; -'require baseclass'; -'require ui'; - -return baseclass.extend({ - __init__: function () { - ui.menu.load().then(L.bind(this.render, this)); - }, - - render: function (tree) { - var node = tree, - url = '', - children = ui.menu.getChildren(tree); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0); - - if (isActive) - this.renderMainMenu(children[i], children[i].name); - } - - if (L.env.dispatchpath.length >= 3) { - for (var i = 0; i < 3 && node; i++) { - node = node.children[L.env.dispatchpath[i]]; - url = url + (url ? '/' : '') + L.env.dispatchpath[i]; - } - - if (node) - this.renderTabMenu(node, url); - } - - document.querySelector('a.showSide') - .addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); - document.querySelector('.darkMask') - .addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle')); - }, - - handleMenuExpand: function (ev) { - var a = ev.target, slide = a.parentNode, slide_menu = a.nextElementSibling; - var collapse = false; - - document.querySelectorAll('.main .main-left .nav > li >ul.active').forEach(function (ul) { - $(ul).stop(true).slideUp("fast", function () { - ul.classList.remove('active'); - ul.previousElementSibling.classList.remove('active'); - }); - if (!collapse && ul === slide_menu) { - collapse = true; - } - - }); - - if (!slide_menu) - return; - - - if (!collapse) { - $(slide).find(".slide-menu").slideDown("fast",function(){ - slide_menu.classList.add('active'); - a.classList.add('active'); - }); - a.blur(); - } - ev.preventDefault(); - ev.stopPropagation(); - }, - - renderMainMenu: function (tree, url, level) { - var l = (level || 0) + 1, - ul = E('ul', { 'class': level ? 'slide-menu' : 'nav' }), - children = ui.menu.getChildren(tree); - - if (children.length == 0 || l > 2) - return E([]); - - for (var i = 0; i < children.length; i++) { - var isActive = ((L.env.dispatchpath[l] == children[i].name) && (L.env.dispatchpath[l - 1] == tree.name)), - submenu = this.renderMainMenu(children[i], url + '/' + children[i].name, l), - hasChildren = submenu.children.length, - slideClass = hasChildren ? 'slide' : null, - menuClass = hasChildren ? 'menu' : null; - if (isActive) { - ul.classList.add('active'); - slideClass += " active"; - menuClass += " active"; - } - - ul.appendChild(E('li', { 'class': slideClass }, [ - E('a', { - 'href': L.url(url, children[i].name), - 'click': (l == 1) ? ui.createHandlerFn(this, 'handleMenuExpand') : null, - 'class': menuClass, - 'data-title': hasChildren ? children[i].title.replace(" ", "_") : children[i].title.replace(" ", "_"), - }, [_(children[i].title)]), - submenu - ])); - } - - if (l == 1) { - document.querySelector('#mainmenu').appendChild(ul); - document.querySelector('#mainmenu').style.display = ''; - - } - return ul; - }, - - renderTabMenu: function (tree, url, level) { - var container = document.querySelector('#tabmenu'), - l = (level || 0) + 1, - ul = E('ul', { 'class': 'tabs' }), - children = ui.menu.getChildren(tree), - activeNode = null; - - if (children.length == 0) - return E([]); - - for (var i = 0; i < children.length; i++) { - var isActive = (L.env.dispatchpath[l + 2] == children[i].name), - activeClass = isActive ? ' active' : '', - className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass); - - ul.appendChild(E('li', { 'class': className }, [ - E('a', { 'href': L.url(url, children[i].name) }, [_(children[i].title)]) - ])); - - if (isActive) - activeNode = children[i]; - } - - container.appendChild(ul); - container.style.display = ''; - - if (activeNode) - container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l)); - - return ul; - }, - - handleSidebarToggle: function (ev) { - var showside = document.querySelector('a.showSide'), - sidebar = document.querySelector('#mainmenu'), - darkmask = document.querySelector('.darkMask'), - scrollbar = document.querySelector('.main-right'); - - if (showside.classList.contains('active')) { - showside.classList.remove('active'); - sidebar.classList.remove('active'); - scrollbar.classList.remove('active'); - darkmask.classList.remove('active'); - } - else { - showside.classList.add('active'); - sidebar.classList.add('active'); - scrollbar.classList.add('active'); - darkmask.classList.add('active'); - } - } -}); diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer.htm b/luci-theme-argon/luasrc/view/themes/argon/footer.htm deleted file mode 100755 index 085f6e76f..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/footer.htm +++ /dev/null @@ -1,46 +0,0 @@ -<%# - Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template - - luci-theme-argon - Copyright 2020 Jerrykuku - - Have a bug? Please create an issue here on GitHub! - https://github.com/jerrykuku/luci-theme-argon/issues - - luci-theme-material: - Copyright 2015 Lutty Yang - - Agron Theme - https://demos.creative-tim.com/argon-dashboard/index.html - - Licensed to the public under the Apache License 2.0 --%> - -<% local ver = require "luci.version" %> -

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�$dl3gH)Q&OCfV6T};Oqr8= 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 J%do#+{vV8|Vut_# diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/blank.png b/luci-theme-argon/htdocs/luci-static/argon/img/blank.png deleted file mode 100644 index 9f4100e6e2ea2fa08912439eb7425af3f048eedd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938 zcmaJ=L66cv6t0pOLtGQRxu;1t8cn3rmX@UxDuEV+#1g`iEC&ykc7V#ZQ`^B74o1E0 z!9@RtCjJ4Vo;`W;;-Byjn5vqfmTeG-$ z^$PpHk-vXt%Pra((IYaUi5+3C;gT^1UEiMK0k+-cvv0V@afLhHa70JeBjgZYurrL1 z`XOU;T&;m#;qnwG=S{ zA5$Bo{z(v{ROi>ah{f44|Y zg;KdBRgfYgSq7VrXW1fmf(B-LlZ)+ienx4CAWV`(NXi0_9I4~G;sIW3tW=K z_tqTCLfs&ycHrQysq;)l@H`ilE0WPRn-#+l6-jC}G^uPDimIwwvsqP|M$R>fv+!|1 zbFO>AJ>1F7#=#F+W)nx=bL_Sw;)8YB$lL8j*{QeTy1TuoJGqdVf!XE$b=mn5o1iS* zjxO75haU%Q;v+WNFFxG9&Ys17*K7>apX1+WXZ3>g^7K_leE${|FI~RI{kU1U@$}2P Q$Jy)YwtD8r=9AZd04Jv&d;kCd diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg deleted file mode 100644 index f01ad5c79..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg deleted file mode 100644 index 0598d584e..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js deleted file mode 100644 index b0614034a..000000000 --- a/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="

- -
-
- - - - diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm deleted file mode 100644 index 8098df211..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm +++ /dev/null @@ -1,44 +0,0 @@ -<%# - Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template - - luci-theme-argon - Copyright 2020 Jerrykuku - - Have a bug? Please create an issue here on GitHub! - https://github.com/jerrykuku/luci-theme-argon/issues - - luci-theme-material: - Copyright 2015 Lutty Yang - - Agron Theme - https://demos.creative-tim.com/argon-dashboard/index.html - - Licensed to the public under the Apache License 2.0 --%> - -<% local ver = require "luci.version" %> -
- - - - - - diff --git a/luci-theme-argon/luasrc/view/themes/argon/header.htm b/luci-theme-argon/luasrc/view/themes/argon/header.htm deleted file mode 100644 index 17717ff65..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/header.htm +++ /dev/null @@ -1,180 +0,0 @@ -<%# - Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template - - luci-theme-argon - Copyright 2020 Jerrykuku - - Have a bug? Please create an issue here on GitHub! - https://github.com/jerrykuku/luci-theme-argon/issues - - luci-theme-material: - Copyright 2015 Lutty Yang - - Argon Theme - https://demos.creative-tim.com/argon-dashboard/index.html - - Licensed to the public under the Apache License 2.0 --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - local ver = require "luci.version" - - local boardinfo = util.ubus("system", "board") - - local node = disp.context.dispatched - - local fs = require "nixio.fs" - local nutil = require "nixio.util" - local uci = require 'luci.model.uci'.cursor() - - -- send as HTML5 - http.prepare_content("text/html") - - math.randomseed(os.time()) - - -- Custom settings - local mode = 'normal' - local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css') - local bar_color = '#5e72e4' - local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity - if fs.access('/etc/config/argon') then - primary = uci:get_first('argon', 'global', 'primary') - dark_primary = uci:get_first('argon', 'global', 'dark_primary') - blur_radius = uci:get_first('argon', 'global', 'blur') - blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') - blur_opacity = uci:get_first('argon', 'global', 'transparency') - blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') - mode = uci:get_first('argon', 'global', 'mode') - bar_color = mode == 'dark' and dark_primary or primary - end - - -- Brand name - local brand_name = boardinfo.hostname or "?" --%> - - - - - - - <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - - LuCI - - - - - - - - - - - - LuCI"> - - LuCI"> - - - - - - - - - - - - - - - <% if node and node.css then %> - - <% end -%> - <% if css then %> - - <% end -%> - - - - - - - -"> - -
- -
-
-
-
- -
-
-
-
-
-
-
- <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> -
-

<%:No password set!%>

-

<%:There is no password set on this router. Please configure a root password to protect the web interface.%> -

- <% if disp.lookup("admin/system/admin") then %> - - <% end %> -
- <%- end -%> - - - - diff --git a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm deleted file mode 100644 index 568e0cecb..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm +++ /dev/null @@ -1,119 +0,0 @@ -<%# - Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template - - luci-theme-argon - Copyright 2020 Jerrykuku - - Have a bug? Please create an issue here on GitHub! - https://github.com/jerrykuku/luci-theme-argon/issues - - luci-theme-material: - Copyright 2015 Lutty Yang - - Argon Theme - https://demos.creative-tim.com/argon-dashboard/index.html - - Licensed to the public under the Apache License 2.0 --%> - -<% - local sys = require "luci.sys" - local util = require "luci.util" - local http = require "luci.http" - local disp = require "luci.dispatcher" - local ver = require "luci.version" - - local boardinfo = util.ubus("system", "board") - - local node = disp.context.dispatched - - local fs = require "nixio.fs" - local nutil = require "nixio.util" - local uci = require 'luci.model.uci'.cursor() - - -- send as HTML5 - http.prepare_content("text/html") - - math.randomseed(tonumber(tostring(os.time()):reverse():sub(1, 9))) - - -- Custom settings - local mode = 'normal' - local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css') - local bar_color = '#5e72e4' - local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity - if fs.access('/etc/config/argon') then - primary = uci:get_first('argon', 'global', 'primary') - dark_primary = uci:get_first('argon', 'global', 'dark_primary') - blur_radius = uci:get_first('argon', 'global', 'blur') - blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') - blur_opacity = uci:get_first('argon', 'global', 'transparency') - blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') - mode = uci:get_first('argon', 'global', 'mode') - bar_color = mode == 'dark' and dark_primary or primary - end --%> - - - - - - - <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - - LuCI - - - - - - - - - - - - LuCI"> - - LuCI"> - - - - - - - - - - - - - - - <% if node and node.css then %> - - <% end -%> - <% if css then %> - - <% end -%> - - - - - diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm deleted file mode 100644 index 398314779..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm +++ /dev/null @@ -1,27 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2019 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - local is_rollback_pending, rollback_time_remaining, rollback_session, rollback_token = luci.model.uci:rollback_pending() - - if is_rollback_pending or trigger_apply or trigger_revert then -%> - -<% - end - - include("themes/" .. theme .. "/footer_login") -%> diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm deleted file mode 100644 index 35e73ec46..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm +++ /dev/null @@ -1,14 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008-2019 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% - local ver = require "luci.version" - - if not luci.dispatcher.context.template_header_sent then - include("themes/" .. theme .. "/header_login") - luci.dispatcher.context.template_header_sent = true - end -%> diff --git a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm deleted file mode 100644 index 5b46f2fa3..000000000 --- a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm +++ /dev/null @@ -1,186 +0,0 @@ -<%# - Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template - - luci-theme-argon - Copyright 2020 Jerryk - - Have a bug? Please create an issue here on GitHub! - https://github.com/jerrykuku/luci-theme-argon/issues - - luci-theme-bootstrap: - Copyright 2008 Steven Barth - Copyright 2008-2016 Jo-Philipp Wich - Copyright 2012 David Menting - - MUI: - https://github.com/muicss/mui - - Argon Theme - https://demos.creative-tim.com/argon-dashboard/index.html - - Licensed to the public under the Apache License 2.0 --%> - -<%+themes/argon/out_header_login%> -<% - local util = require "luci.util" - local fs = require "nixio.fs" - local nutil = require "nixio.util" - local json = require "luci.jsonc" - local sys = require "luci.sys" - local uci = require 'luci.model.uci'.cursor() - - -- Fetch Local Background Media - - local function glob(...) - local iter, code, msg = fs.glob(...) - if iter then - return nutil.consume(iter) - else - return nil, code, msg - end - end - - - local imageTypes = " jpg png gif " - local videoTypes = " mp4 webm " - local allTypes = imageTypes .. videoTypes - local function fetchMedia(path,themeDir) - local backgroundTable = {} - local backgroundCount = 0 - for i, f in ipairs(glob(path)) do - attr = fs.stat(f) - if attr then - local ext = fs.basename(f):match(".+%.(%w+)$") - if ext ~= nil then - ext = ext:lower() - end - if ext ~= nil and string.match(allTypes, " "..ext.." ") ~= nil then - local bg = {} - bg.type = ext - bg.url = themeDir .. fs.basename(f) - table.insert(backgroundTable,bg) - backgroundCount = backgroundCount + 1 - end - end - end - return backgroundTable,backgroundCount - end - local function selectBackground(themeDir) - local bgUrl = media .. "/img/bg1.jpg" - local backgroundType = "Image" - local mimeType = "" - - if fs.access("/etc/config/argon") then - if uci:get_first('argon', 'global', 'bing_background') == "1" then - local bing = sys.exec("/usr/libexec/argon/bing_wallpaper") - if (bing and bing ~= '') then - return bing, "Image", "" - end - end - end - - local backgroundTable, backgroundCount = fetchMedia("/www" .. themeDir .. "*",themeDir) - if ( backgroundCount > 0 ) then - local currentBg = backgroundTable[math.random(1,backgroundCount)] - bgUrl = currentBg.url - if (string.match(videoTypes, " "..currentBg.type.." ") ~= nil) then - backgroundType = "Video" - mimeType = "video/" .. currentBg.type - end - end - - return bgUrl,backgroundType,mimeType - end - - local boardinfo = util.ubus("system", "board") - local themeDir = media .. "/background/" - local bgUrl,backgroundType,mimeType = selectBackground(themeDir) -%> - - + + + + diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm new file mode 100755 index 000000000..8098df211 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm @@ -0,0 +1,44 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Agron Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% local ver = require "luci.version" %> +
+ +
+
+ + + diff --git a/luci-theme-argon/luasrc/view/themes/argon/header.htm b/luci-theme-argon/luasrc/view/themes/argon/header.htm new file mode 100755 index 000000000..17717ff65 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/header.htm @@ -0,0 +1,180 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local ver = require "luci.version" + + local boardinfo = util.ubus("system", "board") + + local node = disp.context.dispatched + + local fs = require "nixio.fs" + local nutil = require "nixio.util" + local uci = require 'luci.model.uci'.cursor() + + -- send as HTML5 + http.prepare_content("text/html") + + math.randomseed(os.time()) + + -- Custom settings + local mode = 'normal' + local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css') + local bar_color = '#5e72e4' + local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity + if fs.access('/etc/config/argon') then + primary = uci:get_first('argon', 'global', 'primary') + dark_primary = uci:get_first('argon', 'global', 'dark_primary') + blur_radius = uci:get_first('argon', 'global', 'blur') + blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') + blur_opacity = uci:get_first('argon', 'global', 'transparency') + blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') + mode = uci:get_first('argon', 'global', 'mode') + bar_color = mode == 'dark' and dark_primary or primary + end + + -- Brand name + local brand_name = boardinfo.hostname or "?" +-%> + + + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> + - LuCI + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + + + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + + + +"> + +
+ +
+
+
+
+ +
+
+
+
+
+
+
+ <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> +
+

<%:No password set!%>

+

<%:There is no password set on this router. Please configure a root password to protect the web interface.%> +

+ <% if disp.lookup("admin/system/admin") then %> + + <% end %> +
+ <%- end -%> + + + + diff --git a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm new file mode 100755 index 000000000..568e0cecb --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm @@ -0,0 +1,119 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template + + luci-theme-argon + Copyright 2020 Jerrykuku + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-material: + Copyright 2015 Lutty Yang + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<% + local sys = require "luci.sys" + local util = require "luci.util" + local http = require "luci.http" + local disp = require "luci.dispatcher" + local ver = require "luci.version" + + local boardinfo = util.ubus("system", "board") + + local node = disp.context.dispatched + + local fs = require "nixio.fs" + local nutil = require "nixio.util" + local uci = require 'luci.model.uci'.cursor() + + -- send as HTML5 + http.prepare_content("text/html") + + math.randomseed(tonumber(tostring(os.time()):reverse():sub(1, 9))) + + -- Custom settings + local mode = 'normal' + local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css') + local bar_color = '#5e72e4' + local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity + if fs.access('/etc/config/argon') then + primary = uci:get_first('argon', 'global', 'primary') + dark_primary = uci:get_first('argon', 'global', 'dark_primary') + blur_radius = uci:get_first('argon', 'global', 'blur') + blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark') + blur_opacity = uci:get_first('argon', 'global', 'transparency') + blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark') + mode = uci:get_first('argon', 'global', 'mode') + bar_color = mode == 'dark' and dark_primary or primary + end +-%> + + + + + + + <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> + - LuCI + + + + + + + + + + + - LuCI"> + - LuCI"> + + + + + + + + + + + + + + + <% if node and node.css then %> + + <% end -%> + <% if css then %> + + <% end -%> + + + + + diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm new file mode 100755 index 000000000..398314779 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm @@ -0,0 +1,27 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008-2019 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% + local is_rollback_pending, rollback_time_remaining, rollback_session, rollback_token = luci.model.uci:rollback_pending() + + if is_rollback_pending or trigger_apply or trigger_revert then +%> + +<% + end + + include("themes/" .. theme .. "/footer_login") +%> diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm new file mode 100755 index 000000000..35e73ec46 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm @@ -0,0 +1,14 @@ +<%# + Copyright 2008 Steven Barth + Copyright 2008-2019 Jo-Philipp Wich + Licensed to the public under the Apache License 2.0. +-%> + +<% + local ver = require "luci.version" + + if not luci.dispatcher.context.template_header_sent then + include("themes/" .. theme .. "/header_login") + luci.dispatcher.context.template_header_sent = true + end +%> diff --git a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm new file mode 100755 index 000000000..5b46f2fa3 --- /dev/null +++ b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm @@ -0,0 +1,186 @@ +<%# + Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI and Argon Template + + luci-theme-argon + Copyright 2020 Jerryk + + Have a bug? Please create an issue here on GitHub! + https://github.com/jerrykuku/luci-theme-argon/issues + + luci-theme-bootstrap: + Copyright 2008 Steven Barth + Copyright 2008-2016 Jo-Philipp Wich + Copyright 2012 David Menting + + MUI: + https://github.com/muicss/mui + + Argon Theme + https://demos.creative-tim.com/argon-dashboard/index.html + + Licensed to the public under the Apache License 2.0 +-%> + +<%+themes/argon/out_header_login%> +<% + local util = require "luci.util" + local fs = require "nixio.fs" + local nutil = require "nixio.util" + local json = require "luci.jsonc" + local sys = require "luci.sys" + local uci = require 'luci.model.uci'.cursor() + + -- Fetch Local Background Media + + local function glob(...) + local iter, code, msg = fs.glob(...) + if iter then + return nutil.consume(iter) + else + return nil, code, msg + end + end + + + local imageTypes = " jpg png gif " + local videoTypes = " mp4 webm " + local allTypes = imageTypes .. videoTypes + local function fetchMedia(path,themeDir) + local backgroundTable = {} + local backgroundCount = 0 + for i, f in ipairs(glob(path)) do + attr = fs.stat(f) + if attr then + local ext = fs.basename(f):match(".+%.(%w+)$") + if ext ~= nil then + ext = ext:lower() + end + if ext ~= nil and string.match(allTypes, " "..ext.." ") ~= nil then + local bg = {} + bg.type = ext + bg.url = themeDir .. fs.basename(f) + table.insert(backgroundTable,bg) + backgroundCount = backgroundCount + 1 + end + end + end + return backgroundTable,backgroundCount + end + local function selectBackground(themeDir) + local bgUrl = media .. "/img/bg1.jpg" + local backgroundType = "Image" + local mimeType = "" + + if fs.access("/etc/config/argon") then + if uci:get_first('argon', 'global', 'bing_background') == "1" then + local bing = sys.exec("/usr/libexec/argon/bing_wallpaper") + if (bing and bing ~= '') then + return bing, "Image", "" + end + end + end + + local backgroundTable, backgroundCount = fetchMedia("/www" .. themeDir .. "*",themeDir) + if ( backgroundCount > 0 ) then + local currentBg = backgroundTable[math.random(1,backgroundCount)] + bgUrl = currentBg.url + if (string.match(videoTypes, " "..currentBg.type.." ") ~= nil) then + backgroundType = "Video" + mimeType = "video/" .. currentBg.type + end + end + + return bgUrl,backgroundType,mimeType + end + + local boardinfo = util.ubus("system", "board") + local themeDir = media .. "/background/" + local bgUrl,backgroundType,mimeType = selectBackground(themeDir) +%> + +